机器学习--K-means算法原理

一. 概念
K-means:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

二. 算法流程

  1. 选择聚类的个数K
  2. 任意产生k个聚类, 然后确定聚类中心, 或者直接生成K个中心
  3. 对每个点确定其聚类中心点
  4. 再计算其聚类新中心
  5. 重复以上步骤直到满足收敛要求(通常确定的中心点不再改变)


    2-1

三. 案例
将下列数据点用K-means方法进行聚类:

3-1

3-2

①通过距离公式将分别计算各点到P1,P2数据点距离:

3-3

结果如下:
3-4

②选取距离较近的点整理进入相应队列:
3-5

③计算出新一轮的队列中心:
3-6

④重复上述步骤,开始新一轮迭代,算距离,取最近:
3-7

⑤再次选取距离较近的点整理进入相应队列,发现点的队列位置和上一轮并无差别:
3-8

⑥当每次迭代结果不变时,认为算法收敛,聚类完成:
image.png

K-Means一定会停下,不可能陷入一直选质心的过程。

四. 算法优缺点

  • 优点
    1. 原理简单(看见中心点), 实现容易
    2. 聚类效果中上(依赖k的选择)
    3.空间复杂度o(N) 时间复杂度o(I * K * N)
    * N为样本点个数,K为中心点个数,I为迭代次数

  • 缺点
    1. 对离群点, 噪声敏感(中心点易偏移)
    2. 很难发现大小差别很大的簇及进行增量计算
    3. 结果不一定是全局最优,只能保证局部最优(与K的
    个数及初值选取有关)。

五. K值确定
1.Elbow method就是“肘”方法,对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和,可以想象到这个平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。但是在这个平方和变化过程中,会出现一个拐点也即“肘”点,下图可以看到下降率突然变缓时即认为是最佳的k值。

5-1

  1. 肘方法的核心指标是SSE(sum of the squared errors,误差平方和),Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。


    5-2
  2. 肘方法的核心思想:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。这也是该方法被称为肘方法的原因。


    5-3
  3. 通过sklearn验证肘方法

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt

cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
X = np.hstack((cluster1, cluster2)).T

K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    meandistortions.append(sum(np.min(cdist(X,
kmeans.cluster_centers_, 'euclidean'), axis=1)) /  X.shape[0])

plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
# plt.ylabel('平均畸变程度',fontproperties=font)
plt.ylabel('Ave Distor')
# plt.title('用肘部法则来确定最佳的K值',fontproperties=font);
plt.title('Elbow method value K');
plt.show()

输出结果如下:


5-4

六. 轮廓系数法
轮廓系数法(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。
该值处于-1~1之间,值越大,表示聚类效果越好。

6-1

  • a是Xi与同簇的其他样本的平均距离,称为凝聚度;
  • b是Xi与最近簇中所有样本的平均距离,称为分离度。
    最近簇的定义:


    6-2
  • 其中p是某个簇Ck中的样本。即,用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。
  • 求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。

通过sklearn验证轮廓系数方法:
已知:
轮廓系数取值为[-1, 1],其值越大越好,且当值为负时,表明 ai<bi,样本被分配到错误的簇中,聚类结果不可接受。对于接近0的结果,则表明聚类结果有重叠的情况。

import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
#分割出6个子图,并在1号作图
plt.figure(figsize=(8, 10))
plt.subplot(3, 2, 1)
#初始化原始数字点
x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
#在1号子图做出原始数据点阵的分布
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('Sample')
plt.scatter(x1, x2)
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b']
#点的标号
markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
#簇的个数
tests = [2, 3, 4, 5, 8]
subplot_counter = 1#训练模型
for t in tests:
    subplot_counter += 1
    plt.subplot(3, 2, subplot_counter)
    kmeans_model = KMeans(n_clusters=t).fit(X)
    for i, l in enumerate(kmeans_model.labels_):
        plt.plot(x1[i], x2[i], color=colors[l],marker=markers[l],ls='None')
        plt.xlim([0, 10])
        plt.ylim([0, 10])
        plt.title('K = %s, SCoefficient = %.03f' % (t,
metrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean')))

结果如下:

输出结果

结论:由输入结果可知, 当k=3时, 轮廓系数的值最大

7. Calinski-Harabasz Index

类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数s会高,分数s高则聚类效果越好


7-1

其中m为训练集样本数,k为类别数。Bk为类别之间的协方差矩阵,Wk为类别内部数据的
协方差矩阵。tr为矩阵的迹。

8. Canopy算法配合初始聚类:
①Canopy简介:
Canopy聚类最大的特点是不需要事先指定k值(即clustering的个数),因此具有很大的实际应用价值。Canopy聚类虽然精度较低,但其在速度上有很大优势,因此可以使用Canopy聚类先对数据进行“粗”聚类,得到k值后再使用Kmeans进行进一步“细”聚类。

②Canopy+Kmeans:

  • 聚类最耗费计算的地方是计算对象相似性的时候,Canopy聚类在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy ,通过一系列计算得到若干CanopyCanopy之间可以是重叠的,但不会存在某个对象不属于任Canopy的情况,可以把这一阶段看做数据预处理;
  • 在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy
    的对象之间不进行相似性计算。(即,根据Canopy算法产生的Canopies代替初始
    的K个聚类中心点,由于已经将所有数据点进行Canopies有覆盖划分,在计算数据
    离哪个k-center最近时,不必计算其到所有k-centers的距离,只计算和它在同一
    个Canopy下的k-centers这样可以提高效率)

③Canopy详解:
Canopy算法流程图:

流程图

我们假设每个数据用小圆点来表示。在计算机中用List集合存储。
Canopy算法首先选择两个距离阈值:T1和T2,其中T1 > T2
(1)原始状态下的数据还没有分类,所以从集合中取出一点P,将P作为第一个类,我们也将类称为Canopy。


1

(2)继续从集合中取点,比如P,计算P到已经产生的所有Canopy的距离,如果到某个Canopy的距离小于T1,则将P加入到该Canopy;如果P到所有Canopy中心的距离都大于T1,则将P作为一个新Canopy,如下图中的Q就是一个新的Canopy。


2

(3)如果P到该Canopy距离小于T2,则表示P和该Canopy已经足够近,此时将P从从集合中删除,避免重复加入到其他Canopy。


3

(4)对集合中的点继续执行上述操作直到集合为空,算法结束,聚类完成。

Canopy算法优点:
1、Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。
2、Canopy选择出来的每个Canopy的centerPoint作为K会更精确。
3、只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量。

缺点
算法中 T1、T2(T2 < T1) 的确定问题

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

推荐阅读更多精彩内容

  • 聚类算法 前面介绍的集中算法都是属于有监督机器学习方法,这章和前面不同,介绍无监督学习算法,也就是聚类算法。在无监...
    飘涯阅读 41,263评论 3 52
  • 其他 这篇文章的整体排版主要是根据个人的博客来哒,如果感兴趣的话可以去我的自己搭建的个人博客看这篇文章。 正文 聚...
    DeamoV阅读 1,187评论 0 2
  • 一、算法介绍 聚类属于无监督学习,K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即...
    TangCC阅读 2,993评论 0 1
  • 1. Kmeans聚类算法简介 由于具有出色的速度和良好的可扩展性,Kmeans聚类算法算得上是最著名的聚类方法。...
    wujingwin阅读 10,410评论 1 8
  • 今天一大早去医院给崽崽看病,要打点滴,三个人压住他才敢给他插针,哭的好可怜。 希望...
    不吃鱼的猫__阅读 132评论 0 0