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:)对齐 。

posted @ 2016-08-18 12:19  hy叶子  阅读(143)  评论(0编辑  收藏  举报