数据挖掘算法07 - K-Means

K-Means

什么是向量空间?

首先假设有一个数的集合 F,它满足“F 中任意两个数的加减乘除法(除数不为零)的结果仍然在这个 F 中”,我们就可以称 F 为一个“域”。我们处理的数据通常都是实数,所以这里我只考虑实数域。而如果域 F 里的元素都为实数,那么 F 就是实数域。

我们已经介绍过向量之间的加法,以及标量和向量的乘法。这里我们使用这两个操作来定义向量空间。

假设 V 是 Fn 的非零子集,如果对任意的向量 x、向量 y∈V,都有 (x+y)∈V,我们称为 V 对向量的加法封闭;对任意的标量 k∈V,向量 x∈V,都有 kx 属于 V,我们称 V 对标量与向量的乘法封闭。

如果 V 满足向量的加法和乘法封闭性,我们就称 V 是 F 上的向量空间。向量空间除了满足这两个封闭性,还满足基本运算法则,比如交换律、结合律、分配律等等。

向量之间的距离

  • 曼哈顿距离

在美国人口稠密的曼哈顿地区,从一个十字路口开车到另外一个十字路口,驾驶距离是多少呢?

城市街区

从图中可以看出,从 A 点到 B 点有多条路径,但是无论哪条,曼哈顿距离都是一样的。

在二维空间中,两个点(实际上就是二维向量)x(x1,x2)与 y(y1,y2)间的曼哈顿距离是:

推广到 n 维空间,曼哈顿距离的计算公式为:

其中 n 表示向量维度,xi 表示第一个向量的第 i 维元素的值,yi 表示第二个向量的第 i 维元素的值。

  • 欧氏距离(Euclidean Distance)

欧氏距离,其实就是欧几里得距离。欧氏距离是一个常用的距离定义,指在 n 维空间中两个点之间的真实距离,在二维空间中,两个点 x(x1,x2)与 y(y1,y2)间的欧氏距离是:

推广到 n 维空间,欧氏距离的计算公式为:

  • 切比雪夫距离(Chebyshev Distance)

切比雪夫其实是在模拟国际象棋里国王的走法。国王可以走临近 8 个格子里的任何一个,那么国王从格子 (x1,x2) 走到格子 (y1,y2) 最少需要多少步呢?其实就是二维空间里的切比雪夫距离。

一开始,为了走尽量少的步数,国王走的一定是斜线,所以横轴和纵轴方向都会减 1,直到国王的位置和目标位置在某个轴上没有差距,这个时候就改为沿另一个轴每次减 1。所以,国王走的最少格子数是 |x1−y1| 和 |x2−y2| 这两者的较大者。所以,在二维空间中,两个点 x(x1,x2)与 y(y1,y2) 间的切比雪夫距离是:

推广到 n 维空间,切比雪夫距离的计算公式为:

闵氏距离

上述三种距离,都可以用一种通用的形式表示,那就是闵可夫斯基距离,也叫闵氏距离。在二维空间中,两个点 x(x1,x2) 与 y(y1,y2) 间的闵氏距离是:

两个 n 维变量 x(x1,x2,…,xn) 与 y(y1,y2,…,yn) 间的闵氏距离的定义为:

其中 p 是一个变参数,尝试不同的 p 取值,你就会发现:

  • 当 p=1 时,就是曼哈顿距离;
  • 当 p=2 时,就是欧氏距离;
  • 当 p 趋近于无穷大的时候,就是切比雪夫距离。这是因为当 p 趋近于无穷大的时候,最大的 |xi−yi| 会占到全部的权重。

距离可以描述不同向量在向量空间中的差异,所以可以用于描述向量所代表的事物之差异(或相似)程度。

向量的长度

有了向量距离的定义,向量的长度就很容易理解了。向量的长度,也叫向量的模,是向量所对应的点到空间原点的距离。通常我们使用欧氏距离来表示向量的长度。

当然,我们也可以使用其他类型的距离。说到这里,我也提一下“范数”的概念。范数满足非负性、齐次性、和三角不等式。你可以不用深究这三点的含义,不过你需要知道范数常常被用来衡量某个向量空间中向量的大小或者长度。

  • L1 范数 ||x|| ,它是为 x 向量各个元素绝对值之和,对应于向量 x 和原点之间的曼哈顿距离。
  • L2 范数 ||x||2,它是 x 向量各个元素平方和的 1/2 次方,对应于向量 x 和原点之间的欧氏距离。
  • Lp 范数 ||x||p,为 x 向量各个元素绝对值 p 次方和的 1/p 次方,对应于向量 x 和原点之间的闵氏距离。
  • L∞ 范数 ||x||∞,为 x 向量各个元素绝对值最大那个元素的绝对值,对应于向量 x 和原点之间的切比雪夫距离。

