一,本文关注以下内容:

  • K-means的原理

  • 初始类中心的选择和类别数K的确定

  • K-means和EM算法、高斯混合模型的关系

二:K-means的原理

K-means(K均值聚类)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使每个样本与其所属类中心的距离之和最小。

定义损失函数

假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别。

假定K值已经给定,第k个类别的中心定义为μk,k=1,2,..., K,μk是一个m维的特征向量。

我们需要找到每个样本所属的类别,以及一组向量{μk},使每个样本与其所属类别的中心μk的距离之和最小。

聚类需要根据样本之间的相似度,对样本集合进行划分,将相似度较高的样本归为一类。

可以通过计算样本之间的欧氏距离、马氏距离、余弦距离或相关系数,来衡量样本之间的相似度。

而K-means是用欧氏距离的平方来度量样本之间的相似度。欧式距离的平方公式如下:

接着,把所有样本与所属类中心的距离平方和,定义为损失函数:

其中rnk∈{0,1},n=1,2,...,N,k=1,2,...,K,如果rnk=1,那么表示样本xn属于第k类,且对于j≠k,有rnj=0,也就是样本xn只能属于一个类别。

于是我们需要找到{}和{}的值,使得距离平方之和J最小化。

进行迭代

K-means是一种迭代算法,每次迭代涉及到两个连续的步骤,分别对应rnk的最优化和μk的最优化,也对应着EM算法的E步(求期望)和M步(求极大)两步。

首先,为μk选择一些初始值,也就是初始化K个类中心。

然后,执行以下两个步骤,直至收敛。

第一步:保持​​​​​​​固定,选择来最小化J,也就是把样本指派到与其最近的中心所属的类中,得到一个聚类结果。

第二步:保持固定,计算​​​​​​​来最小化J,也就是更新每个类别的中心。

具体来说,也就是E步和M步:

E步:在类中心μk已经确定的情况下,最优化 

这一步比较简单,我们可以分别对每个样本xn进行最优化。

将某个样本分配到第k个类别,如果该样本和第k个类别的距离最小,那么令rnk=1。

对N个样本都这样进行分配,自然就得到了{},使所有样本与类中心的距离平方和最小,从而得到了一个聚类结果。

M步:确定了数据集的一种划分,也就是确定{}后,最优化

目标函数J是μk的一个二次函数,令它关于μk的导数为零,就可以求得使目标函数达到最小值的μk,即

解出μk的结果为:

这个μk就是类别k中所有样本的均值,所以把这个算法称为K均值聚类。

重新为样本分配类别,再重新计算每个类别的均值,不断重复这两个步骤,直到聚类的结果不再改变。

需要注意以下几点:

  • K-means可能收敛到目标函数J的局部极小值,不能保证收敛到全局最小值。

  • 聚类之前,需要对数据集进行标准化,使样本的均值为0,标准差为1。

  • 初始类中心的选择会直接影响聚类结果,选择不同的初始类中心,可能会得到不同的聚类结果。

  • K均值聚类算法的复杂度是O(mnk),m是样本的特征维度,n是样本个数,k是类别个数。

三:初始化类中心和确定类别数

K-means的思想比较简单,关键在于初始类中心的选择和类别数K的确定,这对聚类的结果有比较大的影响。

1.初始化类中心

(一)第一种方法

用层次聚类法进行初始聚类,然后把这些类中心作为K均值聚类的初始类中心。

层次聚类的复杂度为O(mn3),m是样本的特征维度,n是样本个数,复杂度也是蛮高的,那为什么用层次聚类的结果来初始化类中心呢?

我想是因为层次聚类的结果,完全是由算法确定的,是一个客观的结果。这样就把K-means的初始类中心的选择问题,由主观决定变成了客观决定。

(二)第二种方法

首先随机选择一个点,作为第一个初始类中心点,然后计算该点与其他所有样本点的距离,选择距离最远的点,作为第二个初始类的中心点,以此类推,直到选出K个初始类中心点。

类别数K的确定

(一)轮廓系数

轮廓系数(Silhouette Coefficient)可以用来判定聚类结果的好坏,也可以用来确定类别数K。

一个好的聚类结果,要能保证类别内部样本之间的距离尽可能小(密集度),而类与类之间样本的距离尽可能大(离散度)。

轮廓系数就是一个用来度量聚类的密集度和离散度的综合指标。

轮廓系数的计算过程和使用如下:

①计算样本xi到同类Ck其他样本的平均距离ai,将ai称为样本xi的簇内不相似度,ai越小,说明样本xi越应该被分配到该类。

②计算样本xi到其他类Cj所有样本的平均距离,j=1, 2 ,..., K,j≠k,称为样本xi与类别Cj的不相似度。

