聚类算法(2)

来源:互联网 发布:录制脚本的软件 编辑:程序博客网 时间:2024/06/12 22:19

(接上《聚类算法(1)》)

 

除了在聚类算法(1)中的分级聚类,关于聚类还可以使用K-均值聚类(也是为了克服分级聚类的两个不足之处)。

 

算法描述:

这里有比较详尽的算法描述。(嗯,《Programming Collective Intelligence 》上有幅超级好的插图。。。)

 

 

 

说明:

1.rows是什么?

   rows是从数据文件中读入的关于单词的频度数据。比如这里的rows,共有32项(有32个博客,即初始时有32个聚类),每项有629个数据(即,有629个单词,当然这些数据只是数字,是某单词(共629个)(该单词保存在其他地方)所对应的频度)。而我们进行的是,根据这些单词,分类那32个博客。故,我们的pearson算法计算的是一个长度629的列表与另一个629长的列表之间的距离。

这个629长的列表即是我们所谓的点(我们要聚类的对象)。

2.clusters是什么?

   说clusters是K个中心点。那么K个中心点到底是什么?注意这里的“点”和平常所谓的点是不同的,上面的粗体部分已具体解释。说,clusters是k个中心点,即是说,clusters是个长度为k的列表,表中的每个元素是长度为620的数组(其中为我们随机产生的单词频度)。

那么,

“ 在每一行寻找距离最近的中心点”的意义也就明确了:将这32个条目(每个条目629项数据)中的某些同这k个所谓的中心点相关联。

另,

注意“移动中心点”中的if len(bestmatches[i]) > 0:一句是不可缺少的。因为可能这K个点中存在某些点,没有数据与他们相近,于是他们的长度就为0。

同时注意bestmatches中存的是什么?看代码:bestmatches[bestmatch].append(j),我们知,bestmatches中存放的实际是某条数据在入内数据集中的序号。而在计算平均数时,也是计算的这些所有数据的平均数。

总之,记住这里的点实际上是个表。

 

最后再append一个Tanimoto算法,用于距离度量。更精确的说,是用于这样的数据的距离度量:该数据中只可能有0,1两种取值,其中0代表不存在,1代表存在。(即yes和no的问题)

 

注意这里是距离度量,因此,返回0,表示二者之间无距离,即两者喜欢的东西一模一样;返回1,则表示两者不存在都喜欢的东西(因为我们进行的是对一个列表度量距离,该列表可能代表了两个人喜欢的东西的列表)。

 

 

最后,贴出完整的代码:

 

数据聚类算法:

 

 

从博客订阅源中生成初始数据:

 

 

作树状图:

 

 

By Kewing