1.K-Means简介

K均值(K-Means)算法是无监督的聚类方法,实现起来比较简单,聚类效果也比较好,因此应用很广泛。K-Means算法针对不同应用场景,有不同方面的改进。我们从最传统的K-Means算法讲起,然后在此基础上介绍初始化质心优化K-Means++算法,距离计算优化Elkan K-Means算法和大样本情况下Mini Batch K-Means算法。

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽可能紧密的连在一起,而让簇间的距离尽量的大,下面我们引入K-Means目标函数。

假设样本集输入变量为(x1,x2,x3,…,xm),样本集划分为K个簇(C1,C2,C3,…,Ck),则我们的目标是最小化平方误差E。
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 E=\sum _{i=1}^{k} \sum _{x \in C_i}||x-\mu _i||^2 E=i=1∑k​x∈Ci​∑​∣∣x−μi​∣∣2
其中μi是簇Ci的均值向量,也可称作质心,表达式为
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu _i=\frac{1}{|C_i|}\sum _{x \in C_i}x μi​=∣Ci​∣1​x∈Ci​∑​x
如果直接求解上述最小值的话,那么为NP Hard问题,因此K-Means算法采用启发式的迭代方法。下面我们通过一个简单聚类来介绍K-Means算法迭代过程。

  • 如图(a)所示:表示初始化数据集。
  • 如图(b)所示:假设K=2,随机选择两个点作为类别质心,分别为图中的红色质心和蓝色质心。
  • 如图©所示:分别求样本点xi到这两个质心的距离,并标记每个样本点的类别为距离质心最近的类别。划分得到两个簇C1和C2,完成一次迭代。
  • 如图(d)所示:对标记为红色的点和蓝色的点分别求新的质心。
  • 如图(e)所示:重复图©(d)过程,标记每个样本点的类别为距离质心最近的类别,重新划分得到两个簇C1和C2。
  • 如图(f)所示:直到质心不再改变后完成迭代,最终得到两个簇C1和C2。

2.K-Means算法流程

假设输入样本集 D = x 1 , x 2 , … , x m D={x_1,x_2,…,x_m} D=x1​,x2​,…,xm​,聚类簇数为K,最大迭代次数为N。输出的簇划分为 C = C 1 , C 2 , … , C m C={C_1,C_2,…,C_m} C=C1​,C2​,…,Cm​。

  • 从数据集D中随机选择K个样本作为初始的质心向量$ \mu={ \mu_1,\mu_2,\mu_3,…,\mu_k }$。

  • 迭代 n = 1 , 2 , … , N n=1,2,…,N n=1,2,…,N。

    • 划分初始化簇 C t = ∅ ; t = 1 , 2 , … , k C_t=\varnothing ;\ t=1,2,…,k Ct​=∅; t=1,2,…,k。
    • 对于 i = 1 , 2 , … , m i=1,2,…,m i=1,2,…,m,计算样本 x i x_i xi​和各个质心向量 μ j ( j = 1 , 2 , … , k ) \mu_j(\ j=1,2,…,k) μj​( j=1,2,…,k)的距离 d i j d_{ij} dij​。将 x i x_i xi​标记为最小的 d i j d_{ij} dij​所对应的类别 λ i \lambda_i λi​,此时更新 C λ i = C λ i ∪ x i C_{\lambda i}=C_{\lambda i} \cup{x_i} Cλi​=Cλi​∪xi​。

    d i j = ∣ ∣ x i − μ j ∣ ∣ 2 d_{ij}=||x_i-\mu_j||^2 dij​=∣∣xi​−μj​∣∣2

    • 对于 j = 1 , 2 , … , k j=1,2,…,k j=1,2,…,k,对 C j C_j Cj​中所有样本点重新计算新的质心。

    μ j = 1 ∣ C j ∣ ∑ x ∈ C j x \mu_j=\frac{1}{|C_j|}\sum_{x\in C_j}x μj​=∣Cj​∣1​x∈Cj​∑​x

    • 如果K个质心向量都不再发生变化,则结束迭代。
  • 输出K个划分簇 C C C, C = { C 1 , C 2 , C 3 , … , C k } C=\{C_1,C_2,C_3,…,C_k \} C={C1​,C2​,C3​,…,Ck​}。

对于K-Means算法,首先要注意K值的选择和K个初始化质心的选择。

  • **对于K值的选择:**我们可以通过对数据的先验经验选择合适的K值,如果没有先验条件的话,还可以通过交叉验证选择合适的K值。
  • **对于K个初始化质心:**由于我们采用启发式迭代方法,K个初始化质心的位置选择对最后的聚类结果和运行时间都有较大的影响,最好选择的K个质心不要离得太近。

