KMean聚类算法

1.可以向KMeans传入的参数:
sklearn官网所提供的参数说明有9个,我们使用时,如无特别需要,一般只有第一个参数(n_cluster)需要设置,其他参数直接采用默认值即可。
一种示例:

klearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')
对于我们来说,常常只需要:
sklearn.cluster.KMeans(n_clusters=K)
1. n_cluster:聚类个数(即K),默认值是82. init:初始化类中心的方法(即选择初始中心点的根据),默认“K-means++”,其他可选参数包括“random”。
3. n_init:使用不同类中心运行的次数,默认值是10,即算法会初始化10次簇中心,然后返回最好的一次聚类结果。
4. max_iter:单次运行KMeans算法的最大迭代次数,默认值是3005. tol:浮点型,两次迭代之间簇内平方和下降的容忍阈值,默认为0.0001,如果两次迭代之间下降的值小于tol所设定的值,迭代就会停下。
6. verbose:是否输出详细信息,参数类型为整型,默认值为01表示每隔一段时间打印一次日志信息。
7. random_state:控制每次类中心随机初始化的随机种子,作用相当于能够锁定和复现同一次随机结果,默认为none,也可以随机设置数字。
8. copy_x:在预先计算距离时,首先将数据居中在数值上更准确。如果 copy_x 为 True(默认),则不修改原始数据。如果为 False,则修改原始数据,并在函数返回之前放回,但通过减去再添加数据均值可能会引入小的数值差异。请注意,如果原始数据不是C-contiguous,即使copy_x 为False,也会进行复制。如果原始数据是稀疏的,但不是 CSR 格式,即使 copy_x 为 False,也会进行复制。
9. algorithm:有三种参数可选:auto”, “full”, “elkan”,默认为auto。K-means 算法使用。经典的EM-style算法是“full”。通过使用三角不等式,“elkan” 变体对具有明确定义的集群的数据更有效。然而,由于分配了一个额外的形状数组(n_samples,n_clusters),它更加占用内存。

2.可以输出的属性:

通过调用这些属性,就可以输出我们所关注的一些聚类结果:
1. cluster_centers_:最终聚类中心的坐标;
2. labels_:每个样本点对应的类别标签;
3. inertia_:每个样本点到距离它们最近的类中心的距离平方和,即SSE;
4. n_iter:实际的迭代次数;
5. n_features_in_:参与聚类的特征个数;
6. feature_names_in_:参与聚类的特征名称。

例如:
我们使用sklearn中自带的鸢尾花数据集

import warnings #屏蔽警告
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris #调用数据
iris = load_iris() #导入sklearn自带的鸢尾花数据集
X = pd.DataFrame(iris.data, columns=iris.feature_names)
print(X.head(10))

image
以萼片长度和萼片宽度为例,看看原始数据集在该二维空间的散点分布图

#取其中两个维度,绘制原始数据散点分布图
#x, y为散点坐标,c是散点颜色,marker是散点样式(如'o'为实心圆)
plt.scatter(X["sepal length (cm)"], X["sepal width (cm)"],c = "red", marker='o', label='sample')
#横坐标轴标签
plt.xlabel('sepal length')
#纵坐标轴标签
plt.ylabel('sepal width')
#plt.legend设置图例的位置
plt.legend(loc=2)
plt.show()

image
正式建模前,我们先尝试用手肘法确定最佳的K值。

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

#绘制各个K值对应的簇内平方总和,即代价函数SSE
#可以看出当K=3时,出现了“肘部”,即最佳的K值。
plt.plot(K,distortions,'bx-')
#设置坐标名称
plt.xlabel('optimal K')
plt.ylabel('SSE')
plt.show()

image
可以看出当K=3时,出现了“肘部”,即最佳的K值。

model = KMeans(n_clusters=3) #构造聚类器
model.fit(X) #拟合我们的聚类模型

获取聚类后的标签

label_pred = model.labels_ #获取聚类标签
print("聚类标签",label_pred)

image
获取聚类中心

ctr = model.cluster_centers_  #获取聚类中心
print("聚类中心",ctr)

image
聚类平方误差总和

inertia = model.inertia_ #获取SSE
print("计算得到聚类平方误差总和为",inertia)

image

#最后再看一下我们的样本聚类后的效果吧:

#绘制K-Means结果
#取出每个簇的样本
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
#分别绘出各个簇的样本
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')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend(loc=2)
plt.show()

image

posted @   lipu123  阅读(243)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示