Collaborative Filtering
David Goldberg 1992 《Using collaborative filtering to weave an information tapestry》
Tapestry框架 web端 (—>待了解)
1.搜集偏好 Collecting Preferences
python 嵌套字典 数据库
2.寻找相似的用户 Finding Similar Users
相似度评价:
1.欧几里得距离 Euclidean Distance Score
—————————————————————————————————
代码段
from math import sqrt
#返回一个有关person1与person2的基于距离的相似度评价
def sim_distance(prefs,person1,person2):
#得到shared_items的列表
si = {}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] = 1
#如果两者没有共同之处,则返回0
if len(si) == 0: return 0
#计算所有差值的平方和
sum_of_squares = sum([pow(prefs[person1][item] - prefs[preson2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return 1/(1+sqrt(sum_of_squares))
—————————————————————————————————
2.皮尔逊相关度评价 Pearson Correlation Score
修正夸大分值(grade inflation)在数据不规范的时候会倾向于给出更好的结果
—————————————————————————————————
计算公式
—————————————————————————————————
代码段
def sim_pearson(prefs,person1,person2):
# 得到双方都曾评价过的物品列表
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] = 1
# 得到列表元素的个数
n = len(si)
# 如果两者没有共同之处,则返回1
if n==0: return 1
# 对所有偏好求和
sum1 = sum([prefs[person1][item] for item in si])
sum2 = sum([prefs[person2][item] for item in si])
#求平方和
sum1sq = sum([pow(prefs[person1][item],2) for item in si])
sum2sq = sum([pow(prefs[person2][item],2) for item in si])
#求乘积之和
pSum = sum([prefs[person1][item]*prefs[person2][item] for item in si])
#计算皮尔逊评价值
num = pSum-(sum1*sum2/n)
den = sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))
if den == 0: return 0
r = num/den
return r
—————————————————————————————————
3.应该选择哪一种相似性度量方法 Which Similarity Metric Should You Use
(1)欧几里得算法
(2)皮尔逊相关度
(3)Jaccard系数 (—>待了解)
(4)曼哈顿距离算法
4.为评论者打分Ranking the Critics
—————————————————————————————————
代码段
#从反映偏好的字典中返回最为匹配者
#返回结果的个数和相似度函数均为可选参数
def topMatches(prefs,person,n=5,similarity=sim_pearson):
scores=[(similarity(prefs,person,other),other)for other in prefs if other != person]
#对列表进行排序,评价值最高者排在最前面
score.sort()
score.reverse()
return scores[0:n]
—————————————————————————————————
5.推荐物品Recommending Items
加权评价值
—————————————————————————————————
代码段
#利用所有他人评价值的加权平均,为某人提供建议
def getRecommendations(prefs,person,similarity = sim_pearson):
totals = {}
simSums = {}
for other in prefs:
#不用和自己做对比
if other == person: continue
sim = similarity(prefs,person,other)
#忽略评价值为零或小于零的情况
if sim<=0:continue
for item in prefs[other]:
#只对自己还没有看过的影片进行评价
if item not in prefs[person] or prefs[person][item] == 0:
totals.setdefault(item,0)
#相似度*评价值
totals[item]+=prefs[other][item]*sim
#相似度之和
simSums.setdefault(item,0)
simSums[item]+=sim
#建立一个归一化的列表
rankings = [(total/simSums[item],item) for item,total in totals.items()]
#返回经过排序的列表
rankings.sort()
rankings.reverse()
return rankings
—————————————————————————————————