k-means步骤
-
1、随机设置K个特征空间内的点作为初始的聚类中心
-
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
-
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
均值) -
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
Kmeans
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
-
k-means聚类
-
n_clusters: 开始的聚类中心数量
-
init: 初始化方法,默认为’k-means ++’
-
labels_:默认标记的类型,可以和真实值比较(不是值比较)
Kmeans性能评估指标
轮廓系数:
计算公式:
注: 对于每个点 i 为已聚类数据中的样本 ,bi 为 i 到其它族群的所有样本的平均距离,ai 为i 到本身簇的距离平均值
最终计算出所有的样本点的轮廓系数平均值
如果sci 小于0,说明ai 的平均距离大于最近的其他簇。聚类效果不好
如果sci 越大,说明ai 的平均距离小于最近的其他簇。聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
Kmeans性能评估指标API
sklearn.metrics.silhouette_score
silhouette_score
- sklearn.metrics.silhouette_score(X, labels)
- 计算所有样本的平均轮廓系数
- X:特征值
- labels:被聚类标记的目标值
Kmeans总结
特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点: 容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)
k-means案例分析
手写数字数据上K-Means聚类的演示
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
def kmeans():
"""
手写数字聚类过程
:return: None
"""
# 加载数据
ld = load_digits()
print(ld.target[:20])
# 聚类
km = KMeans(n_clusters=810)
km.fit_transform(ld.data)
print(km.labels_[:20])
print(silhouette_score(ld.data,km.labels_))
return None
if __name__=="__main__":
kmeans()