kmeans 聚类

K-Means 聚类是最常用的一种聚类算法,它的思想很简单,对于给定的样本集和用户事先给定的 K 的个数,将数据集里所有的样本划分成 K 个簇,使得簇内的点尽量紧密地连在一起,簇间的距离尽量远。由于每个簇的中心点是该簇中所有点的均值计算而得,因此叫作 K-Means 聚类。

算法过程

(1)从所有样本中随机选择 K 个样本作为初始的聚类中心。

(2)计算每个样本到各个初始聚类中心的距离,将样本分配到距离最近的类中(通常使用欧氏距离)。

(3)将所有样本都分配完毕后,重新计算 K 个聚类的中心,新的聚类中心即是该簇所有点的平均值。

(4)重复步骤(2)~(3)。

(5)当聚类中心不再发生变化或满足一定条件后,结束聚类。

算法的优缺点

优点:

(1)需要调节的参数只有聚类数目 K。

(2)对于大数据集,算法相对可伸缩和高效,计算的复杂度较低。

缺点:

(1)K-Means 聚类的结果很大程度上依赖于一开始随机选择的聚类中心,可能会导致最终的结果只是局部最优。为了获得最理想的结果,通常需要多次运行 K-Means 算法,选择不同的随机初始聚类中心,观察结果。

(2)K 值需要事先指定,但一般很难选择,需要多次尝试。

(3)对噪声点和异常值十分敏感。

(4)只适用于数值类型的样本数据,不适用于名义类型的样本数据。

使用python进行kmeans聚类

假设我们要解决一个这样的问题。

以下是一些同学,大萌是一个学霸,而我们想要找到这些人中的潜在学霸,所以我们要把这些人分为两类——学霸与非学霸。

高数 英语 Python 音乐
小明 88 64 96 85
大明 92 99 95 94
小朋 91 87 99 95
大朋 78 99 97 81
小萌 88 78 98 84
大萌 100 95 100 92

1 方法一:使用scipy

那么使用scipy的Python实现的代码如下:

import numpy as np
from scipy.cluster.vq import vq,kmeans,whiten
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
data=np.array([list1, list2, list3, list4, list5, list6])
whiten=whiten(data) # 算出各列元素的标准差,形成一个新的数组
centroids,_=kmeans(whiten,2)
result,_=vq(whiten,centroids)
print(result)

其中,kmeans()函数的功能是对数据进行聚类,返回结果是一个元组,其中我们只需要它的第一个值,这是一个聚类中心数组。vq()函数的功能是矢量量化数据,它可以对每一个数据,也就是对我们这边的每一个人进行归类。

结果如下:

[1 0 0 1 1 0]

说明大明、小朋和大萌都是学霸组的。

需要说明的是,kmeans找到的只是一个局部最优解,而不是全局。

2 方法二:使用sklearn

那么使用sklearn的Python实现的代码如下:

import numpy as np
from sklearn.cluster import KMeans
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
X=np.array([list1, list2, list3, list4, list5, list6])
kmeans=KMeans(n_clusters=2).fit(X)
pred=kmeans.predict(X)
print(pred)

其中,fit()方法是对Kmeans确定类别以后的数据集进行聚类,而predict()是根据聚类结果,确定所属类别。

结果如下:

[0 1 1 1 0 1]

说明这次大明、小朋、大朋和大萌都是学霸组的。

再次说明,kmeans找到的只是局部最优解。

【参考】

[1] Coursera课程《用Python玩转数据》
[2] 裔隽,张怿檬,张目清等.Python机器学习实战[M].北京:科学技术文献出版社,2018

原文地址:https://www.cnblogs.com/IvyWong/p/10320770.html