实现k-means算法,完成以下要求:
实现k=2时,调用库函数并训练模型
输出聚类中心的坐标、各点所属聚类中心的位置以及代价
画出样本数据及聚类中心的位置
实现肘部法则,并画出肘部法则曲线
[[2,5],[4,6],[3,1],[6,4],[7,2],[8,4],[2,3],[3,1],[5,7],[6,9]
,[12,16],[10,11],[15,19],[16,12],[11,15]
,[10,14],[19,11],[17,14],[16,11],[13,19]]
第一步:导入数据,数据预处理
第二步:肘部法确定聚类中心
第三步:调库建立模型
第四步:可视化图像处理
# 导入科学计算包,多用于矩阵的计算
import numpy as np
# 导入画图工具
from matplotlib import pyplot as plt
# 导入sklearn中封装的KMeans算法
from sklearn.cluster import KMeans
# 设置中文字体和负号正确显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
X = np.array([[2,5],[4,6],[3,1],[6,4],[7,2],[8,4],[2,3],[3,1],[5,7],[6,9],[12,16],[10,11],[15,19],[16,12],[11,15],[10,14],[19,11],[17,14],[16,11],[13,19]])
# 肘部法确定k值
k = np.arange(1,11)
jarr = []
for i in k:
model = KMeans(n_clusters=i)
model.fit(X)
jarr.append(model.inertia_)
# 标注
plt.annotate(str(i),(i,model.inertia_))
plt.plot(k,jarr)
# 4.实现肘部法则,并画出肘部法则曲线(30分)
plt.show()
# 确定k=2
k = 2
# 确定模型
model1 = KMeans(n_clusters=k)
# 跑模型
model1.fit(X)
# 2.输出聚类中心的坐标、各点所属聚类中心的位置以及代价(20分)
muk = model1.cluster_centers_
print('输出聚类中心的坐标',muk)
C_i = model1.predict(X)
print('各点所属聚类中心的位置',C_i)
loss_=model1.inertia_
print('代价:',loss_)
# 3.画出样本数据及聚类中心的位置(30分)
plt.title('聚类分布图')
plt.scatter(X[:,0],X[:,1],c=C_i,cmap=plt.cm.Paired)
plt.scatter(muk[:,0],muk[:,1],s=160,marker='*')
# 循环标注
for i in range(k):
plt.annotate('中心'+str(i+1),(muk[i,0],muk[i,1]))
plt.show()