3.初始化优化K-Means++

如果是完全随机的选择, 算法的收敛可能很慢。我们在此介绍K-Means++算法,针对随机初始化质心进行优化,具体算法流程如下所示。

  • 从输入的数据点集合中随机选择一个点作为第一个聚类中心μ1。
  • 对于数据集中的每个点xi,计算与他最近的聚类中心距离。

D ( x ) = arg ⁡ min ⁡ r = 1 k s e l e c t e d ∣ ∣ x i − μ r ∣ ∣ 2 D(x)=\arg \min_{r=1}^{k_{selected}}||x_i-\mu_r||^2 D(x)=argr=1minkselected​​∣∣xi​−μr​∣∣2

  • 选择一个数据点作为新的聚类中心,其中D(x)较大的点被选作新的聚类中心的概率较大。
  • 重复上述两步,直到选择出K个聚类中心。然后利用这K个质心来作为初始化质心去运行传统K-Means算法。

4.距离计算优化Elkan K-Means算法

传统K-Means算法中,我们每次迭代时都要计算所有样本点到所有质心之间的距离,那么有没有什么方法来减少计算次数呢? Elkan K-Means算法提出利用两边之和大于第三边、两边之差小于第三边的三角形特性来减少距离的计算。

  • 对于一个样本点 x x x和两个质心 μ j 1 , μ j 2 \mu_{j1},\mu_{j2} μj1​,μj2​,如果我们预先计算出这两个质心之间的距离 D ( j 1 , j 2 ) D(j_1,j_2) D(j1​,j2​),如果发现 2 D ( x , j 1 ) ≤ D ( j 1 , j 2 ) 2D(x,j_1)≤D(j_1,j_2) 2D(x,j1​)≤D(j1​,j2​),那么我们便能得到 D ( x , j 1 ) ≤ D ( x , j 2 ) D(x,j_1)≤D(x,j_2) D(x,j1​)≤D(x,j2​)。此时我们不再计算 D ( x , j 2 ) D(x,j_2) D(x,j2​),也就节省了一步距离计算。
  • 对于一个样本点 x x x和两个质心 μ j 1 , μ j 2 μ_{j1},μ_{j2} μj1​,μj2​,我们能够得到 D ( x , j 2 ) ≥ m a x 0 , D ( x , j 1 ) − D ( j 1 , j 2 ) D(x,j_2)≥max{0,D(x,j_1)−D(j_1,j_2)} D(x,j2​)≥max0,D(x,j1​)−D(j1​,j2​)。

Elkan K-Means迭代速度比传统K-Means算法迭代速度有较大提高,但如果我们的样本特征是稀疏的,或者有缺失值的话,此种方法便不再使用。

5.大样本优化Mini Batch K-Means算法

传统的K-Means算法中需要计算所有样本点到所有质心的距离,计算复杂度较高。如果样本量非常大的情况下,比如数据量达到10万,特征在100以上,此时用传统K-Means算法非常耗时。故此针对大样本情况下采用Mini Batch K-Means算法。

Mini Batch K-Means采用无放回随机采样的方法从样本集中选取部分数据,然后用选取的数据进行传统的K-Means算法训练。然后进行迭代并更新质心,直到质心稳定或达到指定的迭代次数。

Mini Batch K-Means可以避免样本量太大带来的计算问题,算法收敛速度也能够加快,当然带来的代价就是我们的聚类精确度降低。为增加算法的准确性,我们可以多训练几次Mini Batch K-Means算法,用不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

6.Sklearn实现K-Means算法

我们经常需要通过改变参数来让模型达到聚类结果,具体参数设置可参考sklearn官方教程。

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt#load iris
iris=load_iris()
X=iris.data[:,:2]
print(X.shape)
#150,2#plot data
plt.figure()
plt.scatter(X[:,0],X[:,1],c='blue',marker='o',label='point')
plt.legend(loc=2)
plt.show()

# fit data
kmeans=KMeans(n_clusters=3)
kmeans.fit(X)
label_pred=kmeans.labels_#plot answer
plt.figure()
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red",marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green",marker='*', label='label1')
plt.scatter(x2[:, 0], x2[:, 1], c = "blue",marker='+', label='label2')
plt.legend(loc=2)
plt.show()

7.K-Means算法优缺点

7.1优点

  • 聚类效果较优。

  • 原理简单,实现容易,收敛速度快。

  • 需要调整的参数较少,通常只需要调整簇数K。

7.2缺点

  • K值选取不好把握。
  • 对噪音和异常点比较敏感。
  • 采用迭代方法,得到的结果是局部最优。
  • 如果各隐含类别的数据不平衡,则聚类效果不佳。

8.推广

