Kmeans聚类算法的Sklearn实现


一、KMeans算法原理

1.1 KMeans算法关键概念:簇与质心

簇:KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上看是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。

质心:簇中所有数据的均值U通常被认为这个簇的“质心”。

1.2 KMeans算法的实现原理

KMeans聚类算法实现的原理就是簇内数据相似性最高,不同簇类的数据的相似性最低。进而可以理解为在簇内的所有数据与质心之间的距离和最小,簇间的质心的距离越大学好,通常使用距离公式来衡量。在sklearn中KMeans通常使用簇内平方(Inertia)和来衡量簇内的距离。

实现步骤如下:

1、随机抽取K个样本作为最初的质心

2、开始循环:

  2.1、将每个样本点分配到离他们最近的质心,生成K个簇

  2.2、对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心

3、当质心的位置不再发生变化,迭代停止,聚类完成。

实现过程可参考下图理解

二、sklearn中的KMeans使用学习

2.1、KMeans实现算法API

sklearn.cluster.KMeans( n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto', )

n_cluster:是聚类的个数,是个超参数,默认值是8;

init:是初始化质心的方法,默认“K-means++”,可选参数“random";

n_init:用不同的质心初始化值运行的次数,默认是10,每一次算法运行时开始的centroid seeds是随机生成的, 这样得到的结果也可能有好有坏. 所以要运行算法n_init次, 取其中最好的。

random_state:控制每次质心随机初始化的随机种子

max_iter:单次运行KMeans算法的最大迭代次数,默认值是300

tol:浮点型,两次迭代之间inertia下降的量,如果两次迭代之间Inertia下降的值小于tol所设定的值,迭代就会停下

precompute_distances:预计算距离,计算速度更快但占用更多内存 ====>类型:(auto,True,False)三个值可选,,默认值=“auto”

verbose:是否输出详细信息====>类型:整型,默认值=0

copy_x:是否对输入数据继续copy 操作====> 布尔型,默认值=True

n_jobs:使用进程的数量,与电脑的CPU有关====>类型:整型,默认值=1。

algorithm:k-means算法的种类====>(“auto”, “full” or “elkan”)三个值可选,默认值=‘auto’

“full”采用的是经典EM-style算法的。

“elkan”则在使用三角不等式时显得更为高效,但目前不支持稀疏数据。

“auto”则在密集数据时选择“elkan”,在稀疏数据是选择“full”。

2.2、KMeans算法聚类评估的重要属性 

轮廓系数:在使用KMeans进行聚类时,一般数据是没有标签的,这样的聚类。是完全依赖于评价簇内的稠密成都(簇内差异小)和簇间离散程度(簇外差异大)来评估聚类的效果,其中轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,它能够同时行两:1)样本与其自身所在的簇中的其他样本的相似度a,等于样本于同一簇中所有其他点之间的平均距离,2)样本于其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离。根据聚类的要求”簇内差异小,簇外差异大”,我们希望b永远大于a,并且大的越多越好。单个样本的轮廓系数为:s = b-a/max(a,b).很容易理解轮廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相似度一致,两个簇本应该是一个簇。可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差。如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越高,则聚类是合适的。如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得太大或者太小。在sklearn中,我们使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但我们还有同在metrics模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数。

2.3、重要属性与重要接口

1、cluster_centers_:收敛到的质心坐标,

2、labels_:每个样本点对应的标签

3、inertia_:每个样本点到距离他们最近的簇心的均方距离,又叫做“簇内平方和”

4、n_iter_:实际的迭代次数

5、fit:拟合模型,计算K均值的聚类结果

6、fit_predict:返回每个样本所对应的簇的索引,计算质心并且为每个样本预测所在的簇内的索引,功能相当于fit再predict

7、get_params:获取该类的参数

8、score:返回聚类后的inertia,即簇内平方和的负数

 3、示例代码

3.1、构建的数据集 

 
 

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#自己创建数据集
X,Y = make_blobs(n_samples=1000,n_features=2,centers=4)
#make_blobs创建数据集,参数n_samples代表创建的数据集的个数,
#n_features代表创建数据集的特征个数,
#n_center代表创建数据的中心的个数
#X返回的使数据的个数*特征,Y返回的是属于的类别即标签
fig = plt.figure(figsize=(20,12))
plt.rcParams['font.family'] = 'KaiTi' # 设置字体样式
plt.rcParams['axes.unicode_minus'] =False
plt.subplot(2,3,1)
colors = ['red','pink','orange','gray','blue','green']
for i in range(4):
plt.scatter(X[Y==i,0],X[Y==i,1],marker="o",s=8,color=colors[i])
plt.title("生成的数据集图")
#实例化一个KMeans对象,检测不同n_cluster下的参数
for i in range(2,7):
cluster = KMeans(n_clusters= i )
#对对象进行训练拟合
cluster = cluster.fit(X)
y_pred = cluster.labels_#获取训练后对象的每个样本的标签
centtrod = cluster.cluster_centers_
plt.subplot(2,3,i)
for j in range(i):
plt.scatter(X[y_pred==j,0],X[y_pred==j,1],marker="o",s=8,color=colors[j])
plt.scatter(centtrod[:,0],centtrod[:,1],s=28,marker="H",color = "",edgecolors="purple")
plt.title("分了%d类的数据图"%i)

 
 

plt.show()

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM