K-means和K-中心点算法

K-means和K-中心点算法

k-means算法

在聚类的算法中这个算法比较常用,首先是将数据集中的每一条数据想象称为超空间中的一个点,因为通常数据不只是只有三个特征属性,当超过三个特征属性之后就难以在坐标空间中进行表示,所以这里统一的称为超空间

先确立一些比较重要的思想:

距离的概念,如果每一个点都有坐标,不管是5维还是6维,反正存在j个属性,每个属性的值进行归一化处理之后得到一个比较干净的数据,关于数据的前期处理不是这里的重点,所以这里默认的认为所有数据已经清洗好了

使用欧式距离作为这里判定两个点之间的距离度量,放在超空间中无非就是两个点做差后进行距离化

度量和算法逻辑分离:

算法逻辑是一种执行方式,算法是一种方法,这种方法并不是说必须要用谁谁谁作为损失函数,比如决策树中的CART算法是用Gini系数作为度量,采用的是二叉树的方式,但是这里并不代表只能用Gini系数作为特征提取的度量,我们完全可以使用信息熵,只是使用信息熵如果效果比Gini效果还要好,那为啥一定要用Gini系数呢?

度量只是一种衡量方式,说白了就是我们自己构造的比较方式而已,我们认为这么计算能够区分这两个点是否相近,但是并不代表说这是唯一评判标准

使用不同的度量可能会带来意外的收获,如果使用体重作为度量我们能区分胖瘦,如果使用身高进行度量,我们能区分高矮,聚类中经常采用的是欧式距离进行度量两个对象(数据点)是否相似,那么难道只有欧式距离这种度量么?

不逼逼了,直接说这个算法

1 随机的在数据集中进行选择k个点作为种子点,记作{A,B,C,D,E…}

注意这里k是人为设定的,这里的k代表我要把这个数据集分成k类,聚类本身就是无监督的学习算法,事先我们并不知道这一堆数据到底应该有几个类,因此我们这里随机的给一个k很可能就是一个错误的,比如本来别人有3个类,你给了一个10让别人分,别人怎么分?

因为是无监督学习,所以没有办法,这里只能先给一个k,用测试集看看效果,在给k+i个,用测试集看看效果,再用k+2i个看看效果,统计每次k的变化和测试的准确率之间的关系,画出一个图像,多做几次就看到趋势了,下面就是人为的根据趋势去试,找出最合适的k值,先假设我们运气很好,第一次就给对了k

2 以种子点为均值点,将空间中其他的点分别与这些种子点做距离计算,并归簇

比如一个点p,在与A点作计算后得到距离d1,与B点作距离计算得到距离d2,对所有的点都做完计算得到一组距离值,选出最小的那对,如果d1是最小的,那么就把p这个点归到A簇中,空间中除了种子点之外的所有点都这么来一遍,那么就能够找到每一个种子点所具有的簇.

这里同样会有一些问题,比如最小的距离如果不唯一呢?换句话说如果正好有一个p距离其中的某几个种子点的距离都相同,而且都是最小值,这种可能也是存在的,怎么办?此时其实大可不必担心,无所谓的,随便给一个最近距离的簇就行了,因为这个算法在后面的均值点移动的过程中会打破之中相等的情况

当然也有人认为假如本身已经完全分好了,比如只有两个簇,连个簇的均值点连线的中垂面上的所有点不都是距离这两个均值点距离相等么.对,确实会有这种情况,那么这些点本身就很难分类到任何一个簇,这些点就是临界点,难以区分的点,你无法说它一定属于左边的簇还是右边的簇,这里的做法在于看看哪个簇所具有的点数量多分给谁,这是一种比较贪心的做法,就像一个中等身材的人,你一定要区分是高大还是矮小的话,那为了不得罪人我就说分到高大里面

有人继续较真,如果两边簇的个数相等咋办?好吧,这种都被你遇到也是牛皮,那么就随机分

3 每一个种子点都对应有簇之后,下面进行针对每个簇进行取均值动作

一堆点取均值其实难度不大,这一堆点取了均值之后的均值点并不一定是在给的数据集中的某个点上,这一点要明确,也许这个均值点上就没有对应的数据,但是这并不影响

