2014-03-27
在 基于用户的协同过滤中已经简单的介绍了协同过滤的思想,在实际应用中还有一种叫做基于物品的协同过滤(Item CF
)。
计算书籍之间的相似性
在 基于用户的协同过滤 文中提到下面的表:
用户 | book01 | book02 | book03 | book04 |
---|---|---|---|---|
user1 | 2 | 4.5 | 4.5 | 3 |
user2 | 2.5 | 4.0 | 4.5 | 3 |
user3 | 4 | 3 | 3 | 4 |
上表表示user1、user2、user3分别对book01、book02、book03和book04的评价。将上面的表转置,在多加几条数据,则变为:
书籍 | user1 | user2 | user3 |
---|---|---|---|
book01 | 2 | 2.5 | 4 |
book02 | 4.5 | 4.0 | 3 |
book03 | 4.5 | 4.5 | 3 |
book04 | 3 | 3 | 4 |
book05 | 2.5 | 2 | 2.5 |
book06 | 3 | 4 | 3.5 |
由上表我们可以判断每本书之间的相似性:
from math import sqrt
def get_euclidean_similarity(dot1, dot2):
''' 根据欧几里得距离判断相似性'''
s = sum([pow(dot1[x] - dot2[x], 2) for x in range(len(dot1))])
return 1.0 / (1.0 + sqrt(s))
if __name__ == '__main__':
books = {'book01': [2, 2.5, 4],
'book02':[4.5, 4.0 ,3],
'book03':[4.5, 4.5, 3],
'book04':[3, 3, 4],
'book05':[2.5, 2, 2.5],
'book06':[3, 4, 3.5]
}
book_names = books.keys()
book_num = len(book_names)
groups = [[book_names[x1],book_names[x2]] for x1 in xrange(book_num) for x2 in xrange(book_num) if x1 < x2 ]
for group in groups:
print group[0]+'~'+group[1], get_euclidean_similarity(books[group[0]], books[group[1]])
计算结果如下:
书~书 | 相似性 |
---|---|
book01~book03 | 0.229668484512 |
book01~book02 | 0.244965529586 |
book01~book05 | 0.37617851153 |
book01~book04 | 0.472135955 |
book01~book06 | 0.348331477355 |
book03~book02 | 0.666666666667 |
book03~book05 | 0.235828457811 |
book03~book04 | 0.298935084425 |
book03~book06 | 0.37617851153 |
book02~book05 | 0.258245699761 |
book02~book04 | 0.32663163471 |
book02~book06 | 0.387425886723 |
book05~book04 | 0.348331477355 |
book05~book06 | 0.303832434701 |
book04~book06 | 0.472135955 |
由上表可见,很容易看出book02和book03最为相似。由上面的结果,已经可以做一个简单的推荐了,例如如果用户读了book01,那么可以向其推荐book04,因为这两本书相似性很大。
不过,一般是仍然使用加权平均向用户推荐。
向用户推荐书籍
假设用户user4读过book01和book02,对两本书的评价如下:
book01 | book02 |
---|---|
3.5 | 4.5 |
下面试着计算应该向用户user4推荐book03、book04、book05、book06中的哪一本。
book01与book03之间的相似度为0.229668484512,book02与book03之间的相似度为0.666666666667,所以book03的推荐值为:
( 3.5*0.229668484512 + 4.5*0.666666666667 ) / (0.229668484512 + 0.666666666667)
= 4.243769410125326
同理,book04的推荐值为:
( 3.5*0.472135955 + 4.5*0.32663163471 ) / (0.472135955 + 0.32663163471)
= 3.908919489120217
book05的推荐值为:
( 3.5*0.37617851153 + 4.5*0.258245699761 ) / (0.37617851153 + 0.258245699761)
= 3.9070552402713186
book06的推荐值为:
( 3.5*0.348331477355 + 4.5*0.387425886723 ) / (0.348331477355 + 0.387425886723)
= 4.026567460467752
由上面的计算可得,这四本书的推荐程度由大到小依次为:`book03 -> book06 -> book04 -> book05。