所以,在讨论向量的长度时,我们需要弄清楚是 L 几范数。

向量之间的夹角

在理解了向量间的距离和向量的长度之后,我们就可以引出向量夹角的余弦,它计算了空间中两个向量所形成夹角的余弦值,具体的计算公式我列在了下面:

从公式可以看出,分子是两个向量的点乘,而分母是两者长度(或 L2 范数)的乘积,而 L2 范数可以使用向量点乘自身的转置来实现。夹角余弦的取值范围在 [-1,1],当两个向量的方向重合时夹角余弦取最大值 1,当两个向量的方向完全相反夹角余弦取最小值 -1。值越大,说明夹角越小,两点相距就越近;值越小,说明夹角越大,两点相距就越远

向量空间模型(Vector Space Model)

向量空间模型假设所有的对象都可以转化为向量,然后使用向量间的距离(通常是欧氏距离)或者是向量间的夹角余弦来表示两个对象之间的相似程度。我使用下图来展示空间中向量之间的距离和夹角。

由于夹角余弦的取值范围已经在 -1 到 1 之间,而且越大表示越相似,所以可以直接作为相似度的取值。相对于夹角余弦,欧氏距离 ED 的取值范围可能很大,而且和相似度呈现反比关系,所以通常要进行 1/(1-ED) 这种归一化。

当 ED 为 0 的时候,变化后的值就是 1,表示相似度为 1,完全相同。当 ED 趋向于无穷大的时候,变化后的值就是 0,表示相似度为 0,完全不同。所以,这个变化后的值,取值范围是 0 到 1 之间,而且和相似度呈现正比关系。

早在上世纪的 70 年代,人们把向量空间模型运用于信息检索领域。由于向量空间可以很形象地表示数据点之间的相似程度,因此现在我们也常常把这个模型运用在基于相似度的一些机器学习算法中,例如 K 近邻(KNN)分类、K 均值(K-Means) 聚类等等。

监督式学习 & 非监督学习

在概率统计模块中,我们介绍了分类(Classification/Categorization)和回归(Regression)这两种监督式学习(Supervised Learning)。监督式学习通过训练资料学习并建立一个模型,并依此模型对新的实例进行预测。

不过,在实际场景中,我们常常会遇到另一种更为复杂的情况。这时候不存在任何关于样本的先验知识,而是需要机器在没人指导的情形下,去将很多东西进行归类。由于缺乏训练样本,这种学习被称为“非监督学习”(Unsupervised Learning),也就是我们通常所说的聚类(Clustering)。在这种学习体系中,系统必须通过一种有效的方法发现样本的内在相似性,并把数据对象以群组(Cluster)的形式进行划分。

K 均值(K-Means)聚类算法

这个算法的名称是 K 均值(K-Means)聚类算法,它让我们可以在一个任意多的数据上,得到一个事先定好群组数量(K)的聚类结果。这种算法的中心思想是:尽量最大化总的群组内相似度,同时尽量最小化群组之间的相似度。群组内或群组间的相似度,是通过各个成员和群组质心相比较来确定的。想法很简单,但是在样本数量达到一定规模后,希望通过排列组合所有的群组划分,来找到最大总群组内的相似度几乎是不可能的。于是人们提出如下的求近似解的方法。

  • 从 N 个数据对象中随机选取 k 个对象作为质心,这里每个群组的质心定义是,群组内所有成员对象的平均值。因为是第一轮,所以第 i 个群组的质心就是第 i 个对象,而且这时候我们只有这一个组员。
  • 对剩余的对象,测量它和每个质心的相似度,并把它归到最近的质心所属的群组。这里我们可以说距离,也可以说相似度,只是两者呈现反比关系。
  • 重新计算已经得到的各个群组的质心。这里质心的计算是关键,如果使用特征向量来表示的数据对象,那么最基本的方法是取群组内成员的特征向量,将它们的平均值作为质心的向量表示。
  • 迭代上面的第 2 步和第 3 步,直至新的质心与原质心相等或相差之值小于指定阈值,算法结束。

我以二维空间为例子,画张图来展示一下数据对象聚类的过程。

在这张图中,( a )、( b )、( c ) 三步分别展示了质心和群组逐步调整的过程。我们一一来看。(a) 步骤是选择初始质心,质心用不同颜色的 x 表示;( b ) 步骤开始进行聚类,把点分配到最近的质心所在的组;( c ) 步骤重新计算每个群组的质心,你会发现 x 的位置发生了改变。之后就是如此重复,进入下一轮聚类。