定义样本xi的簇间不相似度:=min{, bi2, ...,bij,..., },j≠k,bi越大,说明样本xi越不属于其他簇。

③根据样本xi的簇内不相似度ai和簇间不相似度bi,定义样本xi的轮廓系数si,作为样本xi分类合理性的度量。

④轮廓系数范围在[-1,1]之间,该值越大,聚类结果越好。

si接近1,则样本xi被分配到类别Ck的结果比较合理;si接近0,说明样本xi在两个类的边界上;si接近-1,说明样本xi更应该被分配到其他类别。

⑤计算所有样本的轮廓系数si的均值,得到聚类结果的轮廓系数S,作为聚类结果合理性的度量。轮廓系数越大,聚类结果越好。

⑥使用不同的K值进行K均值聚类,计算各自的轮廓系数S,选择较大的轮廓系数所对应的K值。

(二)肘部法则

K-means的损失函数,是所有样本到类别中心的距离平方和J,也就是误差平方和SSE:

从类别数K=1开始,当类别数K小于真实的类别数时,随着类别数的增大,SSE会快速地下降。

而当类别数到达真实类别数的临界点后,SSE开始缓慢下降,也就是说SSE和K的关系曲线一个肘部形状,这个肘部所对应的K值可以认为是合适的类别数。

那么我们选择不同的K值,训练多个模型,然后计算模型的SSE,选择SSE开始缓慢下降时的K值,作为聚类的类别数。

如下图,可以选择4或5作为聚类的类别数。

三:与EM、GMM的关系

这一部分,需要EM算法和高斯混合模型的前置知识。

这篇是我在博客园上总结的:《聚类之高斯混合模型与EM算法》

要点总结

关于K-means与EM算法、高斯混合模型的关系,主要有以下三点:

1:K-means是一种非概率的聚类算法,属于硬聚类方法,即一个样本只能属于一个类(类与类之间的交集为空)。

相比之下,高斯混合模型(GMM)是一种基于概率的聚类算法,属于软聚类方法,每个样本按照一个概率分布,属于多个类。

2:K-means在一次迭代中的两个步骤,可以看做是EM算法的E步和M步。

而且K-means可以看做,用EM算法对⾼斯混合模型进行参数估计的⼀个特例,也就是高斯混合模型中分模型的方差σ2相等,为常数,且σ2→0时的极限情况。

3:K-means和基于EM算法的高斯混合模型,对参数的初始化值比较敏感。

由于K-means的计算量远小于基于EM算法的高斯混合模型,所以通常运⾏K-means,来找到⾼斯混合模型的⼀个初始值,再用EM算法进行调节。

具体而言,用K-means划分K个类别,再用各类别样本所占的比例,来初始化K个分模型的权重;用各类别中样本的均值,来初始化K个高斯分布的期望;用各类别中样本的方差,来初始化K个高斯分布的方差。

2  从图形来理解

为了理解以上几点,尤其是第2点,我们可以先从图形来看。

假设高斯混合模型由4个高斯分布混合而成,高斯分布的密度函数如下。。

Ø(y|θk)是第k个高斯分布的概率密度,被称为第k个分模型,参数为θk=(μk, αk2)。

令均值μ=[0,2,4,6],方差σ2=[1,2,3,1],则4个高斯分布的概率密度函数的图形如下。

我们可以看到,4个图形之间有重叠的部分,也就说明每个样本可以按照一个概率分布αk,属于多个类,只是属于某类的概率大些,属于其他类的概率小些。

这表明高斯混合模型是一种软聚类方法。

然后令均值μ不变,方差σ2=[0.01, 0.01, 0.01, 0.01],也就是4个分模型的方差σk2相等,而且σk2→0,那么4个高斯分布的图形如下。

每个高斯分布的图形之间没有交集,那么每个样本只属于一个类,变成了硬聚类。

这也就是高斯混合模型的特例:K-means。

从公式来理解

用EM算法对高斯混合模型进行极大似然估计,在E步,我们需要基于第i轮迭代的参数θ(i)=(αk, μk, σk)来计算是第j个样本yj来自于第k个高斯分布分模型的概率,k=1,2,...,K。

在高斯混合模型中,γj是一个K维的向量,也就是第j个样本属于K个类的概率。假设分模型的方差σk2都相等,且是一个常数,不需要再估计,那么在EM算法的E步我们计算γjk

考虑σ2→0时的极限情况,如果样本yj属于第k类的概率最大,那么该样本与第k类的中心点的距离非常近,(yj - μk)2将会趋于0,于是有:

也就是样本yj属于第k类的概率近似为1,属于其他类别的概率近似为0,也就成为了一种硬聚类,也就是K-means。

