聚类算法(2)

(接上《聚类算法(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值