文本聚类—k-means

来源:互联网 发布:华为网络产品线 编辑:程序博客网 时间:2024/06/16 05:15

文本聚类—k-means

1       算法介绍

K-means是一个聚类算法,通过这个算法可以将给定的数据集切分为K个集合(K事先指定),同时保证任何一个元素到其所属类中心的的距离都小于这个元素到其他类中心的距离。用数学化的语言可以这样描述

         其中k为事先制定的聚类簇数,u为聚类完成后各个类别的中心点,x为各个原始样本。

算法过程可以描述如下:

1.         选择K个类别初始中心。

2.         在第i次迭代中,对于任意一个样本s,计算s到各个类中心的距离,将这个样本归到距离最小的类别中去

3.         更新各个类的中心,如果发现相邻两次更新没有变化,那么停止该算法,否则继续。

2       通俗理解

下面介绍一个通俗点的理解。

在平面上有9个点,标号从A-I。坐标见下图红点。

文本聚类—k-means - zengkui111 - 北斗之首——魁

如果利用k-means算法来进行聚类,假设初始化的中心点选择了3 EBH点。那么下一步可以计算所有点到这三个点的距离,然后将距离最小的中心作为点的新的中心,结果如下:

        

A

B

C

D

E

F

G

H

I

J

最近中心

H

B

B

B

E

E

E

H

H

B

根据第一步得到的结果可以中心计算出点的新的中心K3,2),M9.33,2),N7.75,6

将新的点画出来如下图黑点

文本聚类—k-means - zengkui111 - 北斗之首——魁

 

重新计算各个点到新的中心的距离,记录下最小的中心如下

A

B

C

D

E

F

G

H

I

J

最近中心

H

B

B

B

E

E

E

H

H

B

发现,第二次迭代得到的中心和第一次并没有变化(这里只是一个巧合而已)。 这时算法停止。那么平面上所有的点的聚类就已经完成。 三个类别为(AHI),(EFG),(BCDJ)。

为了更加形象的理解,可以以各个聚类中心为圆心,最远的点到中心的距离为半径中心画圆,然后再进行观察

文本聚类—k-means - zengkui111 - 北斗之首——魁
 
 

这样就能很好的理解一开始给出的数学定义了。

3       算法实现

实现代码:https://github.com/zengkui/machine-learning/blob/master/k-means/kmeans.py

本代码的测试数据是从搜狗实验室下载,选择了商务,数码产品,体育,娱乐4类文档。在代码实现的时候,对算法做了一些小的修改。

1.         在初始化中心的时候,因为已知是4类文档,那么就直接从这四类文档中各随机抽取一篇文档当做初始中心。

2.         特征选择上还是用的词,不过每一类的词都是用卡方分布挑选出来的,然后再合并成一个词典。

3.         实现了两个距离函数,余弦距离和欧式距离。

 

4       算法评估

实验中用户聚类的文本总数为4037个。对于不同的距离算法结果如下:

距离函数

正确率

收敛所需迭代次数

欧式距离

84.4

6

余弦距离

90.6%

14

 

         从这个数据来看当采用余弦距离的时候,利用k-means进行聚类会得到更好的结果。

 

5       算法复杂度

假设需要聚类的样本有N个,聚类结果有K个,特征个数为F,那么在每一轮中需要计算每个样本和每个中心的距离 需要消耗 K*N*F,所以总的复杂度应该还要乘以一个迭代次数M. 这个算法的复杂度还是偏高。

6       算法应用场景

聚类算法最典型的用就是用于web页面的聚类,如新闻聚类。一般的,在一个大型的门户网站在对新闻页面进行聚类的时候都会对这个算法进行一个改进。 考虑到新闻的时效性和准确性的要求可以将新闻聚类拆解为两个大的部分:在线算法和离线算法。

         离线算法其特点就是可以进行大批量的数据计算,在时间上没有太大的限制。离线算法可以每天进行1-2次计算把现有新闻聚成几个大类,为在线计算提供语料。

         在线算法特点是对新进的页面计算速度要足够外,新闻的更新要在分钟级别的。其一般做法就是利用离线计算好的各个大类,然后对于新进的页面进行类别分配,但是这里一般会有一个阈值的限定,当用阈值限定这种方法发现一个页面不属于现有任何类别时,那么这个页面就可以单独成为一个新类,这是就发现了新的话题。

原创粉丝点击