其实在σ2→0的极限情况下,最大化高斯混合模型的完全数据的对数似然函数的期望,等价于最小化K均值聚类的目标函数J。

比如有4个高斯分布,样本yj的γj为[0.55, 0.15, 0.2, 0.1],那么属于第1类的概率γj1最大。

而当分模型的方差σ2→0时,样本yj的γj可能为[0.98, 0.01, 0.005, 0.005],也就是该样本直接被分配到了第1类,成为了硬聚类。

附:绘图代码

import matplotlib.pyplot as plt
import math
import numpy as np""" 1: 4个高斯分布的均值 """
u1 = 0
u2 = 2
u3 = 4
u4 = 6""" 2: 4个高斯分布的标准差 """
sig1 = math.sqrt(1)
sig2 = math.sqrt(2)
sig3 = math.sqrt(3)
sig4 = math.sqrt(1)def x(u,sig):return np.linspace(u - 5*sig, u + 5*sig, 100)x1 = x(u1,sig1)
x2 = x(u2,sig2)
x3 = x(u3,sig3)
x4 = x(u4,sig4)""" 3: 概率密度 """
def y(x,u,sig):return np.exp(-(x - u) ** 2 /(2* sig**2))/(math.sqrt(2*math.pi)*sig)y1 = y(x1,u1,sig1)
y2 = y(x2,u2,sig2)
y3 = y(x3,u3,sig3)
y4 = y(x4,u4,sig4)plt.plot(x1, y1, "r-")
plt.plot(x2, y2, "g-")
plt.plot(x3, y3, "b-")
plt.plot(x4, y4, "m-")
plt.xticks(range(-6,16,2))
plt.show()

参考资料:

1、《统计学习方法》(第二版)

2、《Pattern Recognition and Machine Learning》

K-means聚类与EM算法相关推荐

  1. 聚类之K均值聚类和EM算法

    这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...

  2. 聚类和EM算法——K均值聚类

    20211116 数据分析 | 聚类分析--kmean kmeans最优k值的确定方法-手肘法和轮廓系数法 - 简书 python大战机器学习--聚类和EM算法 注:本文中涉及到的公式一律省略(公式不 ...

  3. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  4. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  5. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  6. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  7. python机器学习案例系列教程——极大似然估计、EM算法

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 极大似然 极大似然(Maximum Likelihood)估计为用于已知模型的参数估计的统计学方法. 也就是求使得似然函数最大的代估参 ...

  8. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)

    文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...

  9. 机器学习理论《统计学习方法》学习笔记:第九章 EM算法及其推广

    第九章 EM算法及其推广 概述 EM算法 EM算法的收敛性 EM算法实现 K-Means与高斯混合模型 K-Means 高斯混合模型 概述 EM算法是一种迭代算法,1977年由Dempster等人总结 ...

最新文章

  1. 工作5年才有自己博客...汗...
  2. 编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为3.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?...
  3. 导入不了css,CSS不导入。
  4. access数据库为什么一直登陆_为什么要养成用Access数据库保存数据的习惯?
  5. python 进程池_Python实践17-进程池
  6. vue中使用vuex结合sessionStorage做的登录功能
  7. [转载] numpy教程:矩阵matrix及其运算
  8. 算法工程师当前选哪个方向好?1,计算机视觉;2,自然语言处理;3,风控;4,推荐系统?...
  9. Ubuntu下Postfix邮件服务器安装及基本的设置
  10. 16.Mac 修改主机名
  11. 乘风破浪:LeetCode真题_019_Remove Nth Node From End of List
  12. 拓端tecdat|R语言多维数据层次聚类散点图矩阵、配对图、平行坐标图、树状图可视化城市宏观经济指标数据
  13. Cloudflare发布全球最快的DNS
  14. 技术方案评审文档模版
  15. Synthesys:语音合成和视频生成平台
  16. android 吧文字读出来,android学习之文字语音朗读
  17. 简易计算器(C语言实现)
  18. 在局域网中搭建自己的网站
  19. postgresql12 pgpool搭建(3)
  20. C语言递归解决八皇后问题

热门文章

  1. centos7:yum -y install gcc python36-devel bzip2-devel sqlite-devel openssl-devel readline-devel xz-d
  2. 掌财社:Java项目案例之客户信息管理系统的实现
  3. ModuleNotFoundError: No module named ‘win32con‘
  4. SaveLoad--Unity存档读档的学习总结
  5. C#毕业设计——基于C#+asp.net+sqlserver在线论文提交系统设计与实现(毕业论文+程序源码)——在线论文提交系统
  6. json解析_json解析
  7. 查找python包路径sys_2.2 最快查看包搜索路径的方式
  8. 如何把扫描图片转换成word
  9. 计算机中的物理地址与内存
  10. 项目构建,发布平台(一)