当前位置:   article > 正文

Kmeans算法代码详解(Python)_kmeans聚类算法代码python

kmeans聚类算法代码python

主要部分代码

首先使用KMeans()对数据集建模

model = KMeans(n_clusters=3) 
model.fit(data) 
  • 1
  • 2
  • 创建一个KMeans对象,指定聚类数为3,意味着算法将数据分成3个簇
  • 使用数据拟合了KMeans模型。在这一步,算法会尝试找到最优的簇中心,使得数据点到其对应簇中心的距离之和最小

获取聚类标签

label_pred = model.labels_ 
  • 1
  • 这行代码获取了每个数据点的聚类标签。每个数据点被分配到一个簇,输出是一个数组,包含每个数据点所属的簇的标签。

获取聚类平方误差总和SSE

inertia = model.inertia_ 
  • 1

SSE是指每个数据点到其簇中心的距离的平方和,用于衡量聚类的紧密度。SSE越小,表示数据点越靠近它们的簇中心,聚类效果越好

结合例子

鸢尾花数据集为例,首先将数据导入

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris 

iris = load_iris() #导入sklearn自带的鸢尾花数据集
data = pd.DataFrame(iris.data, columns=iris.feature_names)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

开始建模

和上面分析的步骤一样

model = KMeans(n_clusters=3) 
model.fit(data) 
label_pred = model.labels_ 
print(label_pred)
inertia = model.inertia_ 
print("聚类平方误差总和为: ",inertia)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出结果如下
在这里插入图片描述
可以看到输出了所有样本的聚类标签,包括0-2,一共三个簇,同时输出了聚类平方误差总和

查看聚类结果

最后可以将聚类的结果绘制出来:
先分别取出每一簇的样本

x0 = data[label_pred == 0]
x1 = data[label_pred == 1]
x2 = data[label_pred == 2]
  • 1
  • 2
  • 3

然后分别绘制各个簇的样本以及每个簇的中心点坐标
最后一行代码中,model.cluster_centers_[:, 0]model.cluster_centers_[:, 1]分别表示获取所有簇中心的X坐标和Y坐标,marker='s'表示正方形

plt.scatter(x0["sepal length (cm)"], x0["sepal width (cm)"], c = "red", marker='o', label='label0')
plt.scatter(x1["sepal length (cm)"], x1["sepal width (cm)"],  c = "green", marker='*', label='label1')
plt.scatter(x2["sepal length (cm)"], x2["sepal width (cm)"],  c = "blue", marker='+', label='label2')
plt.scatter(model.cluster_centers_[:,0],model.cluster_centers_[:,1], c = "black", marker='s',label='centroids')
  • 1
  • 2
  • 3
  • 4

最后设置标签、添加图例,通过参数指定图例的位置,在这里表示将图例放在左上角

plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend(loc=2)
  • 1
  • 2
  • 3

得到下图结果
在这里插入图片描述

如何选择合适的K值
讲完了建模,现在来讲讲在建模之前我们如何选择最佳的K值——画肘部图

from scipy.spatial.distance import cdist

plt.plot()
colors = ['b','g','r']  
markers = ['o','v','s']  
#生成一个字典保存每次的代价函数
distortions = []
#从1~9判断合适的K值
K = range(1,10)
for k in K:
    #分别构建各种K值下的聚类器
    Model = KMeans(n_clusters=k).fit(data) 
    #计算各个样本到其所在簇类中心欧式距离(保存到各簇类中心的距离的最小值)
    distortions.append(sum(np.min(cdist(data, Model.cluster_centers_, 'euclidean'), axis=1)) / data.shape[0])

#绘制各个K值对应的簇内平方总和,即代价函数SSE
plt.plot(K,distortions,'bx-')
#设置坐标名称
plt.xlabel('optimal K')
plt.ylabel('SSE')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

可以看到,当K=3时,产生了“肘点”,从K=3到K=4,SSE的下降速度明显变缓,因此最佳的K取值应为3
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/413757
推荐阅读
相关标签
  

闽ICP备14008679号