本文是关于聚类算法的第二篇K-means,感兴趣的同学可以前往http://ihoge.cn/2018/clustering.html
阅读完整版。

二、K-means

1. 算法步骤

<1> 选择KKK个点作为初始质心
<2> Repeat:
<3> 将每个点指派到最近的质心,形成K" role="presentation" style="position: relative;">KKK个簇
<4> 重新计算每个簇的质心
<5> Until: 质心不发生变化终止

2. 距离的度量

闵可夫斯基距离

闵可夫斯基距离不是一种距离,而是一类距离的定义。对于 n 维空间中的两个点 x(x1,x2,x3,...,xn)x(x1,x2,x3,...,xn)x(x_1,x_2,x_3,...,x_n)和y(y1,y2,y3,...,yn)y(y1,y2,y3,...,yn)y(y_1,y_2,y_3,...,y_n),那么xxx和y" role="presentation" style="position: relative;">yyy亮点之间的闵可夫斯基距离为:

dxy=∑i=1n(xi−yi)p‾‾‾‾‾‾‾‾‾‾‾‾⎷dxy=∑i=1n(xi−yi)p

d_{xy}=\sqrt{\sum_{i=1}^{n}{\left( x_{i}-y_{i} \right)^{p}}}
其中p是一个可变参数:

  • 当p=1时,被称为曼哈顿距离
  • 当p=2时,被称为欧式距离
  • 当p=∞∞\infty 时,被称为切比雪夫距离。

余弦相似度

cos(Θ)=aTb|a|∗|b|cos(Θ)=aTb|a|∗|b|

cos(\Theta )=\frac {a^Tb}{|a|*|b|}

  • a,ba,ba,b表示两个向量,|a||a||a|和|b||b||b|表示向量的模。 余弦相似度一般衡量两个向量的相似情况,常用与文本处理。余弦角越小越相似。

杰卡德(Jaccard)相似系数

J(A,B)=|A⋂B||A⋃B|J(A,B)=|A⋂B||A⋃B|

J(A,B)=\frac {|A \bigcap B|}{|A \bigcup B|}

  • 这里,A、BA、BA、B表示集合,A⋂BA⋂BA \bigcap B表示两个集合公共元素的个数,A⋃BA⋃BA \bigcup B表示两个集合并集元素的个数。 Jaccard 相似系数适用于度量两个集合的相似程度,取值在 0~1 之间,越大越相似。在推荐系统中常用衡量客户或商品的相似度。

3. 变量标准化

在聚类前,通常需要对个连续变量进行标准化,因为方差大的变量比方差晓得变量对距离或相似度的影响更大,从而对聚类结果的影响更大。

常用的方法有:

