第10章 利用k均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归为同一个簇中。之所以成为k均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。

聚类分析视图将相似对象归入同一簇,将不相似对象归到不同簇。相似这一概念取决于所选择的相似度计算方法。前面介绍的各种相似度计算方法后面还会出现,而到底用那种相似度方法取决于具体应用。

下面我们会构建k均值方法并观察期实际效果,然后讨论简单k均值算法中的缺陷。为了解决其中的一些缺陷,可以通过后处理来产生更好的簇。接着会给出一个更有效的称为二分k均值的聚类算法。最后给出一个实例应用。

10.1  k均值聚类算法

k均值是发现给定数据集的k个簇的算法。簇的个数k是用户给定的,每个簇通过其质心,即簇中所有点的质心来描述。

k均值算法的工作流程:首先,随机确定k个初始点为质心。然后将数据集的每个点分配到一个簇,具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇,这一步完成之后,每个簇的质心更新为该簇所有点的均值。

求与某数据点最近的质心意味着要进行某种距离计算,这里使用的是欧氏距离。此外,初始的k个随机质心需要在整个数据集边界范围之内。对数据集进行画图如下:


不同大小红点代表不同簇,蓝点代表各簇的质心(testSet.txt文件)

PS:画个图也费我老半天时间额~郁闷~

算法主要就是计算质心-分配-重新计算,不断迭代,直到所有数据点的簇分配结果不再改变为止。最后算法返回两个矩阵:centroids有k行n列,用来装质心数据,k行表示k个质心,n行表示质心数据维度。clusterAssment有m行2列,m行对应数据集中m个数据点,第一列记录该数据点所在簇索引值,第二列记录该数据点与所在簇质心的距离,即存储误差。

PS:python神操作:数组b赋值给矩阵a,则a成了数组类型并得到相应的值。而数组b赋给矩阵a的某一列后,数据a还是矩阵,并得到了b的对应值。此外,数组可以与某一个数加减乘除,结果是数组的对应元素与这个值加减乘除。最后,random.rang(m,n)生成m行n列数组,数组元素是0到1之间的随机数。

10.2 使用后处理来提高聚类性能

在k均值聚类中簇的数目k是一个用户预先定义好的参数,而用户并不知道该设置成多少为最好。在包含簇结果的矩阵中保存着每个点的误差,即该点到簇质心的距离平方值。下面我们可以用该误差来评价聚类质量的方法。

k均值算法收敛但聚类效果较差的原因:k均值算法收敛到局部最小值,而不是全局最小值。

一种用于度量聚类效果的指标是SSE(误差平方和),即clusterAssment矩阵的第一列之和,SSE值越小表示数据越接近它们的质心,聚类效果也越好。一种肯定可以降低SSE值的方法是增加簇的个数,但是这违背了聚类的目标,聚类的目标是在保持簇不变的情况下提高簇的质量。

所以,我们应该对簇进行后处理,一种方法是将具有最大SSE的簇划分成两个簇,具体实现就是将最大簇包含的点过滤出来,然后再这些点上运行k均值算法,k设为2。而为了保持簇的总数不变,可以将某两个簇合并,那么又该按照什么依据合并呢?

有两种量化办法:第一种,合并最近的质心,即计算所有质心之间的距离,然后合并最近的两个质心。第二种,合并两个使得SSE增幅最小的质心,即合并两个簇然后算总SSE值,这需要在所有可能的两个簇上重复上述操作,知道找到合并最佳的簇为止。

10.3  二分k均值算法

为了克服k均值算法收敛于局部最小值的问题,有人提出了二分k均值算法,该算法首先将所有点作为一个簇,然后将该簇一分为二,之后选择其中一个簇继续一分为二,选择哪个簇取决于对其划分是否可以最大程度降低SSE的值。上述划分过程不断重复,直到得到用户指定的簇数为止。

另一种做法是选择SSE最大的簇进行划分,直到簇的数目达到用户指定的数目为止。

下面的操作是对第一种方法的实现,即划分依据是降低划分后总的SSE值。代码思路很简单,就是对所有的簇都进行k均值划分,然后计算总SSE值,找到能使SSE值最小的划分簇,将其划分,将被划分簇的质心矩阵和误差矩阵加入总数据集的质心矩阵和误差矩阵,直到簇的个数满足用户指定的参数。

下面给出用二分k均值算法进行划分后的结果图:


不同大小红点代表不同簇,蓝点代表各簇的质心(testSet.txt文件)

此次划分用的数据与上一张图一样,只是方法不同:前面用的是k均值聚类算法,初始质心是随机选取的,划分后得到的效果并不好,这从图上就能看出来。而这里用的是二分k均值算法,是从一个簇不断划分而来,划分结果明显比上一张好些。

下面我又用二分k均值聚类算法在另一个数据集做了划分,结果如下:


不同大小红点代表不同簇,蓝点代表各簇的质心(testSet2.txt文件)

划分结果~外瑞固的~

10.4  本章小结

聚类是一种无监督学习方法。所谓无监督学习方法,就是事先不知道要寻找的内容,即没有目标向量。聚类将数据点归到多个簇中,其中相似的点处于同一个簇,而不相似的点处于不同的簇中。聚类可以使用多种不同的方法来计算相似度。

一种广泛使用的聚类方法是k均值算法,其中k是用户指定的要创建的簇的数目。k均值聚类算法以k个随机质心开始。算法会计算每个点到质心的距离。每个点会分配到距其最近的簇质心,然后紧接着基于新分配到簇的点更新簇质心。以上过程重复数次,直到簇质心不再改变。

这个方法简单有效,但容易受到初始簇质心的影响。为了更好的聚类效果,可以使用一种称为二分k均值的聚类算法。

二分k均值聚类算法首先将所有点作为一个簇,然后使用k均值算法(k=2)对其划分。下一迭代时,选择有最大误差的簇进行划分。该过程重复直到k个簇创建成功为止。

二分k均值的聚类效果要好于k均值算法。

over~  ^_^

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

推荐阅读更多精彩内容