机器学习(三)K-means聚类(手肘法、轮廓系数、可视化代码)

  • Post author:
  • Post category:其他


K-means聚类

聚类是无监督学习当中非常重要的一部分,能够在没有标签的情况下将数据分类。说到聚类,最常用也是最重要的一个算法就是K-means算法。

算法介绍

K-means是一种非常简单快速高效的算法,只需要迭代几次即可。

其原理用一句话来说就是一个“标记实例,更新中心点”的循环。通过几次迭代达到收敛,但是往往是局部最优解。

这里也提出了一种k-means++的算法,这种方法使k-means收敛到最优解的可能性很小。

其实一般直接调用sklearn的k-means默认就是k-means++算法,如果你想使用原来的k-means算法,将超参数设置为init=“random”即可

选择k值方法

k-means最重要的参数应该是类别数量了,也就是k值,一般寻找最优的k值有一下两种方法

手肘法

手肘法在很多选取最佳参数的方法中是很常见的,通过找到惯性(簇内平方和)的转折点来找到最佳k值

代码实例

from sklearn.cluster import KMeans
import pandas as pd
scores=[]
for i in range(2,8):  #这里根据你想要分成多少类来决定
    kmeans = KMeans(n_clusters=i)
    result_list = kmeans.fit_predict(data)
    score=kmeans.inertia_  #计算簇内平方和
    scores.append(score)
plt.plot(range(2,8),scores)
plt.show()
##可以看到最后在4这里有拐点所以最佳k是4

轮廓系数

我们希望达到的目的是”簇内差异小,簇外差异大“。轮廓系数刚好能作为衡量的标准,相对于手肘法来说,轮廓系数比较精确,但是也有其不适用的场景,比如不能用来比较不同算法。

http://t.csdn.cn/0kYXQ

这篇文章比较详细可以看看。

代码实例可以直接套用

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd
# 定义KMeans,以及K值
data=iris.data #这里用了鸢尾花数据集
scores=[]
for i in range(2,100):  
    kmeans = KMeans(n_clusters=i)
    result_list = kmeans.fit_predict(data)
    score = silhouette_score(data, result_list)
    scores.append(score)
plt.plot(range(2,100),scores)
print(pd.DataFrame(scores).idxmax()[0]+2) #轮廓系数越大越好(最大是1)
plt.show()

最后结果是这样的。

结果可视化

当我们确定好具体的k值后

import matplotlib.pyplot as plt 
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
n_clusters=4   #填你最终确定的k值
data=iris.data  #原始数据
kmeans=KMeans(n_clusters=k)
y_pred=kmeans.fit_predict(iris.data) #预测结果
for i in range(0,n_clusters):
    plt.scatter(data[y_pred==i,0], data[y_pred==i,1], marker='o', s=30)  #选取对应的点
plt.title('K-means 聚类散点图')

最后结果是这样。



版权声明:本文为m0_63168931原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。