1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平 均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚类
n_clusters: 开始的聚类中心数量
init: 初始化方法,默认为’k-means ++’
labels_:默认标记的类型,可以和真实值比较(不是值比较)
轮廓系数:
计算公式:
注: 对于每个点 i 为已聚类数据中的样本 ,bi 为 i 到其它族群的所有样本的平均距离,ai 为i 到本身簇的距离平均值
最终计算出所有的样本点的轮廓系数平均值
如果sci 小于0,说明ai 的平均距离大于最近的其他簇。聚类效果不好
如果sci 越大,说明ai 的平均距离小于最近的其他簇。聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
sklearn.metrics.silhouette_score
特点分析: 采用迭代式算法,直观易懂并且非常实用
缺点: 容易收敛到局部最优解(多次聚类) 需要预先设定簇的数量(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()