正态标准化:xi=xi−mean(X)std(Xxi=xi−mean(X)std(Xx_i=\frac {x_i-mean(X)}{std(X}
归一化:xi=xi−min(X)max(X)−min(X)xi=xi−min(X)max(X)−min(X)x_i=\frac {x_i-min(X)}{max(X)-min(X)}

4. 变量的维度分析

假设一组变量中,一个维度有5个变量,二另一个维度只有1个变量,则第一个维度的权重被明显提高了。一般情况下,每个维度上使用的变量个数应该是一样的,不过分析人员要结合具体场景不同维度提供不同数量的变量个数,这相当于加大了一些维度的权重。

除了机遇业务定义进行变量的选择,另一种常用的方法是在聚类之前进行主成分分析。

5. 质心的目标函数

5.1 SSE 误差平方和

聚类的目标通常用一个目标函数表示,该函数依赖于点之间,或点到簇的质心的临近性;
如,考虑临近性度量为欧几里得距离的数据,我们使用误差平方和(SSE)作为度量聚类质量的目标函数,即最小化簇中点到质心的距离平方和。 SSE也称散布(scatter),定义如下:

SSE=∑Ki=1∑x∈Cidist(ci,x)2SSE=∑i=1K∑x∈Cidist(ci,x)2

SSE=∑^K_{i=1}∑_{x\in C_i}dist(c_i,x)^2
其中, distdistdist是欧几里得空间中两个对象之间的标准欧几里得距离。

给定这些假设,实际上可以证明:对 SSE 求导,另导数为 0 求解 ckckc_k使簇的 SSE 最小的质心是均值

∂∂ckSSE=∂∂ck∑Ki=1∑x∈Ci(ci,x)2=0∂∂ckSSE=∂∂ck∑i=1K∑x∈Ci(ci,x)2=0

\frac {\partial }{\partial c_k}SSE =\frac {\partial }{\partial c_k}∑^K_{i=1}∑_{x\in C_i}(c_i,x)^2=0

最终得到:

∑x∈Ck2(ck−xk)=0⟹mkck=∑x∈Ckxk⟹ck=1mk∑x∈Ckxk∑x∈Ck2(ck−xk)=0⟹mkck=∑x∈Ckxk⟹ck=1mk∑x∈Ckxk

∑_{x\in C_k}2(c_k-x_k)=0\Longrightarrow m_kc_k=∑_{x\in C_k}x_k \Longrightarrow c_k = \frac 1{m_k}∑_{x\in C_k}x_k

文档数据

考虑文档数据和余弦相似性度量。这里我们假定文档数据用文档——词矩阵表示,我们的目标是最大化簇中文档与簇的质心的相似性;该量乘坐簇的凝聚度(cohesion)。对于该目标,可以证明,与欧几里得数据一样,簇的质心是均值。总 SSE 的类似量是总凝聚度(total cohesion):

TotalCohesion=∑Ki=1∑x∈Cicosine(ci,x)TotalCohesion=∑i=1K∑x∈Cicosine(ci,x)

Total Cohesion=∑^K_{i=1}∑_{x\in C_i}cosine(c_i,x)

关于凝聚度的知识,会在下文模型评估里面详细介绍

5.2 SAE 绝对误差和

为了表明KKK均值可以用各种不同的目标函数,我们考虑如何将数据分成K" role="presentation" style="position: relative;">KKK个簇,使得点到其簇中心的曼哈顿距离之和最小。如下式绝对误差和(SAE)

SAE=∑Ki=1∑x∈Ci|ci−x|SAE=∑i=1K∑x∈Ci|ci−x|

SAE = ∑^K_{i=1}∑_{x \in C_i}|c_i-x|

∂∂ckSAE=∂∂ck∑Ki=1∑x∈Ci|ci−x|=0∂∂ckSAE=∂∂ck∑i=1K∑x∈Ci|ci−x|=0

\frac {\partial }{\partial c_k}SAE =\frac {\partial }{\partial c_k}∑^K_{i=1}∑_{x\in C_i}|c_i-x|=0

最终得到:

∑x∈Ck∂∂ck|ck−x|=0⟹∑x∈Cksign(x−ck)=0⟹ck=median{x∈Ck}∑x∈Ck∂∂ck|ck−x|=0⟹∑x∈Cksign(x−ck)=0⟹ck=median{x∈Ck}

∑_{x\in C_k}\frac {\partial }{\partial c_k}|c_k-x|=0\Longrightarrow ∑_{x\in C_k}sign(x-c_k )=0 \Longrightarrow c_k=median\{x\in C_k\}
即簇中点的中位数。一组点的中位数的计是直截了当的,并且减少受离群值的影响。

5.3 常见的邻近度、质心和目标函数组合

邻近度函数 质心 目标函数
曼哈顿距离 中位数 最小化对象与质心的绝对误差和SAE
平方欧几里得距离 均值 最小化对象与质心的误差平方和SSE
余弦 均值 最大化对象与质心的余弦相似度和
Bregman散度 均值 最小化对象到质心的Bregman散度和

Bregman散度实际上是一类紧邻性度量,包括平方欧几里得距离。Bregman散度函数的重要性在于,任意这类函数都可以用作以均值为质心的 K-means 类型的聚类算法的基础。

6. 选择初始质心

当质心随机初始化时,K-means 将产生不同的总 SEE。选择适当的初始质心是基本 K-menas 过程的关键步骤。常见的是随机选取,但这种情况下簇的质量常常很差。考虑什么情况下选择的初始质心能找到最优解?答案是:每个簇刚好分到一个质心。事实证明发生这种情况的概率是非常非常低的。

常见一种技术是:多次运行,然后选取具有最小 SEE 的簇集。该策略虽然简单,但是效果可能不太好,依然是概率事件。

另一种有效的技术是:取一个样本,并使用层次聚类技术对他聚类。从层次聚类中提取 KKK 个簇,并用这些簇的质心作为初始质心。该方法虽然有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2)K" role="presentation" style="position: relative;">KKK 相对与样本大小较小。

还有一种方法是:随机选择第一个点或者所有点到质心作为第一个点。然后对于每个候机初始质心,选择里已经选取的初始质心最远的点,并且把该方法应用与点样本。 这样可以大大缓解可能会选择离群点作为质心的可能,并且大大减小计算量。

另外,我们也可以采用对初始化问题不太敏感的 K-means 的变种,二分K-means、使用后处理来“修补”
所产生的簇集

7. 时间复杂性和空间复杂性

  • 所需空间:O((m+K)n)O((m+K)n)O((m+K)n),m 是点数, n 是属性数

  • 所需时间:O(I∗K∗m∗n)O(I∗K∗m∗n)O(I*K*m*n),II<script type="math/tex" id="MathJax-Element-34">I</script> 是收敛所需迭代次数,通常很小,可以是有界的。

8. K-means 其他问题

8.1 处理空簇

K-means 存在的问题之一是:如果所有的点在指派的步骤都为分配到某个簇,就会得到空簇。这种情况下需要选择一个替补质心,否则误差将会偏大。

  • 方法一: 选择一个距离当前任何质心最远的点
  • 方法二: 从具有最大 SSE 的簇中选择一个替补质心。浙江分裂簇并降低聚类的总 SSE。

8.2 离群点

当然我们想到的第一反应是删除离群点,但是有些聚类应用,不能删除离群点。在某些情况下(财经分析),明显的离群点可能是最令人感兴趣的点。

那么问题来了,如何识别离群点?

  • 方法一:聚类前删除离群点
  • 方法二:后处理离群点。如删除那些具有不寻常影响的点(尤其是多次运行算法时),另外也可以删除那些很小的簇,他们尝尝代表离群点的组。

8.3 后处理降低 SSE

  • 增加簇个数

    • 分裂一个簇:通常选择具有最大 SSE 的簇,页可以分裂在特定属性上具有最大标准差的簇。
    • 引进一个新的质心:通常选择离所有质心最远的点。
  • 减少簇个数

    • 拆散一个簇: 通常选择拆散使总 SSE 增加最少的簇, 删除对应的质心
    • 合并两个簇: 通常选择合并质心最接近的两个簇,或者合并两个导致总 SSE 增加最少的簇。这两种方法与层次聚类使用的方法相同,分别乘坐质心方法和 Ward 方法。

9. 二分 K-means

二分 K-means 算法时基于 K-means 算法的直接扩充,它基于一种简单想法:为了得到 K 个簇,将所有点的集合分裂成两个簇,从这些簇中选取一个继续分裂,如此下去,知道产生 K 个簇。

算法实现步骤:

<1> 初始化簇表,是指包含有所有的点组成的簇。
<2> Repeat

<3> 从簇表中取出一个簇
<4> 对选出的簇进行多次二分“实验”
<5> for i = 1 to 试验次数 do:
<6> 使用基本 K-means,二分选定的簇
<7> end for
<8> 从二分实验中选择具有最小 SSE 的两个簇
<9> 将这两个簇添加到簇表中

<10> Until 簇表包含 K 个簇。

待分裂的簇有许多不同的选择方法。可以选择最大的簇,选择具有最大 SSE 的簇,或者使用一个基于大小和 SSE 的标准进行选择。不同的选择导致不同的簇。

我们通常使用结果簇的质心作为基本 K-means 的初始质心,对结果逐步求精。 因为尽管 K-means 可以保证找到使 SSE 局部最小的聚类,但是自二分 K-means 算法中,我们“局部地”使用了 K-means ,即二分个体簇。因此,最终的簇集并不代表使 SSE 局部最小的聚类。

10. K-means优缺点

10.1 优点

  • 简单并且可以用于各种数据类型;
  • 具备适合的空间复杂度和计算负责度,适用于大样本数据;
  • K-means 某些变种甚至更有效 (二分K-means)且不受初始化问题影响。

10.2 缺点

  • 不能处理非球形簇、不同尺寸和不同密度的簇;
  • 对离群点敏感;
  • K-means 仅限于具有中心(质心)概念的数据。有一种相关的 K-中心点聚类技术没有这种限制,但是开销更大。

参考文献:

Boosting集合算法详解(一)相关推荐

  1. AdBoost算法详解

    AdBoost算法详解 1 算法简介 1.2AdaBoost特点 1.3Bagging与AdaBoost区别 2AdaBoost算法步骤 3 AdaBoost的数学定义 4 推广到多分类 算法引入: ...

  2. 【机器学习】集成学习及算法详解

    集成学习及算法详解 前言 一.随机森林算法原理 二.随机森林的优势与特征重要性指标 1.随机森林的优势 2.特征重要性指标 三.提升算法概述 四.堆叠模型简述 五.硬投票和软投票 1.概念介绍 2.硬 ...

  3. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  4. Popular Cows POJ - 2186(tarjan算法)+详解

    题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...

  5. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  6. LDA主题模型(算法详解)

    LDA主题模型(算法详解) http://blog.csdn.net/weixin_41090915/article/details/79058768?%3E 一.LDA主题模型简介 LDA(Late ...

  7. NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)

    NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python) NEAT算法详解 NEAT算法概述 NEAT编码方案 结构突变 ...

  8. Unicode双向算法详解(bidi算法)(一)

    Unicode双向算法详解(bidi算法)(一) 注:本文已独家授权给脚本之家(ID:jb51net)公众号发布 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是 ...

  9. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

