5
4

4 回答 4

11

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

于 2009-11-22T11:01:58.833 回答
3

如果您在 wikipedia 上查找Pearson 相关性,您会发现该公式使用了系列中每个项目之间的差异和系列的平均值。当系列中的所有项目都相同时,您会被零除,因此您的计算失败。

如果更清楚,您可以使用以下代码:

def simplified_sim_pearson(p1, p2):
    n = len(p1)
    assert (n != 0)
    sum1 = sum(p1)
    sum2 = sum(p2)
    m1 = float(sum1) / n
    m2 = float(sum2) / n
    p1mean = [(x - m1) for x in p1]
    p2mean = [(y - m2) for y in p2]
    numerator = sum(x * y for x, y in zip(p1mean, p2mean))
    denominator = math.sqrt(sum(x * x for x in p1mean) * sum(y * y for y in p2mean))
    return numerator / denominator if denominator else 0

def sim_pearson(prefs,p1,p2):
    p1 = prefs[p1]
    p2 = prefs[p2]
    si = set(p1.keys()).intersection(set(p2.keys()))
    p1_x = [p1[k] for k in sorted(si)]
    p2_x = [p2[k] for k in sorted(si)]
    return simplified_sim_pearson(p1_x, p2_x)



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', )
print sim_pearson(critics2, 'user1', 'user2', )
print sim_pearson(critics3, 'user1', 'user2', )

顺便说一句,使用 Excel 确定正确答案是验证大多数计算的好方法。在这种情况下,您将使用correl.

于 2009-11-22T21:20:04.843 回答
0

该算法给出了正确的结果。0 表示它们之间没有相关性(或者至少您无法从您所知道的情况中分辨出来)。

通常(取决于您应用此算法的领域)您可以将 -0.9 < x < 0.09 之间的所有内容视为“不可观察的相关性”。

于 2009-11-22T11:17:03.197 回答
0

相关性并不意味着因果关系。不得不说。您需要了解相关统计数据。相关性可以在 -1 和 1 之间,0 值落在此范围内,是一个完全合理的结果。相关性为 0 意味着 2 个变量之间不存在统计上显着的关系。请记住避免使用少于 30 个样本进行统计。

于 2009-11-22T14:23:11.717 回答