k-means聚类
非监督学习
把数据划分为k个类别
-知道类别个数
-不知道类别个数 超参数
k = 3
步骤:
1、随机在数据中抽取3个样本,当做3个类别的中心点(k1, k2, k3)
2、计算其余的点分别到这三个中心点的距离,
每一个样本有3个距离(a, b, c)
从中选出举例最近的一个点作为自己的标记,行成3个族群
3、分别计算这3个族群的平均值,把3个平均值与之前的3个旧中心点进行比较
4、如果相同结束聚类,如果不同,把这3个平均值当做新的中心点重复第2步
聚类评估标准
轮廓系数
计算公式
对于每个点i 为已聚类数据中的样本,
bi为i 到其他族群的所有样本的距离最小值
ai为i 到本身族群的距离平均值
最终计算出所有样本点的轮廓系数平均值
极端:
bi>>ai ,sci=1 完美
ai>>bi ,sci=−1 最差
轮廓系数取值[-1, 1]
总结
采用迭代算法,直观易懂并且非常实用
缺点:容易收敛到局部最优解(多次聚类)
聚类,用在分类之前
代码示例
# -*- coding: utf-8 -*- from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt # 生成数据 X, y = make_blobs(n_samples=200, centers=3, n_features=5, random_state=0) # k-means聚类 km = KMeans(n_clusters=3) km.fit(X) y_predict = km.predict(X) # 评估聚类效果 print(silhouette_score(X, y_predict)) # 0.72 # 绘制聚类结果图 color = ["red", "green", "blue"] colors = [color[i] for i in y_predict] plt.figure() plt.scatter(X[:, 1], X[:, 2], color=colors) plt.savefig("a.png")

