聚类算法之k-均值聚类
k-均值聚类算法
Kmeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
K-Means算法如何工作?
输入:样本集D,簇的数目k,最大迭代次数N;
输出:簇划分(k个簇,使平方误差最小);
算法步骤:
(1)为每个聚类选择一个初始聚类中心;
(2)将样本集按照最小距离原则分配到最邻近聚类;
(3)使用每个聚类的样本均值更新聚类中心;
(4)重复步骤(2)、(3),直到聚类中心不再发生变化;
(5)输出最终的聚类中心和k个簇划分;
原理
1.随机选取K个点为分类中心点;
2.将每个点分配到最近的类,这样形成了K个类;
3.重新计算每个类的中心点。比如都属于同一个类别里面有10个点,那么新的中心点就是这10个点的中心点,一种简单的方式就是取平均值。
比喻说明
1.选老大
大家随机选K个老大,谁离得近,就是那个队列的人(计算距离,距离近的人聚合在一起)。
随着时间的推移,老大的位置在变化(根据算法,重新计算中心点),直到选出真正的中心老大(重复,直到准确率最高)
2.Kmeans和Knn的区别
Kmeans开班选老大,风水轮流转,直到选出最佳中心老大;
优点:容易实现
缺点:k值的选择是用户指定的,不同的k得到的结果会有挺大的不同,对k个初始质心的选择比较敏感,容易陷入局部最小值
适用数据类型:数值型数据
其工作流程:首先,随机确定k个初始点作为质心,然后将数据集中的每个点分配到一个簇中,具体来讲,为每个点找距离其最近的质心,并将其分配给该质心所对应的簇。完成之后,每个簇的质心更新为该簇所有点的平均值。
K-means是一个聚类算法,是无监督学习,生成指定K个类,把每个对象分配给距离最近的聚类中心。
代码实现:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 %matplotlib inline 4 from sklearn.datasets.samples_generator import make_blobs 5 # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2] 6 X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2], 7 random_state =9) 8 plt.scatter(X[:, 0], X[:, 1], marker='o') 9 plt.show() 10 11 #用K-Means聚类方法来做聚类,首先选择k=2 12 from sklearn.cluster import KMeans 13 y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X) 14 plt.scatter(X[:, 0], X[:, 1], c=y_pred) 15 plt.show() 16 17 #用Calinski-Harabasz Index评估的聚类分数 18 from sklearn import metrics 19 metrics.calinski_harabaz_score(X, y_pred) 20 21 22 #k=3来看看聚类效果 23 from sklearn.cluster import KMeans 24 y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X) 25 plt.scatter(X[:, 0], X[:, 1], c=y_pred) 26 plt.show() 27 28 #用Calinski-Harabaz Index评估的k=3时候聚类分数 29 metrics.calinski_harabaz_score(X, y_pred) 30 31 #看看k=4时候的聚类效果 32 from sklearn.cluster import KMeans 33 y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X) 34 plt.scatter(X[:, 0], X[:, 1], c=y_pred) 35 plt.show() 36 37 metrics.calinski_harabaz_score(X, y_pred) 38 39 #看看用MiniBatchKMeans的效果,我们将batch size设置为200. 由于我们的4个簇都是凸 40 #的,所以其实batch size的值只要不是非常的小,对聚类的效果影响不大。 41 for index, k in enumerate((2,3,4,5)): 42 plt.subplot(2,2,index+1) 43 y_pred = MiniBatchKMeans(n_clusters=k, batch_size = 200, random_state=9).fit_predict(X) 44 score= metrics.calinski_harabaz_score(X, y_pred) 45 plt.scatter(X[:, 0], X[:, 1], c=y_pred) 46 plt.text(.99, .01, ('k=%d, score: %.2f' % (k,score)), 47 transform=plt.gca().transAxes, size=10, 48 horizontalalignment='right') 49 plt.show()
参考资料:
1、https://www.cnblogs.com/chenqionghe/p/12301905.html
2、https://www.cnblogs.com/pinard/p/6164214.html
3、https://www.cnblogs.com/pinard/p/6169370.html
4、https://www.zhihu.com/question/29208148/answer/2061775028
5、https://zhuanlan.zhihu.com/p/75477709
posted on 2020-05-16 10:49 enhaofrank 阅读(1138) 评论(0) 编辑 收藏 举报