2017年6月3日机器学习笔记

时间:2022-12-28 18:31:30

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)在数据不规范的时候会倾向于给出更好的结果
—————————————————————————————————
计算公式
num=Nk=1aibiNk=1aiNk=1biN

den=(Nk=1a2i(Nk=1ai)2N)(Nk=1b2i(Nk=1bi)2N)

res=numden
—————————————————————————————————
代码段

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

—————————————————————————————————