读书笔记:“集体智慧编程”之第三章:带偏好条件的聚类及聚类的展示方式

带偏好条件的聚类


含义


第五章讲求最优解的时候,也有一个涉及偏好的对宿舍分配人员的例子。我发现这个挺喜欢讲针对偏好的情况。然而,我个人认为这个针对偏好这一说法,还是比较复杂的,所以我认为最好不要试着去理解其词语背后深刻的含义,没有深刻的含义。举例子说明就很好办

有一个网站:Zebo(www.zebo.com),允许人们列出自己有拥有的物品和希望拥有的物品。我们今天的例子就是针对其列出来的信息做一次聚类。说实话,光凭感觉就觉得这些数据非常有价值,对其研究很值得。
数据集的获得可以自己从网上抓获,也可以直接使用书中为我们附带的zebo.txt文档,在zebo.txt文档中,只有列出用户希望拥有的物品:1/0,1表示想要,0表示不想要。例子暂时没有研究自己的已经拥有的物品,实际上我没有上过zebo,要列出自己需要的物品我觉这个还比较复杂,自己的东西那么多,怎么方便列的完呢?

相似度的计算


书中认为:皮尔逊相关度非常适合前几个例子的博客数据集,因为:单词的词频对应某篇博客是有具体的几个几个的。此处对于,无论是拥有物品或者想拥有的物品,却只有两个数,有或没有:1或0,想要或者不想要:1或0.所以我们使用Tanimoto系数计算两个用户的相关度。Tanimoto系统的具体含义在推荐的那篇博客里已经说清楚了,就是交集与并集的比率。

代码如下:
def tanimoto(v1,v2):
    c1,c2,share=0,0,0


    for i in range(len(v1)):
        if v1[i]!=0:c1+=1#v1中有这个物品
        if v2[i]!=0:c2+=1
        if v1[i]!=0 and v2[i]!=0:share+=1#如果在两个集合中都有这些物品


    return 1.0-(float(share)/(c1+c2-share))

对相似度计算的感悟

对应哪个计算方式好,书中的意思是在针对0/1的情况时,用Tanimoto系统好,但是其实我发现Tanimoto系数算出来的和我想象中不太一样,而又比较倾向与想象中的使用方式,当然后来向师哥证实,这确实是一种公式,只是我还没学习过。

想象中的方式是:并集乘以2/交集。但这个交集不要减去并集。
比如,用1,2...代替物品,组成集合
A用户:[1,2,3,4,5,6]
B用户:[2,4,6,7,8,9]
显然两者并集为[2,4,6],供三个元素。
两者相似度,用我的想法算出来就(3*2)/12=0.5
从集合内观察,我觉得有一半是一样的,所以就是0.5
然而如果用Tanimoto计算的话,就是3/(12-3)=0.33333333。这就是使我困惑的地方。
因为用Tanimoto计算出来的相似不是0.5,而且觉得目测就该是0.5。

此外,在我推荐那篇博客里已经证实:就算用Pearson计算出来的结果也不会差太差,也就是pearson也可以用来计算1/0这种的情况。实际上书中在在推荐那一章中对标签的处理也使用了pearson公式。我认为现在纠结这样相似度的计算意义不是特别大,因为真实的数据我还没有到手,到手之后,我们再比较不同的公式,改进不同的公式,这才是非常有必要的。


聚类展示


树状图


Tanimoto计算相似度


因为之前,我们已经写好了产生树状图的一系列代码。相当于现在我们只是调用一下之前写好的代码就可以产生结果。

调用代码:


wants,people,data=readfile('zebo.txt')
clust=hcluster(data,distance=tanimoto)
drawdendrogram(clust,wants,jpeg='zebo树状图.jpg')


我们可以得到下一幅图:





我们截取其中一部分来看,会有有趣的发现:


很有意思吧,想要鞋子的想要衣服,想要psp的想要tv,想要xbox360的想要ps3。想要laptop的也想要MP3。没看懂为什么想要playstation 3想要马。

皮尔逊计算相似度

其实虽然数据部分只是0和1,其实也是可以用皮尔逊计算的,计算的代码:


blognames,words,data=readfile('zebo.txt')
clust=hcluster(data)
drawdendrogram(clust,blognames,jpeg='zebo皮尔逊计算相似度.jpg')


得到的大图:



分析其中一部分:
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值