k-means java_K均值原理及实现(K-Means)

算法概述

K-Means算法是一种无监督分类算法,假设有无标签数据集:

math?formula=X%3D%20%5Cleft%5B%20%5Cbegin%7Bmatrix%7D%20x%5E%7B(1)%7D%20%5C%5C%20x%5E%7B(2)%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20x%5E%7B(m)%7D%20%5C%5C%20%5Cend%7Bmatrix%7D%20%5Cright%5D

该算法的任务是将数据集聚类成

math?formula=k个簇

math?formula=C%3D%7BC_%7B1%7D%2CC_%7B2%7D%2C...%2CC_%7Bk%7D%7D,最小化损失函数为:

math?formula=E%3D%5Csum_%7Bi%3D1%7D%5E%7Bk%7D%5Csum_%7Bx%5Cin%7BC_%7Bi%7D%7D%7D%7C%7Cx-%5Cmu_%7Bi%7D%7C%7C%5E%7B2%7D

其中

math?formula=%5Cmu_%7Bi%7D为簇

math?formula=C_%7Bi%7D的中心点:

math?formula=%5Cmu_%7Bi%7D%3D%5Cfrac%7B1%7D%7B%7CC_%7Bi%7D%7C%7D%5Csum_%7Bx%5Cin%7BC%7Bi%7D%7D%7Dx

要找到以上问题的最优解需要遍历所有可能的簇划分,K-Mmeans算法使用贪心策略求得一个近似解,具体步骤如下:

在样本中随机选取

math?formula=k个样本点充当各个簇的中心点

math?formula=%5C%7B%5Cmu_%7B1%7D%2C%5Cmu_%7B2%7D%2C...%2C%5Cmu_%7Bk%7D%5C%7D

计算所有样本点与各个簇中心之间的距离

math?formula=dist(x%5E%7B(i)%7D%2C%5Cmu_%7Bj%7D),然后把样本点划入最近的簇中

math?formula=x%5E%7B(i)%7D%5Cin%7B%5Cmu_%7Bnearest%7D%7D

根据簇中已有的样本点,重新计算簇中心

math?formula=%5Cmu_%7Bi%7D%3A%3D%5Cfrac%7B1%7D%7B%7CC_%7Bi%7D%7C%7D%5Csum_%7Bx%5Cin%7BC%7Bi%7D%7D%7Dx

重复2、3

改进

K-means算法得到的聚类结果严重依赖与初始簇中心的选择,如果初始簇中心选择不好,就会陷入局部最优解,如下图:

e4d5a0fbcefe

2018-10-28_10-17-53.png

e4d5a0fbcefe

2018-10-28_10-18-12.png

避免这种情况的简单方法是重复多次运行K-means算法,然后取一个平均结果。

另一种更精妙的方法是K-means++,它改进了K-means算法初始中心点的选取,改进后的选取流程如下:

在数据集中随机选取一个样本点作为第一个簇中心

math?formula=C_%7B1%7D

计算剩余样本点与所有簇中心的最短距离,令为

math?formula=D(x%5E%7B(i)%7D)%3Dmin%5Bdist(x%5E%7B(i)%7D%2CC_%7B1%7D)%2Cdist(x%5E%7B(i)%7D%2CC_%7B2%7D)%2C...%2Cdist(x%5E%7B(i)%7D%2CC_%7Bn%7D)%5D,某样本点被选为下一个簇中心的概率为

math?formula=%5Cfrac%7BD(x%5E%7B(i)%7D)%5E%7B2%7D%7D%7B%5Csum%7BD(x%5E%7B(j)%7D)%5E%7B2%7D%7D%7D

重复2直到选出

math?formula=k%E2%80%8B个簇中心

可以看出K-means++算法的思想很简单明了,初始簇中心之间的距离应该越大越好。

标签数据

K-means算法还可用于带标签的数据,在这种情况下,K-means会对每一个类别做单独的聚类。如某数据集可分为

math?formula=C个类别,那么K-means算法会将每一个类别看做是一个单独的数据集进行聚类操作。但是在不同类的数据有重叠的情况下,类内的聚类簇也会出现重叠现象,这是因为不同类之间的内部聚类是完全独立的,这样就造成类边界处的点极易被误分。下图就是对有三个类别(绿、黄、蓝)的数据做5-means聚类,黑圆点表示的是类内簇中心,紫色虚线表示的是贝叶斯分类边界。

e4d5a0fbcefe

2018-12-29_16-16-20.png

为了改进K-means在有标签数据及上的表现,有一种算法叫学习矢量量化(Learning Vector Quantization)能够利用标签信息来辅助聚类。核心思想是同类别的样本点会吸引簇中心,而不同类别的样本点会排斥簇中心,具体算法如下所示:

在每一个类别中都随机选取

math?formula=R个簇中心:

math?formula=C_%7B1%7D%5E%7B%5Bk%5D%7D,

math?formula=C_%7B2%7D%5E%7B%5Bk%5D%7D,

math?formula=...,

math?formula=C_%7BR%7D%5E%7B%5Bk%5D%7D

math?formula=k%3D1%2C%202%2C%20...%2C%20K

在所有数据中有放回地随机选取一个样本点

math?formula=x_%7Bi%7D,在所有簇中心中计算找出与

math?formula=x_%7Bi%7D最近的簇中心

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D,按照如下规则来移动簇中心

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D

如果

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D

math?formula=x_%7Bi%7D同类,则将

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D

math?formula=x_%7Bi%7D的方向移动:

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D%3A%3DC_%7Br%7D%5E%7B%5Bk%5D%7D%2B%7B%5Calpha%7D(x_%7Bi%7D-C_%7Br%7D%5E%7B%5Bk%5D%7D)

如果

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D

math?formula=x_%7Bi%7D异类,则将

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D

math?formula=x_%7Bi%7D的反方向移动:

math?formula=C_%7Br%7D%5E%7B%5Bk%5D%7D%3A%3DC_%7Br%7D%5E%7B%5Bk%5D%7D-%7B%5Calpha%7D(x_%7Bi%7D-C_%7Br%7D%5E%7B%5Bk%5D%7D)

重复2直到各簇中心不再变化或满足某种条件

LVQ算法中的

math?formula=%5Calpha为学习率,它会随着迭代次数而衰减至0。在同样的数据上应用LVQ的聚类结果如下:

e4d5a0fbcefe

2018-12-29_17-03-34.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值