总的来说,K 均值算法是通过不断迭代、调整 K 个聚类质心的算法。而质心或者群组的中心点,是通过求群组所包含的成员之平均值来计算的。

使用向量空间进行聚类

以文本聚类为例,讲讲如何使用向量空间模型和聚类算法,去除重复的新闻。

我们在看新闻的时候,一般都希望不断看到新的内容。可是,由于现在的报道渠道非常丰富,经常会出现热点新闻霸占版面的情况。假如我们不想总是看到重复的新闻,应该怎么办呢?有一种做法就是对新闻进行聚类,那么内容非常类似的文章就会被聚到同一个分组,然后对每个分组我们只选择 1 到 2 篇显示就够了。

基本思路确定后,我们可以把整个方法分为三个主要步骤。

第一步,把文档集合都转换成向量的形式。

第二步,使用 K 均值算法对文档集合进行聚类。这个算法的关键是如何确定数据对象和分组质心之间的相似度。针对这点,我们有两个点需要关注。

  • 使用向量空间中的距离或者夹角余弦度量,计算两个向量的相似度。
  • 计算质心的向量。K 均值里,质心是分组里成员的平均值。所以,我们需要求分组里所有文档向量的平均值。求法非常直观,就是分别为每维分量求平均值,我把具体的计算公式列在这里:

其中,xi 表示向量的第 i 个分量,xij 表示第 j 格向量的第 i 个分量,而 j=1,2,…,n 表示属于某个分组的所有向量。

第三步,在每个分类中,选出和质心最接近的几篇文章作为代表。而其他的文章作为冗余的内容过滤掉。

使用 Python 里的 sklearn 库,来展示使用欧氏距离的 K 均值算法。

理解 K-Means 算法原理前,先看下这三个问题

  • 如何确定 K 类的中心点?

其中包括了初始的设置,以及中间迭代过程中中心点的计算。在初始设置中,会进行 n_init 次的选择,然后选择初始中心点效果最好的为初始值。在每次分类更新后,你都需要重新确认每一类的中心点,一般采用均值的方式进行确认。

  • 如何将其他点划分到 K 类中?

这里实际上是关于距离的定义,我们知道距离有多种定义的方式,在 K-Means 和 KNN 中,我们都可以采用欧氏距离、曼哈顿距离、切比雪夫距离、余弦距离等。对于点的划分,就看它离哪个类的中心点的距离最近,就属于哪一类。

  • 如何区分 K-Means 和 KNN 这两种算法呢?

刚学过 K-Means 和 KNN 算法的同学应该能知道两者的区别,但往往过了一段时间,就容易混淆。所以我们可以从三个维度来区分 K-Means 和 KNN 这两个算法:

  1. 首先,这两个算法解决数据挖掘的两类问题。K-Means 是聚类算法,KNN 是分类算法
  2. 这两个算法分别是两种不同的学习方式。K-Means 是非监督学习,也就是不需要事先给出分类标签,而 KNN 是有监督学习,需要我们给出训练数据的分类标识
  3. 最后,K 值的含义不同。K-Means 中的 K 值代表 K 类。KNN 中的 K 值代表 K 个最接近的邻居

K-Means 的工作原理

  • 选取 K 个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;
  • 将每个点分配到最近的类中心点,这样就形成了 K 个类,然后重新计算每个类的中心点;
  • 重复第二步,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。

Kmeans & Knn 的区别

K-means开班,选老大,风水轮流转,直到选出最佳中心老大

Knn小弟加队伍,离那个班相对近,就是那个班的

  • Kmeans

一群人的有些人想要聚在一起;首先大家民主(无监督学习)随机选K个老大(随机选择K个中心点);谁跟谁近,就是那个队伍的人(计算距离,距离近的聚合到一块);随着时间的推移,老大的位置在变化(根据算法,重新计算中心点);直到选出真正的中心老大(重复,直到准确率最高)

  • Knn

一个人想要找到自己的队伍;首先听从神的旨意(有监督学习),随机最近的几个邻居;看看距离远不远(根据算法,计算距离);近的就是一个班的了(属于哪个分类多,就是哪一类)

总结

在聚类中,数据对象之间的相似度时很关键的。如果我们把样本转换为向量,然后使用向量空间中的距离或者夹角余弦,就很自然的能获得这种相似度,所以向量空间模型和聚类算法可以很容易的结合在一起。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章