Kmeans聚类算法的Sklearn实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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
如果两次迭代之间Inertia下降的值⼩于tol所设定的值,迭代就会停下
tol:浮点型,两次迭代之间inertia下降的量,
下降的量,如果两次迭代之间
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 = bels_#获取训练后对象的每个样本的标签
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()。

相关文档
最新文档