数据分析算法应用之Kmeans无监督聚类的强大

404 阅读1分钟

聚类模型概述

  • “物以类聚,人以群分”,将数据集中相似的样本分到一组, 每个组称为一个簇(cluster),相同簇的样本之间相似度较高,不同簇的样本之间相似度较低
  • 样本之间的相似度通常是通过距离定义的,距离越远,相似度越低

K-Means算法原理

K-Means的目标是要将样本点划分为K个簇,找到每个簇的质心uku_k (1≤k≤K),并且最小化所有样本点到所属簇质心距离的平方和

J = i=1n k=1k rikxiuk2J = \displaystyle\sum_{i=1}^n \displaystyle\sum_{k=1}^k r_{ik}|x_i-u_k|^2

其中rik0,1r_{ik}∈{0,1} ,若样本xix_i 被划分到簇k中,那么rik=1r_{ik}=1 ,对于 jkj\not= k ,有rij=0r_{ij}=0 ,即 k=1krik=1\displaystyle\sum_{k=1}^k r_{ik}=1

K-Means算法流程

  1. 设置初始质心
  2. Repeat:
  • 将每个样本指派到最近的质心
  • 用每个簇的样本均值来更新质心
  1. 直到目标函数变化程度小于预设的阈值,或迭代次数大于预设的最大迭代次数,停止迭代

人工给出初始质心

随机选择初始质心

  • 该方法容易陷进局部最优解,不容易得到最优的聚类结果

改进上述情况可采取下列方案:

  • 多次运行K-Means算法,每次随机选择不同的初始质心,从这些结果中选择最优(目标函数最小)的聚类结果
  • 使用K-Means++算法来初始化质心,主要思路是选择的初始质心尽可能的互相远离

K-Means调用参数

sklearn.org/modules/gen…

参数说明
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:这个样本和距离第二近的簇内所有样本间的平均距离
    • 单个样本的轮廓系数计算如下:s=bamax(a,b)s=\frac{b-a} {max(a,b)}
    • 所有样本的轮廓系数则由每个样本的轮廓系数求平均得到
  • 轮廓系数取值在-1到1之间,越接近1说明聚类效果越好