"编程集体智慧"中的皮尔逊算法有什么问题?

Hob*_*use 5 python algorithm pearson

这个函数来自"编程集体智慧"一书,并且应该计算p1和p2的Pearson相关系数,它应该是介于-1和1之间的数字.

如果两个评论家对项目的评价非常相似,那么函数应该返回1,或接近1.

有了真实的用户数据,我有时会得到奇怪的结果.在以下示例中,数据集critics2应返回1 - 而不是返回0.

有没有人发现错误?

(这不是"编程集体智慧"中这个python函数什么问题的重复)

from __future__ import division
from math import sqrt

def sim_pearson(prefs,p1,p2):
    si={}
    for item in prefs[p1]: 
        if item in prefs[p2]: si[item]=1
    if len(si)==0: return 0
    n=len(si)
    sum1=sum([prefs[p1][it] for it in si])
    sum2=sum([prefs[p2][it] for it in si])
    sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
    sum2Sq=sum([pow(prefs[p2][it],2) for it in si]) 
    pSum=sum([prefs[p1][it]*prefs[p2][it] for it 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

critics = {
    'user1':{
        'item1': 3,
        'item2': 5,
        'item3': 5,
        },
    'user2':{
        'item1': 4,
        'item2': 5,
        'item3': 5,
        }
}
critics2 = {
    'user1':{
        'item1': 5,
        'item2': 5,
        'item3': 5,
        },
    'user2':{
        'item1': 5,
        'item2': 5,
        'item3': 5,
        }
}
critics3 = {
    'user1':{
        'item1': 1,
        'item2': 3,
        'item3': 5,
        },
    'user2':{
        'item1': 5,
        'item2': 3,
        'item3': 1,
        }
}

print sim_pearson(critics, 'user1', 'user2', )
result: 1.0 (expected)
print sim_pearson(critics2, 'user1', 'user2', )
result: 0 (unexpected)
print sim_pearson(critics3, 'user1', 'user2', )
result: -1 (expected)
Run Code Online (Sandbox Code Playgroud)

Den*_*ach 11

你的结果没有错.你试图通过3点绘制一条线.在第二种情况下,你有三个具有相同坐标的点,即实际上有一个点.你不能说这些点是相关的还是反相关的,因为你可以通过一个点绘制无限数量的线(den在你的代码中等于零).