聚类算法与K-means实现
聚类算法与K-means实现
一、聚类算法的数学描述:
区别于监督学习的算法(回归,分类,预测等),无监督学习就是指训练样本的 label 未知,只能通过对无标记的训练样本的学习来揭示数据的内在规律和性质。无监督学习任务中研究最多的就是聚类算法(clustering)。我们假定一个样本集:
| 编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | 是 |
| 2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 是 |
| 3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 是 |
| 4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 是 |
| 5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 是 |
该样本集中包含5个样本数据,聚类算法的目的就是将这 5 个样本划分为互不相交的子集,每个子集被称为一个簇。比如,我们以色泽对样本进行划分,可以得到3个簇,分别为:\(\lambda_{1} = \{1,4\}, \lambda_{2} = \{2,3\},\lambda_{3} = \{5\}\)。值得说明的是,在实际的聚类过程中,没有 “色泽” 的概念,聚类过程仅仅能自动形成簇结构,而簇所对应的概念语义是人为赋予的。用数学语言描述上述过程:
假设样本集 \(D=\{x_{1},x_{2},...,x_{m}\}\) 包含 \(m\) 个无标记样本,每个样本由 \(n\) 维特征来描述,即 \(x_{i} = \{x_{i1},x_{i2},...x_{in}\}\) 。那么聚类算法的目的就是将样本集 \(D\) 划分为 \(k\) 个不相交的簇:\(D = \bigcup_{l=1}^{k} C_{l}\),且 \(C_{i} \bigcap C_{j} = \phi,\forall i\neq j\)。我们用 \(\lambda = \{\lambda_{1}, \lambda_{2},...\lambda_{k}\}\) 来代表 \(k\) 个簇的标记,因此第 \(j\) 个簇的所有元素可以标记为 \(C_{\lambda_{j}}\) 。对应上述过程,\(m=5, k=3, \lambda=\{青绿,乌黑,浅白\}\)。
二、聚类算法的度量
每一个样本可能有 \(n\) 个特征描述,那么有没有一个度量标准来判断聚类算法的好坏呢?其中一个最重要的原则就是:相同簇的样本尽可能相似,不同簇的样本尽可能不同。聚类的性能度量有两类:1)将聚类结果与某个参考模型进行比较,称为外部指标;2)直接考察聚类结果而步利用任何参考模型,称为内部指标。
2.1 外部指标法:
对数据集 \(D=\{x_{1},x_{2},...,x_{m}\}\) ,假设通过聚类给出的簇划分为 \(C = \{C_{1}, C_{2},...,C_{k}\}\),而参考模型给出的簇划分为\(C^{*} = \{C_{1}^{*}, C_{2}^{*},...,C_{s}^{*}\}\)。相应地,用 \(\lambda,\lambda^{*}\) 来分别表示与 \(C, C^{*}\) 对应的标记向量,于是我们定义如下:
b = |SD|,\quad SD = \{(x_{i},x_{j}) | \lambda_{i} = \lambda_{j}, \lambda_{i}^{*} \ne \lambda_{j}^{*}\} \\
c = |DS|,\quad DS = \{(x_{i},x_{j}) | \lambda_{i} \ne \lambda_{j}, \lambda_{i}^{*} = \lambda_{j}^{*}\} \\
d = |DD|,\quad DD = \{(x_{i},x_{j}) | \lambda_{i} \ne \lambda_{j}, \lambda_{i}^{*} \ne \lambda_{j}^{*}\} \\
\]
刚一看到上述公式会感觉有点懵,那么我们来直观地感受一下上述表达式描述的是什么。以 \(a\) 为例,\(SS\) 代表在 \(C\) 中属于同一类且在 \(C^{*}\) 中属于同一类的样本,那么 \(a\) 就等于 \(SS\) 中样本的个数。以此类推,\(b\) 代表在 \(C\) 中属于同一类,而在 \(C^{*}\) 中属于不同类的样本个数;\(c\) 代表在 \(C\) 中属于不同类,而在 \(C^{*}\) 中属于同一类的样本个数;\(d\) 代表在 \(C\) 中属于不同类,而在 \(C^{*}\) 中也属于不同类的样本个数。看到这,有没有类似于评价指标中的精准率,召回率?https://www.cnblogs.com/zhaozhibo/p/14954685.html。由于每个样本对 \((x_{i},x_{j})\) 只能出现在一个集合中,因此:\(a+b+c+d = m(m-1)/2\)。基于此,我们给出几个常用的聚类性能度量外部指标:
- Jaccard系数(JC系数):\(JC = \dfrac{a}{a+b+c}\)
- Rand指数(RI指数):\(RI = (a+d)/\dfrac{m(m-1)}{2} = \dfrac{2(a+d)}{m(m-1)}\)
- FM指数(FMI):\(FMI = \sqrt{\dfrac{a}{a+b}\times \dfrac{a}{a+c}}\)
其实不难理解,JC系数描述的是分类正确的样本数占总样本数的比例,RI指数描述的是分类正确(正样本和负样本)的个数占总的样本比例,FMI描述的是分类正确占 “分类正确+分类错误” 的比例。因此这三个指标都是在 \([0,1]\),且越大越好。
2.2 内部指标法:
仅仅考虑聚类结果的划分:\(C = \{C_{1}, C_{2},...,C_{k}\}\),定义:
diam(C) = max_{1\le i<j \le |C|}dist(x_{i},x_{j}) \\
d_{min}(C_{i},C_{j}) = min_{x_{i}\in C_{i}, x_{j} \in C_{j}} dist(x_{i},x_{j}) \\
d_{cen}(C_{i},C_{j})= dist(u_{i}, u_{j})
\]
其中,\(dist(\cdot,\cdot)\) 计算两个向量之间的距离,定义为:
\]
- 当 \(p=1\) 时,等效为曼哈顿距离:\(dist(x_{i},x_{j}) = (\sum_{u=1}^{n}(|x_{iu}-x_{ju}|^{}))\)
- 当 \(p=2\) 时,等效为欧氏距离:\(dist(x_{i},x_{j}) = \sqrt{(\sum_{u=1}^{n}(|x_{iu}-x_{ju}|^{2}))}\)
\(u_{i}\) 代表第 \(i\) 个簇的中心点,即:\(u_{i} = \dfrac{1}{|C_{i}|}\sum_{i=1}^{|C_{i}|} x_{i}\)。显然,\(avg(C)\) 代表簇 \(C\) 中任意两个样本距离的平均值,\(diam(C)\) 代表簇 \(C\) 内任意两个样本之间距离的最大值,\(d_{min}(C_{i},C_{j})\) 代表不同的簇中最近的两个样本之间的距离,\(d_{cen}(C_{i},C_{j})\) 代表不同簇中心点之间的距离。根据我们 “相同簇的样本尽可能相似,不同簇的样本尽可能不同” 的原则,\(avg(C_{i})\) 越小越好,而 \(d_{cen}(C_{i},C_{j})\) 越大越好;\(d_{min}(C_{i},C_{j})\) 越大越好,\(diam(C)\) 越小越好。因此我们有如下的内部度量指标:
- DB指数:\(DBI = \dfrac{1}{k}\sum_{i=1}^{k}max(\dfrac{avg(C_{i})+avg(C_{j})}{d_{cen}(C_{i},C_{j})})\)
- Dunn指数:\(min\{min\{ \dfrac{d_{min}(C_{i}, C_{j})}{max_{1 \le l \le k}diam(C_{l})}\}\}\)
显然,DB越小越好,而DI越大越好。
三、K-means聚类算法的实现
3.1 算法描述
给定样本集 \(D=\{x_{1},x_{2},...,x_{m}\}\) ,“K 均值” 算法针对聚类所得簇划分 \(C = \{C_{1}, C_{2},...,C_{k}\}\) 最小化平方误差:
\]
其中,\(u_{i}\) 是簇 \(C_{i}\) 的均值向量,于是 \(E\) 描述了簇内样本围绕簇均值向量的紧密程度,\(E\) 值越小,则簇内样本的相似度越高。但是优化起来并不容易,需要考虑样本集 \(D\) 的所有可能的簇划分,因此 \(k\) 均值采取了贪心策略,通过迭代优化来近似求解。具体的流程如下:
- 从样本集中随机选取 \(k\) 个向量作为初始均值向量 \(\{u_{1}, u_{2}, ..., u_{k}\}\),且簇 \(C_{i}\) 设置为空;
- 分别计算将所有的样本与初始均值向量 \(\{u_{1}, u_{2}, ..., u_{k}\}\) 的距离,将与 \(u_{i}\) 最小距离的样本 \(x_{j}\) 划分入 \(C_{i}\),并以此类推得到第一轮的迭代结果
- 重新更新簇 \(C_{i}\) 的均值,\(\{u_{1}^{'}, u_{2}^{'}, ..., u_{k}^{'}\}\),然后重复步骤2
- 直到下一轮与上一轮的结果相同,停止更新
3.2 代码实现
# k-means cluster
def kmeans(dataSet, k):
numSamples = dataSet.shape[0]
# first column stores which cluster this sample belongs to,
# second column stores the error between this sample and its centroid
clusterAssment = mat(zeros((numSamples, 2)))
clusterChanged = True
## step 1: init centroids
centroids = initCentroids(dataSet, k)
while clusterChanged:
clusterChanged = False
## for each sample
for i in xrange(numSamples):
minDist = 100000.0
minIndex = 0
## for each centroid
## step 2: find the centroid who is closest
for j in range(k):
distance = euclDistance(centroids[j, :], dataSet[i, :])
if distance < minDist:
minDist = distance
minIndex = j
## step 3: update its cluster
if clusterAssment[i, 0] != minIndex:
clusterChanged = True
clusterAssment[i, :] = minIndex, minDist**2
## step 4: update centroids
for j in range(k):
pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]
centroids[j, :] = mean(pointsInCluster, axis = 0)
print 'Congratulations, cluster complete!'
return centroids, clusterAssment
聚类算法与K-means实现的更多相关文章
- 数据挖掘十大算法--K-均值聚类算法
一.相异度计算 在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...
- 机器学习中K-means聚类算法原理及C语言实现
本人以前主要focus在传统音频的软件开发,接触到的算法主要是音频信号处理相关的,如各种编解码算法和回声消除算法等.最近切到语音识别上,接触到的算法就变成了各种机器学习算法,如GMM等.K-means ...
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- 03-01 K-Means聚类算法
目录 K-Means聚类算法 一.K-Means聚类算法学习目标 二.K-Means聚类算法详解 2.1 K-Means聚类算法原理 2.2 K-Means聚类算法和KNN 三.传统的K-Means聚 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- 【转】算法杂货铺——k均值聚类(K-means)
k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...
- K均值聚类算法的MATLAB实现
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
- Kmeans算法的K值和聚类中心的确定
0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...
- 聚类算法:K均值、凝聚层次聚类和DBSCAN
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
随机推荐
- vulnhub-DC:7靶机渗透记录
准备工作 在vulnhub官网下载DC:7靶机DC: 7 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收集 已经知道了靶 ...
- CF466C 题解
Description 给定一个数组,求有多少组 \(i,j\) 将整个数组分成和相等的三个数组. Solution 从左往右看一遍,记录每一个 \(i\) 使得 \(\sum_{k=1}^i a_k ...
- BurpSuite 2020.5安装教程
Burpsuite2020.5安装教程 Burpsuite2020.5需要在Java11的环境下才可正常运行. 所以首先安装Java11: 安装Java11 Java SE的安装非常简单,直接下一步, ...
- 深入理解Https如何保证通信安全
作为一名ABC搬运工,我相信很多人都知道Https,也都知道它是用来保证通信安全的,但是如果你没有深入了解过Https,可能并不知道它是如何保证通信安全的.我也是借着这次机会,和大家分享下我深入了解的 ...
- 一张图说明 iaas paas saas的区别
图片来源:https://www.bilibili.com/video/BV1QJ411S7c4 P2 云服务的三种模式 1laaS(基础设施即服务) laas(Infrastructure as ...
- Block循环引用详解
前言 在项目中经常用到block,使用不当就很容易因为循环引用而造成内存泄漏.本文分析了block循环引用形成原因以及处理办法,如果有什么不对或者疑问请留言. 什么情况下block会造成循环引用 bl ...
- 用python 30行代码,搞定一个简单截图调取的百度识字功能
在做一个数据标注过程中人工需要识别文字. 想了想写了一个小脚本, 大致过程这样的. 截图功能写了好久也没写明白,索性直接调用第三方的截图工具了,在采用qq或者微信截图时,截图完成后保存大致保存在剪切板 ...
- Tag Helper 标签助手
简介 标签助手是Razor 页面中自动生成HTML语句的可重用组件.标签助手对应特定的HTML标签,ASP.NET Core 包含大量与HTML标签对应的预定义标签助手. Razor页面中的标签助手作 ...
- 数据结构与算法-排序(九)基数排序(Radix Sort)
摘要 基数排序是进行整数序列的排序,它是将整数从个位开始,直到最大数的最后一位截止,每一个进位(比如个位.十位.百位)的数进行排序比较. 每个进位做的排序比较是用计数排序的方式处理,所以基数排序离不开 ...
- Vmware15的安装以及Ubunt的在虚拟机上的安装
一.vmware15安装 1.百度网盘地址 链接:https://pan.baidu.com/s/1Lgez57n50QEW97HNdYZCfQ 提取码:9wvy 2.下载到本地后 3.双击安装程序 ...