本文是关于聚类算法的第二篇K-means,感兴趣的同学可以前往http://ihoge.cn/2018/clustering.html
阅读完整版。
二、K-means
1. 算法步骤
<1> 选择KK个点作为初始质心
<2> Repeat:
<3> 将每个点指派到最近的质心,形成个簇
<4> 重新计算每个簇的质心
<5> Until: 质心不发生变化终止
2. 距离的度量
闵可夫斯基距离
闵可夫斯基距离不是一种距离,而是一类距离的定义。对于 n 维空间中的两个点 x(x1,x2,x3,...,xn)x(x1,x2,x3,...,xn)和y(y1,y2,y3,...,yn)y(y1,y2,y3,...,yn),那么xx和亮点之间的闵可夫斯基距离为:
其中p是一个可变参数:
- 当p=1时,被称为曼哈顿距离;
- 当p=2时,被称为欧式距离;
- 当p=∞∞时,被称为切比雪夫距离。
余弦相似度:
- a,ba,b表示两个向量,|a||a|和|b||b|表示向量的模。 余弦相似度一般衡量两个向量的相似情况,常用与文本处理。余弦角越小越相似。
杰卡德(Jaccard)相似系数
- 这里,A、BA、B表示集合,A⋂BA⋂B表示两个集合公共元素的个数,A⋃BA⋃B表示两个集合并集元素的个数。 Jaccard 相似系数适用于度量两个集合的相似程度,取值在 0~1 之间,越大越相似。在推荐系统中常用衡量客户或商品的相似度。
3. 变量标准化
在聚类前,通常需要对个连续变量进行标准化,因为方差大的变量比方差晓得变量对距离或相似度的影响更大,从而对聚类结果的影响更大。
常用的方法有:
正态标准化:xi=xi−mean(X)std(Xxi=xi−mean(X)std(X
归一化:xi=xi−min(X)max(X)−min(X)xi=xi−min(X)max(X)−min(X)
4. 变量的维度分析
假设一组变量中,一个维度有5个变量,二另一个维度只有1个变量,则第一个维度的权重被明显提高了。一般情况下,每个维度上使用的变量个数应该是一样的,不过分析人员要结合具体场景不同维度提供不同数量的变量个数,这相当于加大了一些维度的权重。
除了机遇业务定义进行变量的选择,另一种常用的方法是在聚类之前进行主成分分析。
5. 质心的目标函数
5.1 SSE 误差平方和
聚类的目标通常用一个目标函数表示,该函数依赖于点之间,或点到簇的质心的临近性;
如,考虑临近性度量为欧几里得距离的数据,我们使用误差平方和(SSE)作为度量聚类质量的目标函数,即最小化簇中点到质心的距离平方和。 SSE也称散布(scatter),定义如下:
其中, distdist是欧几里得空间中两个对象之间的标准欧几里得距离。
给定这些假设,实际上可以证明:对 SSE 求导,另导数为 0 求解 ckck使簇的 SSE 最小的质心是均值;
最终得到:
文档数据
考虑文档数据和余弦相似性度量。这里我们假定文档数据用文档——词矩阵表示,我们的目标是最大化簇中文档与簇的质心的相似性;该量乘坐簇的凝聚度(cohesion)
。对于该目标,可以证明,与欧几里得数据一样,簇的质心是均值。总 SSE 的类似量是总凝聚度(total cohesion):
关于凝聚度的知识,会在下文模型评估里面详细介绍
5.2 SAE 绝对误差和
为了表明KK均值可以用各种不同的目标函数,我们考虑如何将数据分成个簇,使得点到其簇中心的曼哈顿距离之和最小。如下式绝对误差和(SAE)
最终得到:
即簇中点的中位数。一组点的中位数的计是直截了当的,并且减少受离群值的影响。
5.3 常见的邻近度、质心和目标函数组合
邻近度函数 | 质心 | 目标函数 |
---|---|---|
曼哈顿距离 | 中位数 | 最小化对象与质心的绝对误差和SAE |
平方欧几里得距离 | 均值 | 最小化对象与质心的误差平方和SSE |
余弦 | 均值 | 最大化对象与质心的余弦相似度和 |
Bregman散度 | 均值 | 最小化对象到质心的Bregman散度和 |
Bregman散度
实际上是一类紧邻性度量,包括平方欧几里得距离。Bregman散度函数
的重要性在于,任意这类函数都可以用作以均值为质心的 K-means 类型的聚类算法的基础。
6. 选择初始质心
当质心随机初始化时,K-means 将产生不同的总 SEE。选择适当的初始质心是基本 K-menas 过程的关键步骤。常见的是随机选取,但这种情况下簇的质量常常很差。考虑什么情况下选择的初始质心能找到最优解?答案是:每个簇刚好分到一个质心。事实证明发生这种情况的概率是非常非常低的。
常见一种技术是:多次运行,然后选取具有最小 SEE 的簇集。该策略虽然简单,但是效果可能不太好,依然是概率事件。
另一种有效的技术是:取一个样本,并使用层次聚类技术对他聚类。从层次聚类中提取 KK 个簇,并用这些簇的质心作为初始质心。该方法虽然有效,但仅对下列情况有效:(1)样本相对较小,例如数百到数千(层次聚类开销较大);(2) 相对与样本大小较小。
还有一种方法是:随机选择第一个点或者所有点到质心作为第一个点。然后对于每个候机初始质心,选择里已经选取的初始质心最远的点,并且把该方法应用与点样本。 这样可以大大缓解可能会选择离群点作为质心的可能,并且大大减小计算量。
另外,我们也可以采用对初始化问题不太敏感的 K-means 的变种,二分K-means、使用后处理来“修补”
所产生的簇集
7. 时间复杂性和空间复杂性
所需空间:O((m+K)n)O((m+K)n),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-中心点聚类技术没有这种限制,但是开销更大。