uniform机器学习极简入门3—KMeans

1 kmeans算法概述

往往在实际数据分析中,我们需要发现数据的一些内在规律,但是数据一般都是未标注,因此希望通过某个算法来揭示数据的内在性质和规律,其中最常用的算法就是聚类。

kmeans就是聚类算法中最常用的一种,是无监督的算法,目标是通过数据分布来发现其中存在的类簇。
如下图,我们可以直观的看出数据可能存在两个类簇,但是如何通过算法来发现?

kmeans1

2 kmeans算法流程

我们的目标就是希望找到类别的中心使得类内点到中心的距离尽可能近,这个距离可以表示如下:
E = \sum_{i=1}^{k}\sum_{x^{(j)}\in{C_i}}||x^{(j)}-c_i||^2 \ \ \ \ (1)
目标就是最小化E,但是这是个NP问题,kmeans采用贪心算法来迭代找到最优。

kmeans的大致算法思想如下

  1. 先假设数据可以分为k类
  2. 随机从数据集中选择k个点作为中心点
  3. 分别计算所有点与这k个中心点的距离,选择最近的中心点所在的类别作为类别标签,这样就把所有点都分配了类标
  4. 然后根据k个类别的样本重新计算各个类别的中心点,得到新的k个类中心点。
  5. 重复步骤3、步骤4,直至中心点不再发生改变,结束。

这是一个循环迭代的过程,通过反复迭代直至找到中心点。看起来比较简单,但其实背后有很多需要注意的地方。

2.1 k值选择

公式(1)很直观,只要能够最小化E即可,但是k是一个超参数(不是通过数据迭代得来,是我们初始化指定),我们发现,

  1. 如果k选择越大,那么这个E可以最小化到0,即如果类别十分细,细到每个样本作为一个单独的类,那么E=0,但这不是我们希望看到的。
  2. 如果k选择较小,那么类别较粗,可能类内的距离就比较大。

因此如何选择k将直接影响聚类的结果。
我们做个直观的图,还是最开始的数据图,我们可以发现E和k的关系如下:


k_E_relation
  • 基于曲率判断
    有种确定k的方法,即看上图中曲率变化最大的点,我们可以看到k=2的时候曲率变化最大,那么最优的k应该就选2。

2.2 初始中心点选择

初始中心点的选择如果不当,可能会陷入局部最优的。
下面列种改进方法
kmeans++

  1. 初始化中心点集合:C = {}
  2. 从输入的数据点集合中随机选择一个点c_k作为中心点,加入到中心点集合C= C +c_k
  3. 数据集中每个点x计算与中心点集合中最近的中心点的距离d(x)
  4. 在d(x)中选择距离较大的点作为新的中心点,加入到中心点集合
  5. 重复步骤2、步骤3、步骤4,直至找到k个中心点,然后再采用kmeans算法来进行聚类。

另一种确定中心点的方法就是通过层次聚类或者Canopy方法先得到k个类别,把他们的中心点作为初始化中心点。

2.3 距离度量

既然涉及到空间距离,自然离不开距离度量函数的定义,这点往往容易被忽视,我们在实际实践中,默认采用都是欧式距离来表示,但是这个距离合理性的前提是我们的特征向量表征一定也是符合欧式空间特征才行,否则出来的结果会较差。

距离定义首先需要满足一些基本性质:

非负性: d(x, y)>=0
同一性:d(x, y)=0 当且仅当x=y
对称性:x(x, y)=d(y, x)
直递性(三角不等式):d(x, y)<=d(x,z) + d(z, y)

  • 闵可夫斯基距离
    我们常用的就是闵可夫斯基距离
    d(x, y) = [\sum_{i=1}^{n}(x_i-y_i)^p]^{\frac{1}{p}}
    x=(x_1, x_2, ..., x_n)
    y=(y_1, y_2, ..., y_n)

当p=1,表示曼哈顿距离
当p=2,表示欧式距离

但是,在实践中,我们的特征向量未必都是连续性变量,上述距离度量函数使用与连续变量空间,对于离散变量,一般采用其他的方法来衡量距离,例如VDM。
另外我们常用的距离衡量还有余弦距离等,这里推荐一个python库,支持较多的距离衡量

Biopython为k-means聚类提供了各种距离函数,包括余弦距离、皮尔逊相似度量、欧式距离等。

3 kmeans算法不足

  • kmeans算法由于距离度量采用的是点-点的距离,对于球状的空间分布是可以正确聚类的,但是非球状的则无法正确聚类,解决方案一般是通过特征变换来达到高维空间或者另一个特征空间的可分(可聚类)


    ball_cluster
  • 如果特征空间高维,数据量较大,kmeans运算速度较慢

4 二分k-means算法

层次聚类算法是从底向上,逐步聚类,而二分kmeans算法则是从顶向下,逐步分裂,最终得到我们要的k个类。
算法描述如下

  1. 先将整个样本集合作为一个簇,该簇中心点即等于所有向量平均,计算此时的SSE(公式1)
  2. 对每个类簇都进行二分类(采用kmeans算法),然后计算拆分后的总的SSE,选择变化最大的那个分类簇进行二分裂
  3. 重复上述步骤,直至类别数等于k,结束。

这个分类算法有点类似决策树的分裂思想,在决策树分裂的过程中,我们希望的是找到熵减少(熵增益)最大的特征分裂点,而这里是找到SSE减少最大的类别。分类算法和聚类算法目标都是希望能够找到让类内样本越纯的方法。后续我们讲到决策树的时候会再阐开这块内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341