当前位置:   article > 正文

聚类模型——k-means_k-means聚类

k-means聚类
“物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;
也可以探究不同类之间的相关性和主要差异。
聚类和分类的区别:分类是已知类别的,聚类未知类别

目录

一、K-means

1,算法流程

K-means聚类的算法流程:

图解过一遍:

2,WCSS(Within-Cluster Sum of Squares)  簇内平方和评估

 3,题目复习

1,EG1

2,EG2

3,EG3

 4,EG4

 5,EG5​

二、K-means使用

1.sklearn库对鸢尾花(iris)数据集的聚类

2.手肘法ELBOW

3,应用——图像压缩 


一、K-means

1,算法流程

K-means聚类的算法流程:

        一、指定需要划分的簇[cù] 的个数K值(类的个数);
        二、随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点);
        三、计算其余的各个数据对象到这K个初始聚类中心距离,把数据对象划归到距离它最近的那个中心所处在的簇类中;
        四、调整新类并且重新计算出新类的中心;
        五、循环步骤三和四,看中心是否收敛(不变),如
果收敛或达到迭代次数则停止循环;
        六、结束。

 

图解过一遍:

1)计算各点与各重心间的距离

2)将最近的重心所在簇作为该点所属的簇

 (3) 计算每个簇的平均值,作为其重心

 (4) 重复步骤2和步骤3

 

2,WCSS(Within-Cluster Sum of Squares)  簇内平方和评估

WCSS 随着簇的增加而变小,所以可以用于相同数量的簇的情况下的比较。WCSS 指的是对所有簇计算其所属的数据点与簇的重心之间距离的平方和,并将它们相加得到的值。这个值越小,说明聚类效果越好。

随着簇的增加,WCSS 会变小,但有时 WCSS 的变小幅度会从簇的数量为某个值时开始放缓。通过使用 Elbow 方法,可以确定合理的簇的数量。
                        ​​​​​​​        \underset{\mathbf{S}}{\arg \min } \sum_{\mathrm{i}=1}^{\mathrm{k}} \sum_{\mathbf{x} \in \mathrm{S}_{\mathrm{i}}}\left\|\mathbf{x}-\boldsymbol{\mu}_{\mathrm{i}}\right\|^{2}=\underset{\mathbf{S}}{\arg \min } \sum_{\mathrm{i}=1}^{\mathrm{k}}\left|\mathrm{S}_{\mathrm{i}}\right| \operatorname{Var} \mathrm{S}_{\mathrm{i}}

  1. def WCSS_(X, M, P):
  2. # X:numpy二维数组,形状是(n,k),表示n个样本属性。
  3. # M:numpy二维数组,形状是(m,k),表示m个聚类中心。
  4. # P:numpy一维数组,形状是(n,),表示聚类类别,每个值的取值范围是[0,m-1]的整数。
  5. m = M.shape[0]
  6. WCSS = 0
  7. for i in range(m):
  8. WCSS += ((X[P==i] - M[i])**2).sum()
  9. return WCSS

 3,题目复习

1,EG1

 B注意是负的WCSS

2,EG2

 有n条数据,代表要计算n条数据,n条数据的k个特征与m重心间的距离

选D

3,EG3

 这要通过每个数据到每个中心的距离进行比较,距离小的归属哪个中心,这样就有n个点距离和m个中心进行比较,需要进行n*m次

 4,EG4

 这题就没必要初始化中心点去搞了,画个图很直观看得出两个类的中心点(4,5)和(3,1)吧

 

 5,EG5

 时间复杂度太大

 

二、K-means使用

1.sklearn库对鸢尾花(iris)数据集的聚类

  1. from sklearn.cluster import KMeans
  2. from sklearn.datasets import load_iris
  3. iris = load_iris()
  4. n_clusters = 3 # 将簇的数量设置为3
  5. model = KMeans(n_clusters=n_clusters)
  6. model.fit(iris.data)
  7. print(model.labels_) # 各数据点所属的簇
  8. print(model.cluster_centers_) # 通过fit()计算得到的重心
  9. print("score:", -model.score(iris.data))

2.手肘法ELBOW

        手肘法的核心思想是:随着聚类数k的增大样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。

        并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

  1. iris = load_iris()
  2. n_list = [i for i in range(2,11)]
  3. scores = []
  4. for n_clusters in n_list:
  5. model = KMeans(n_clusters=n_clusters)
  6. model.fit(iris.data)
  7. scores.append(-model.score(iris.data))
  8. scores = np.array(scores)
  9. plt.plot(n_list, scores)

 

3,应用——图像压缩 

  1. from PIL import Image
  2. # 导入图片
  3. origin_img = np.array(Image.open('/data/bigfiles/tree.jpg'), dtype=float)/255
  4. # 查看原始图片
  5. plt.imshow(origin_img)
  6. plt.axis('off')

 

  1. from sklearn.utils import shuffle
  2. from sklearn.cluster import KMeans
  3. # 变成 二维矩阵,第一维是所有像素点,第二维是3种颜色通道
  4. img_flattened = origin_img.reshape(height*width, 3)
  5. image_array_sample = shuffle(img_flattened)[:1000] # 随机取1000个点。
  6. model = KMeans(n_clusters=64)
  7. model.fit(image_array_sample) # 通过聚类分析,得到64个点
  8. # 将64个聚类点记录起来,命名为 “调色板” (palette)
  9. palette = model.cluster_centers_
  10. print(palette.shape) # 64种颜色
  11. # 计算所有颜色最接近的颜色号
  12. cluster_assignments = model.predict(img_flattened)
  13. print(cluster_assignments)
  14. # 根据颜色号取出相应颜色作为像素点的颜色
  15. compressed_image = np.array([palette[i] for i in cluster_assignments], dtype=float)
  16. # 将像素列表回复成图像
  17. compressed_image = compressed_image.reshape(height, width, depth)
  18. # 查看压缩后的图片
  19. plt.imshow(compressed_image)
  20. plt.axis('off')

 

 

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

闽ICP备14008679号