4 以均值点为新的种子点进行重新划分

因为第一次选的是随机的种子点,那么归簇之后计算的新均值点虽然不能说一定比随机的那个点好,但是这至少是有个均值作为依据,这里进行重新归簇之后会得到一个新的划分,那么关键来了

5 比较均值点与原种子点不同划分造成的数据集中所有的误差平方和

E = ∑ i = 1 k ∑ p ∈ C i d i s t ( p , c i ) 2 E=\sum_{i=1}^k{}\sum_{p\in C_i}dist(p,c_i)^2 E=i=1kpCidist(p,ci)2

上式为数据集中所有对象的误差的平方和,听起来就绕口,这个公式需要从右边开始往左读

dist(x,y)表示点x到点y的距离,这里的ci就是种子点,如果变化为均值后,ci表示均值点,距离之后再平方,Ci表示第i个簇,对应我们前面的时候A的代表簇,或者B的代表簇

第一个求和的意思就是将簇里面的非ci点分别对ci进行距离运算,之后再平方,所有的平方再加起来

前面的求和变化的是i,从i=1到k,意思就是把所有的簇都运算加起来

加起来之后就是一个定值,此时整个值里面包含了所有点分别对自己簇的中心点的距离平方和,整个值为E,我们认为这个值能够度量数据的在各自的簇里面的聚程度

思考一下:

现在有一个点群,如果这个点非常集中,所有点都一个挨着一个,紧紧包围中心点的,那么这些点到中心点的距离就会很小,平方后还是很小,加起来之后还是小,那么对应的E值就会非常小,E就表示着我们这个点群中其他散点相对于中心的聚集程度,越是聚集越是表示这些点相似性就越高,就意味着这些数据对象就越相似

那么现在我的中心点找错了,找了个最边缘的点,那么其余的点到这个边缘距离点的平方和会变大,导致E变大,这就意味着我们的中心点选的有问题

这里不同,本身的随机种子构建的点群划分是一种划分状态,可以计算出E值,当我们计算出簇内所有点的均值后,构建一个新的种子点,对这个点再次构建一个点群划分,新的划分会存在一个新的E值,那么如果新的E值小于原来的E值,那就意味着新的点群划分使得各个簇包含的点更加聚集,我们就有理由认为新的划分更合理,于是就使用均值当做新的种子点

6 重复2-5,直到新的均值无法再使得E更小为止

这样就能让本身随机的选点最后一次次迭代成为最优的划分

收尾工作:

上面的计算确实能够使得E成为最小,每个簇最紧凑,但是很容易掉进局部最优解,比如数据点群中局部存在两个聚集团,但是实际上这两个团是一个类的,正好随机的点随到里面去了,把这两个团归为两个类,或者出现其他的局部最优解.这种情况确实存在,算法本身的随机选择种子点就已经决定了这个是算法本身没法避免的,那么我们后续可以进行多次计算来弥补这个问题,第一次运气不好正好随机到局部最优解去了,第二次难道还是这么倒霉,多来几次,次次都中奖那就是人品问题了

算法本身就是人为的设置k值,所以k也会存在好几次尝试

K-中心点算法

该算法其实跟k-means非常接近,是用来填补k-means中的离群点干扰问题,这个后面再解释,先看算法逻辑

1 选择k个随机的点作为初始的种子点

这个和k-means没啥区别

2 以种子点为中心点,对空间中的其他点根据距离来划分

这一步和k-means一样

3 针对每个簇中,随机在选一个点为新的种子点构建新的划分

这一步区别就来了,这里不再是对簇中的点求均值,因为均值点大多数情况下是没有实际数据点对应的,这里采用的是在簇中随机的点作为新种子,这个点一定是确实存在并且确实有数据对应的,可以不恰当的比喻为实例.现在以新的种子点划分数据点群

4 比较前后两次的绝对误差之和进行判断新划分与原划分的优劣

