聚类模型概述
- “物以类聚,人以群分”,将数据集中相似的样本分到一组, 每个组称为一个簇(cluster),相同簇的样本之间相似度较高,不同簇的样本之间相似度较低
- 样本之间的相似度通常是通过距离定义的,距离越远,相似度越低
K-Means算法原理
K-Means的目标是要将样本点划分为K个簇,找到每个簇的质心(1≤k≤K),并且最小化所有样本点到所属簇质心距离的平方和
其中,若样本被划分到簇k中,那么,对于 ,有,即
K-Means算法流程
- 设置初始质心
- Repeat:
- 将每个样本指派到最近的质心
- 用每个簇的样本均值来更新质心
- 直到目标函数变化程度小于预设的阈值,或迭代次数大于预设的最大迭代次数,停止迭代
人工给出初始质心
随机选择初始质心
- 该方法容易陷进局部最优解,不容易得到最优的聚类结果
改进上述情况可采取下列方案:
- 多次运行K-Means算法,每次随机选择不同的初始质心,从这些结果中选择最优(目标函数最小)的聚类结果
- 使用K-Means++算法来初始化质心,主要思路是选择的初始质心尽可能的互相远离
K-Means调用参数
| 参数 | 说明 |
|---|---|
| n_clusters | 希望分成的簇数,默认为8 |
| init | 设置初始质心的方法{'k-means++'( 默认),'random'或'ndarray'(自行定义) |
| tol | 目标函数变化程度的阈值,小于阈值则停止迭代,默认为1e-4 |
| max_iter | 最大迭代次数阈值,大于阈值则停止迭代,默认为300 |
| n_init | 随机使用不同质心来运行k-means算法的次数,默认为10 |
| random_state | 设置随机种子 |
构建K-means聚类模型
from sklearn.cluster import KMeans
# 训练模型
model = KMeans(n_clusters=3, random_state=111).fit(auto_scaled)
# 每个样本的标签
auto_label = model.labels_
# 每个簇的质心
auto_cluster = model.cluster_centers_
K-means性能评估指标
-
可以使用许多方法来评估聚类的性能,这里采用轮廓系数( Silhouette Coefficient )来评估
-
对于每个样本,轮廓系数需要计算两个值a, b :
- a:这个样本和同簇内其它样本间的平均距离
- b:这个样本和距离第二近的簇内所有样本间的平均距离
- 单个样本的轮廓系数计算如下:
- 所有样本的轮廓系数则由每个样本的轮廓系数求平均得到
-
轮廓系数取值在-1到1之间,越接近1说明聚类效果越好