k均值(k-means)算法是一种最老的、最广泛使用的聚类算法。该算法之所以称为k均值,那是因为它可以发现k个不同的簇,且每个簇的中心均采用簇中所含数据点的均值计算而成。
1 算法描述
在k均值算法中,质心是定义聚类原型(也就是机器学习获得的结果)的核心。除了第一次的质心是被指定的以外,此后的质心都是经由计算均值而获得的。
首先,选择k个初始质心(这k个质心并不要求来自于样本数据集),其中k是用户指定的参数,也就是所期望的簇的个数。每个数据点都被收归到距其最近的质心的分类中,而同一个质心所收归的点集为一个簇。然后,根据本次分类的结果,更新每个簇的质心。重复上述数据点分类与质心变更步骤,直到簇内数据点不再改变,或者等价地说,直到质心不再改变。
基本的k均值算法描述如下:
(1)选择k个数据点作为初始质心。
(2)重复以下步骤,直到质心不再发生变化:
①将每个点收归到距其最近的质心,形成k个簇。
②重新计算每个簇的质心。
2 代码示例
现假设有如下初始数据集:
x | 15 | 12 | 14 | 13 | 12 | 16 | 4 | 5 | 5 | 7 | 7 | 6 |
y | 17 | 18 | 15 | 16 | 15 | 12 | 6 | 8 | 3 | 4 | 2 | 5 |
我们将在scikit-learn中应用k均值算法进行聚类。
引入各种必要的包,并录入数据
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
X=np.array([[15,17],[12,18],[14,15],[13,16],[12,15],[16,12],[4,6],[5,8],[5,3],[7,4],[7,2],[6,5]])
设置要寻找的簇个数为2,再把random seed置为0,以便后续的结果可以复现。然后对数据调用fit_predict()方法,该方法的作用是计算聚类中心,并为输入的数据加上分类标签。
y_pred=KMeans(n_clusters=2,random_state=0).fit_predict(X)
也可以使用fit()方法,它仅仅产生聚类中心(也就是建模),例如:
kmeans=KMeans(n_clusters=2,random_state=0).fit(X)
作为测试,引入两个新的点,利用已经建立的模型预测它们的分类情况,最后可视化地展现聚类结果。
new_data=np.array([[3,3],[15,15]])
color=("red","green")
colors2=np.array(color)[kmeans.predict([[3,3],[15,15]])]
plt.figure(figsize=(5,5))
colors=np.array(color)[y_pred]
plt.scatter(X[:,0],X[:,1],c=colors)
plt.scatter(new_data[:,0],new_data[:,1],c=colors2,marker='x')
plt.show()
标签:plt,15,均值,算法,聚类,质心,聚类分析 From: https://blog.csdn.net/2302_80828325/article/details/143753645