这里的判定依据是
E = ∑ i = 1 k ∑ p ∈ C i d i s t ( p , c i ) E=\sum_{i=1}^k{}\sum_{p\in C_i}dist(p,c_i) E=i=1kpCidist(p,ci)
实际公式中的ci用的是oi来替换的,但是从意义上来说oi就是ci,只是k-means中的ci表示均值点,oi表示中心点,从算法逻辑上来说不都是把它作为中心去划分么,没啥两样,所以这里直接用ci了,注意到跟k-means不同的是这里没有平方了,因为是距离,这里被称作绝对误差之和,E依然能够描述簇的聚集程度

思考:

前后两次都是随机的,第一次是随机选种子,第二次是在已经划分好的簇里面再随机选种子,再划分,为了评价两次不同的划分谁更合理,这里引入了E进行度量,根据前面的分析已经知道E值实际就是表现了点群划分后的聚合程度,如果新随机划分的E值更小,我们就有理由认为新随机的划分更合理,因此将中心点移动到新随机点

5 重复2-4,直到再没有能够使得E值更小的划分为止

收尾工程:

和k-means一样,也是不可避免局部最优解和k值的人为给定一样,只能多计算几次

思考:

两个算法都是用了距离来度量,而且都是针对所有的点进行计算的,那么一定会有离群点也被计算进去了,从E中的dist(p,ci)就已经包含了离群点,所以两个算法都是没有办法杜绝利群点的,只能尽量减少利群点的影响

区别

两个重要的不同

1 k-中心点中的dist(p,ci)没有平方

2 k-中心点使用的是真实存在的数据点作为中心来划分

先说2的好处,以真实存在的数据点作为中心点这比使用均值点作为中心点计算出来的dist通常要大一些.均值中心点是更加对称的结构,均值点并不一定在数据点上,但是这种对称结构更喜欢的是数据均匀分布,如果存在利群点,那么利群点就会干扰均值计算,导致均值偏离实际

使用簇中的随机来作为中心点,好处在于利群点毕竟是少数,随到的可能性很低,如果真的随到了,那么离群点计算的dist会整体增加,这将导致E变大,那么在步骤4的时候就不会对这个点进行更新,这个离群点不会参与中心点的选择,所以从中心位置选择上就没有离群点的干扰

再看1,为什么k-means是平方,而k-中心是1次方

dist都是指距离,那么这个距离谁能保证一定大于1,难道就不能是0.1么,数值越小说明距离中心点越近,如果大量的点的数值都很小则平方后会更小,反而离群点通常都比较大,平方后会被放大,如果某个划分中,中心点距离离群点近了,那么就不会出现大量的短距离数值,虽然距离最大的离群点贡献的E值小了,而大量的聚集点贡献的E值被放大的很明显,从而导致整体E值没有想象中下降的多,因此整个点作为中心点就不适合.

高指数能够放大离群点对E值的贡献,在k-means里面离群点在中心点选择的时候就干扰过一次,已经造成了均值点比实际中心点偏移,此时对离群点贡献度进行放大,多少有点弥补的意味

那么k-中心点选择1而不是开根号,为啥不是进行和k-means同样采用平方呢?

在k-中心点算法中,中心点的选择不受到离群点的影响,但是dist计算则一定会受到离群点的影响,如果指数小于1,比如1/2,就是开根号,那么0.04的距离开根号后就会成为0.2,本身距离短的聚集点结果贡献的E值被放大了,而离群的点本身比较大,开个根号实际上进行了缩小(100开跟也就10),这样计算的dist并不合理.如果本身划分是非常好的,簇中的点非常集中,只有离群点的距离大于1,或者就是1,那么开根号反而使得E值变大,会错误的认为这是个不良的划分

不选择高指数,高指数确实能够使得离群点的贡献度放大,但是这里也没有这个必要了,因为离群点不能干扰中心的选择,再去放大离群贡献的意义并不是很大,反而增加计算开销

从来没有人说过dist只能是平方,你变化成10次方都行,这只是一个度量,与算法的逻辑没有任何关系,你甚至可以不用距离作为度量,都行,没有谁规定k-means一定就是平方,k-中心点一定就是一次项

在实际的工程中,如果用的是k-means,你发现使用一次项在你的这个工程中效果最好,那干嘛非要用平方项

当实验数据与理论冲突的时候,我们确定数据是真实有效的情况下,那么我们就应该考虑是不是理论不够完善了
  • 13
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值