一,介绍
K-Means是一种经典的无监督的聚类算法。它比较简单,易于实现并且应用很广泛。
二,原理
K-Means算法的思想很简单,对于给定的数据集:
1)将各个聚类内的所有样本的均值作为该聚类的代表点,
2)计算每个样本到各个均值的距离,
3)取最小距离的均值所在类别作为样本类别,从而数据集划分为K个类,
4)再重新计算每个聚类的均值,继续2)3),依次迭代,直到均值不再变化。
这样就让类内的点尽量紧密的连在一起,而让类间的距离尽量的大,即:类内紧凑,类间独立。
如果用数学表达式表示,假设划分类为(C1,C2,…Ck),则我们的目标是最小化误差平方和准则函数E:
其中 是类Ci的均值向量,有时也称为质心,表达式为:
三,K-means聚类示例
图a表达了初始的数据集,假设k=2。
图b,我们随机选择了两个类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为与该样本距离最小的质心的类别。
图c,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心。
图d,新的红色质心和蓝色质心的位置已经发生了变动。
图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到两个类别如图f。
三,K-means算法2个核心问题
1.度量样本之间的距离——欧式距离。
2.更新类内质心的方法——平均值法,即means。
输入: 类的数目k 和包含n 个样本的数据集。
输出: k 个类, 使误差平方和准则函数最小。
方法:基于类中样本的平均值。
(1) 任意选择k 个样本作为初始的类质心,
(2) 计算k个类中样本的质心,
(3) 根据类中样本的质心, 将每个样本(重新) 赋予类别,
(4) 更新簇的均值, 即计算每个簇中对象的质心,
(5) 直到质心不再发生变化。
四,优缺点
主要优点:
(1)是解决聚类问题的一种经典算法,原理简单,收敛速度快。
(2)对处理大数据集,该算法是相对可伸缩和高效率的。因为它的复杂度是O(nkt ) , 其中, n 是所有样本的数目, k 是要划分类的数目, t 是迭代的次数。通常k<<n且t<<n 。
(3)当样本是密集的,而类与类之间区别明显时, 它的效果较好。
主要缺点
(1)数据集样本需要距离计算,这对于处理符号属性的数据不适用。
(2)必须事先给出k(要生成的类的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
(3)对“噪声”和孤立点数据敏感,少量的该类数据能够对质心产生极大的影响。
五,Python代码
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
def loadDataSet(fileName):
data = np.loadtxt(fileName,delimiter='\t')
return data
# 欧氏距离计算
def distEclud(x,y):
return np.sqrt(np.sum((x-y)