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 版权协议,转载请附上原文出处链接和本声明。