基本思想
这种聚类方法的思想是把每个样品聚集到其最近均值的类中,在它的最简单说明中,这个过程由下列三步所组成:
(1)把样品粗略分成K个初始类。
(2)进行修改,逐个分派样品到其最近均值的类中(通常用标准化数据或非标准化数据计算欧式距离)。重新计算接受新样品的类和失去样品的类的形心(均值)。
(3)重复第二步,直到各类无元素进出。
KMeans算法流程
KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
算法过程:
(1)从N个数据文档随机选取K个数据文档作为质心。
(2)对剩余的每个数据文档测量其到每个质心的距离,并把它归到最近的质心的类。
(3)重新计算已经得到的各个类的质心。
(4)迭代二、三步直至新的质心与原质心相等或小于指定阈值,算法结束。
k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机地选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,j的值没有发生变化,则说明算法已经收敛。
下面将使用Scikit-Learn的KMeans来进行聚类:
KMeans聚类首先需要确定聚类中心的数量,所以在进行聚类之前,需要对自己的数据的含义和属性有一定的了解。如果是二维的数据,可以先画一个散点图看一下样本的分布情况,如:
从图像中的数据分布可以看出,样本点大致分为四簇。所以设置初始聚类中心 k=4,如果对数据不是很了解,可以先设置一个k,sklearn.cluster中的KMeans,n_clusters的默认值为8,进行聚类之后,再根据结果的聚类效果来调整聚类中心的数量。
先导入需要的程序包
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
然后进行数据的处理,将数据处理成符合模型要求的数组
def file2matrix(file_name, separator):
# 数据的预处理
data_list = []
with open(file_name) as file:
for i in file.readlines():
c = i.strip().split(separator)
for j in range(len(c)):
c[j] = eval(c[j])
data_list.append(c)
return np.array(data_list)
画出散点图和聚类中心
def draw_pic(data_list):
# 画出散点图
for x in range(len(data_list)):
plt.scatter(data_list[x][0], data_list[x][1], s=30, c='b', marker='.')
def draw_cluster_centers(centers_mat):
# 画出聚类中心
for k in range(len(centers_mat)):
plt.scatter(centers_mat[k][0], centers_mat[k][1], s=60, c='r', marker='D')
执行程序,调用相应的函数,进行KMeans聚类,kmeans.cluster_centers_方法返回的是聚类中心的数据点
if __name__ == '__main__':
data_Set = file2matrix('testSet.txt', '\t')
draw_pic(data_Set)
k = 4 # 确定聚类中心的数目
# 执行KMeans算法
kmeans = KMeans(n_clusters=k)
kmeans.fit(np.mat(data_Set))
draw_cluster_centers(kmeans.cluster_centers_)
plt.show()
最终得到结果
优点:(1)KMeans算法擅长处理球状分布的数据
(2)简单,容易掌握
缺点:(1)k的取值需要根据经验,没有可借鉴性
(2)对异常偏离的数据非常敏感
参考:
1.机器学习算法原理与编程实践/郑捷著. 北京:电子工业出版社,2015.11
2.多元统计分析/何晓群编著. -4版. --北京:中国人民大学出版社,2015.3
如果有需要测试数据集的,可以在下方评论处留下邮箱,欢迎关注。