K-Means聚类算法原理


        K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means基于欧式距离认为两个目标距离越近,相似度越大。

1. 牧师-村民模型

K-Means聚类算法原理_第1张图片

2. K-Means原理初探

        K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为k个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

质心:均值,即向量各维取平均即可。

        K-Means聚类算法原理_第2张图片

         直接求解上式的最小值困难,这是np难问题,只能采用启发式的迭代方法。

工作流程:

K-Means聚类算法原理_第3张图片

(1)图a表达了初始的数据集, 假设k=2;

(2)在图b中,随机选择两个k类的对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别;

(3)如图c所示,经过计算样本和红色质心和蓝色质心的距离,得到所有样本点的第一轮迭代后的类别。

(4)如图d所示,对我们当前标记为红色和蓝色的点分别求其新的质心,新的红色质心和蓝色质心的位置已经发生了变动;

(5)图e和f重复了图c和d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终得到的两个类别如图f。

        在实际k-means算法中,一般会多次运行图c和图d,才能达到最终的比较优的类别。

算法步骤:

K-Means聚类算法原理_第4张图片

 3. K-Means优缺点

优点:

(1)原理比较简单,容易实现,收敛速度快

(2)算法的可解释度比较强,复杂度低

(3)聚类效果较优

(4)主要需要调参数是簇数k

缺点:

(1)k值难确定

(2)复杂度与样本呈线性关系,不是凸的数据集比较难收敛

(3)很难发现任意形状的簇

(4)采用迭代方法,得到的结果只是局部最优

(5)对噪音和异常点比较敏感

 4. 算法调优与改进

针对优缺点,很多调优方式,如数据预处理(去除异常点),合理选择k值,高纬映射等。

4.1 数据预处理

        K-means 的本质是基于欧式距离的数据划分算法,均值和方差大的维度将对数据的聚类产生决定性影响。所以未做归一化处理和统一单位的数据是无法直接参与运算和比较的。常见的数据预处理方式有:数据归一化,数据标准化。

        此外,离群点或者噪声数据会对均值产生较大的影响,导致中心偏移,因此我们还需要对数据进行异常点检测。

4.2 合理选择k值

        K 值的选取对 K-means 影响很大,这也是 K-means 最大的缺点,常见的选取 K 值的方法有:手肘法、Gap statistic 方法。

(1)手肘法:

K-Means聚类算法原理_第5张图片

 核心指标:

K-Means聚类算法原理_第6张图片

K-Means聚类算法原理_第7张图片

 核心思想:

  • 随着k增大,样本划分会更加精细,每个簇的聚合程度逐渐提高,那么误差平方和SSE会逐渐变小
  • 当k小于真实聚类数时,k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,

    而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数;

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt 

df = pd.read_csv("",encoding = "gbk")
## 利用sse 选择k
sse = []
for k in range(1,9):
  estimator = KMeans(n_cluster = k) ## 构造聚类器
  estimator.fit(df[["r","f","m"]])
  sse.append(estimator.inertia_) # estimator.inertia_ 获取聚类准则的总和 样本到其最近聚类中心的平方距离总和
x = range(1,9)
plt.xlabel("k")
plt.ylabel("sse")
plt.plot(x,sse,"o-")
plt.show()

 

 

你可能感兴趣的:(python,机器学习,python,数据结构,职场和发展)