更多内容请关注公众号谓之小一,若有疑问可在公众号后台提问,随时回答,欢迎关注,内容转载请注明出处。

参考

  • 刘建平Pinard_K-Means聚类算法原理

机器学习之K均值(K-Means)算法相关推荐

  1. java k均值_算法——K均值聚類算法(Java實現)

    1.用途:聚類算法通常用於數據挖掘,將相似的數組進行聚簇 2.原理:網上比較多,可以百度或者google一下 3.實現:Java代碼如下 package org.algorithm; import j ...

  2. 机器学习算法之K-means(K均值聚类)算法

    聚类 聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好.它是一种无监督的学习(Unsupervised Learning)方法,不需 ...

  3. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  4. PRML第九章读书笔记——Mixture Models and EM K均值/K中心点、高斯混合奇异性、EM观点下的高斯混合/K-means/混合伯努利分布/贝叶斯线性回归、推广EM算法

    目录 9.1 K-means Clustering P429 K中心点算法K-medoids 9.2 Mixtures of Gaussians P433 高斯混合的奇异性 9.3 An Altern ...

  5. K均值(K-means)聚类算法原理与代码详解

    0. 算法原理: 上述过程简单描述: a: 初始数据 b: 选择质点 c: 根据质点划分 d: 求均值,更新质心点 e: 划分 f: 更新质心点 1. 代码实现: # K means 教程# 0. 引 ...

  6. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  7. 机器学习之原型聚类算法(K均值和高斯混合)

    "原型"是指样本空间中具有代表性的点. 原型聚类算法是假设聚类结构能通过一组原型进行刻画,在现实聚类任务中极为常用. 通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解 ...

  8. Python数据分析笔记:聚类算法之K均值

    我们之前接触的所有机器学习算法都有一个共同特点,那就是分类器会接受2个向量:一个是训练样本的特征向量X,一个是样本实际所属的类型向量Y.由于训练数据必须指定其真实分类结果,因此这种机器学习统称为有监督 ...

  9. 机器学习--K均值聚类

    机器学习--聚类 一.无监督学习 二.KMeans聚类 2.1 概览 2.2 理论介绍 2.2.1 模型 2.2.2 策略 2.2.3 算法 2.3 案例讲解 2.4 Python实现 2.4.1 导 ...

  10. python机器学习案例系列教程——k均值聚类、k中心点聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 上一篇我们学习了层次聚类.层次聚类只是迭代的把最相近的两个聚类匹配起来.并没有给出能给出多少的分组.今天我们来研究一个K均值聚类.就是 ...

最新文章

  1. 重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots
  2. 微软在慕尼黑设立欧洲首个物联网实验室
  3. AI也用思维导图:教它像人类一样高效规划
  4. Maven 的 Scope 区别,你知道吗?
  5. 云服务器怎么选系统,云服务器怎么选择操作系统
  6. 【Hibernate】hibernate实体关系映射——单边的多对多关系
  7. pageSet的底层数据库存储逻辑
  8. echart vue 图表大小_cesium+vue,性能优化
  9. C#LeetCode刷题之#888-公平的糖果交换(Fair Candy Swap)
  10. python部分引入total值的问题_Python数据分析基础与过程综述,关键数据预处理异常点的发现与处理,python,及,流程,回顾,重点,之,值...
  11. 选择排序java从小到大代码_java中选择排序与归并排序的内容,详细解析
  12. 小程序中的setData的使用
  13. python之---子类父类属性之间的关系
  14. pytorch 与numpy 部分操作的对应关系
  15. 以前的东西-Mvp2
  16. 谈谈如何用eoLinker管理各类API接口
  17. 最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)
  18. 回弹强度记录表填写_回弹法检测砼抗压强度原始记录表(2011年规程)
  19. 国内外 48 个最常用学术网站汇总,这可能是史上最全的!
  20. 10年时间,打工妹把一个团队从“一盘散沙”到精英战队,成功实现空手“造”大房···

热门文章

  1. 基本回路系统和基本割集系统
  2. python 文字识别 准确率_关于OCR图片文本检测、推荐一个 基于深度学习的Python 库!...
  3. 《腾讯网UED体验设计之旅》
  4. 求最小公倍数的方法php,JS怎么求得最小公倍数和最大公约数
  5. 2022-渗透测试-xss小游戏通关
  6. 【图像识别】基于模板匹配算法求解车牌识别问题matlab代码含GUI界面
  7. AMBA协议之AXI协议——中文翻译
  8. 尚融宝29-提现和还款
  9. After trying to increase PLL frequency, system shows the error: “Device may be operating in low-powe
  10. 实时折线图php mysql 源码_超级漂亮网址导航源码,自助链源码(PHP+MYSQL完整版)...