最新文章

  1. Greenplum,HAWQ interval parser带来的问题 - TPCH 测试注意啦
  2. Static Final用法
  3. JSTracker:前端异常数据采集
  4. 比特币支付接口php,比特币支付php类
  5. 跟着开涛springmvc学习(转)
  6. WEB应用中的信息泄漏以及攻击方法
  7. PLC编程语言入门,常用指令集汇总分享
  8. 【2020年领域新星】 Ruibo Liu 达特茅斯学院
  9. python中matplotlib画图导入到word中如何保证分辨率
  10. 陆羽茶交所严建红:陆羽茶产业互联网三螺旋模式
  11. php系统不能输入中文,word无法输入汉字 如何解决Word不能输入中文的问题
  12. 【NLP】自然语言处理的中间序列建模
  13. Spreadsheet_Excel_Writer
  14. Word无法打开该文件,因为文件格式与文件扩展名不匹配
  15. 卸载idea2020删除以前的配置_系统瘦身指南:卸载软件,看着简单,实际贼困难...
  16. oracle v backup,睿备份oracle下载
  17. mysql 上云迁移方案_数据库上云迁移方案
  18. 一文搞懂什么是PWM!
  19. 内存使用占比存储到csv中加上时间
  20. linux--发展史与环境

热门文章

  1. 树莓派也跑Docker和.NET Core
  2. Ocelot简易教程(二)之快速开始1
  3. 构建可扩展的有状态服务
  4. 探讨.NET Core的未来
  5. 腾讯云短信服务使用记录与.NET Core C#代码分享
  6. 微软开源P语言,实现安全的异步事件驱动编程
  7. Opserver开源的服务器监控系统(ASP.NET)
  8. 大数据项目实践:基于hadoop+spark+mongodb+mysql开发医院临床知识库系统
  9. MySQL - 视图
  10. [转]Angular 单元测试讲解