【Python K均值聚类算法】

K均值聚类算法

  • 1. 什么是聚类
    • 1.1 聚类概念:
    • 1.2 聚类常用的距离判定:
    • 1.3 聚类目的:
  • 2. K均值算法实现过程
    • 2.1 K是什么? Means是什么?
    • 2.2 算法基本思想
    • 2.3 算法步骤
      • 2.3.1 步骤一
      • 2.3.2 步骤二
      • 2.3.3 步骤三
      • 2.3.4 步骤四
      • 2.3.5 步骤五
  • 3. 聚类算法的模型评估
    • 3.1 SSE
    • 3.2 肘方法
    • 3.3 SC系数
  • 4. K均值算法优缺点
  • 5. 算法实例

1. 什么是聚类

1.1 聚类概念:

聚类(Clustering)是将一组样本根据一定的准则划分到不同
的组(也称为簇(Cluster) )

一个比较通用的准则是组内样本的相似性要高于组间样本的相似性

  • 从模式识别的角度来讲,聚类就是在发现数据中潜在的模式,帮助人们进行分组归类已达到更好理解数据的分布规律。
  • 常见的聚类算法包括K-Means算法、谱聚类等

1.2 聚类常用的距离判定:

欧氏距离
【Python K均值聚类算法】_第1张图片

曼哈顿距离
【Python K均值聚类算法】_第2张图片

余弦距离
【Python K均值聚类算法】_第3张图片

1.3 聚类目的:

把不同的数据点按照它们的相似与相异度分割成不同的簇,确保每个簇中的数据都是尽可能相似,而不同簇的数据尽可能相异。
【Python K均值聚类算法】_第4张图片

  • 无监督问题:数据没有标签
  • 与分类最大的区别:

分类的类别是已知的,而聚类的类别是未知的。聚类算法是无监督的学习算法,而分类算法属于有监督学习算法。
难点:如何评估,如何调参

2. K均值算法实现过程

2.1 K是什么? Means是什么?

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法
【Python K均值聚类算法】_第5张图片

2.2 算法基本思想

以空间中k个点为中心进行聚类,对最靠近他们的对象归类,通过迭代的方法逐次更新各聚类中心的值,直至得到最好的聚类结果。

2.3 算法步骤

先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。
这个过程将不断重复直到满足某个终止条件。终止条件可以是以下任何一个:

  1. 没有(或最小数目)对象被重新分配给不同的聚类。
  2. 没有(或最小数目)聚类中心再发生变化。
  3. 误差平方和局部最小。

2.3.1 步骤一

先从没有标签的含有n个元素的集合A中随机取k个元素,作为k个子集各自的重心。这里假定k=2
【Python K均值聚类算法】_第6张图片

2.3.2 步骤二

分别计算剩下的元素到k个子集重心的距离(使用欧氏距离),根据距离将这些元素分别划归到最近的子集。
【Python K均值聚类算法】_第7张图片
【Python K均值聚类算法】_第8张图片

2.3.3 步骤三

根据聚类结果,重新计算重心(即计算子集中所有元素各个维度的算术平均数)。
【Python K均值聚类算法】_第9张图片

2.3.4 步骤四

将集合A中全部元素按照新的重心然后再重新聚类。
【Python K均值聚类算法】_第10张图片

2.3.5 步骤五

重复第4步,直到聚类结果不再发生变化。
【Python K均值聚类算法】_第11张图片
【Python K均值聚类算法】_第12张图片
K-means可视化效果:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/

3. 聚类算法的模型评估

3.1 SSE

SSE:误差平方和
Sum of Squear due to Error
【Python K均值聚类算法】_第13张图片

3.2 肘方法

K值确定——Elbow method就是"肘"方法:
(1)对于n个点的数据集,迭代计算k from 1to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和
(2)平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身(3)在这个平方和变化过程中,会出现一个拐点即“肘”点,下降率突然变缓时可认为是最佳的k值
【Python K均值聚类算法】_第14张图片
K值确定—Elbow method就是“肘"方法:
在决定什么时候停止训练时,肘形的判断依据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。
【Python K均值聚类算法】_第15张图片

3.3 SC系数

轮廓系数法(Silhouette Coefficient)
结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。
【Python K均值聚类算法】_第16张图片

  1. a是Xi与同簇的其他样本的平均距离,称为凝聚度;
  2. b是Xi与最近簇中所有样本的平均距离,称为分离度
  3. 求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。
  4. 平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。
    【Python K均值聚类算法】_第17张图片

4. K均值算法优缺点

  • 优点
    原理简单,收敛速度快,容易实现,聚类效果较好,适合常规数据集
  • 缺点
    1.K值、初始点的选取不好确定
    2.对噪音和异常点比较敏感
    3.采用迭代方法得到的结果只是局部最优
    4.很难发现任意形状的簇
    【Python K均值聚类算法】_第18张图片

5. 算法实例

图像分割(Image segmentation)技术是计算机视觉领域的一个重要的研究方向,是图像语义理解的重要一环。图像分割是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像划分成互不相交的区域的过程。
以彩色图(命名为"girl.jpg")为例进行图像分割。
【Python K均值聚类算法】_第19张图片
环境:需要Python环境,依赖库:sklearn、matplotlib

from sklearn.cluster import KMeans
from matplotlib.image import imread
import matplotlib.pyplot as plt

# 读取图像数据
image = imread('girl.jpg')
# 处理图像数据
X = image.reshape(-1,3)

# KMeans聚类
segmented_imgs = []
# 簇的个数
n_colors = (10,8,6,4,2)
for n_cluster in n_colors:
    # 划分簇
    kmeans = KMeans(n_clusters=n_cluster,random_state=42).fit(X)
    # 通过标签找到该簇的中心点
    segmented_img = kmeans.cluster_centers_[kmeans.labels_]
    segmented_imgs.append(segmented_img.reshape(image.shape))


# 可视化展示
plt.figure(1,figsize=(12,8))
plt.subplot(231)
plt.imshow(image.astype('uint8'))
plt.title('Original image')
for idx,n_clusters in enumerate(n_colors):
    plt.subplot(232+idx)
    plt.imshow(segmented_imgs[idx].astype('uint8'))
    plt.title('{} colors'.format(n_clusters))
# 显示图像
plt.show()

效果:
【Python K均值聚类算法】_第20张图片

参考文献:
本人学习模式识别课程王兴、戴一为提供参考资料
特此鸣谢!!!

你可能感兴趣的:(python,深度学习,聚类,算法,均值算法)