Note4: 代码错误
真的是一遍一遍的找代码的错误啊,第一个函数sim_distance就错了,可是当时只有一个测试数据,没有检查出来。
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[person2][item],2) for item in prefs[person1] if item in prefs[person2]]) return 1/(1+sqrt(sum_of_squares))
错误是在最后 return 1/(1+sqrt(sum_of_squares)) 应该是 return 1/(1+sum_of_squares)
另外一个是因为缩进的错误:
#利用所有他人评价值的加权平均,为某人提供建 议 def getRecommendations(prefs,person,similarity=sim_pearson): totals={} simSums={} for other in prefs: #不要和自己比较 if other==person: continue sim=similarity(prefs,person,other) #忽略评价值为0或小于0的情况 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
这几行:
#建立一个归一化的列表 rankings=[(total/simSums[item],item) for item,total in totals.items()] #返回经过排序的列表 rankings.sort() rankings.reverse() return rankings
应该与第一个for(for other in prefs:)对齐 。