带偏好条件的聚类
含义
第五章讲求最优解的时候,也有一个涉及偏好的对宿舍分配人员的例子。我发现这个挺喜欢讲针对偏好的情况。然而,我个人认为这个针对偏好这一说法,还是比较复杂的,所以我认为最好不要试着去理解其词语背后深刻的含义,没有深刻的含义。举例子说明就很好办
有一个网站: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')
得到的大图:
分析其中一部分: