3

我正在尝试计算列表中每个项目之间的 Pearson 相关性。我正在尝试获取数据 [0] 和数据 [1]、数据 [0] 和数据 [2] 以及数据 [1] 和数据 [2] 之间的相关性。

import scipy
from scipy import stats

data = [[1, 2, 4], [9, 5, 1], [8, 3, 3]]

def pearson(x, y):
    series1 = data[x]
    series2 = data[y]
    if x != y:
        return scipy.stats.pearsonr(series1, series2)

h = [pearson(x,y) for x,y in range(0, len(data))]

这将返回错误TypeError: 'int' object is not iterableh有人可以在这里解释错误吗?谢谢。

4

3 回答 3

3

range将在您尝试使用它时返回一个 int 值列表,就像它返回一个元组一样。尝试itertools.combinations代替:

import scipy
from scipy import stats
from itertools import combinations

data = [[1, 2, 4], [9, 5, 1], [8, 3, 3]]

def pearson(x, y):
    series1 = data[x]
    series2 = data[y]
    if x != y:
        return scipy.stats.pearsonr(series1, series2)

h = [pearson(x,y) for x,y in combinations(len(data), 2)]

或者正如@Marius 建议的那样:

h = [stats.pearsonr(data[x], data[y]) for x,y in combinations(len(data), 2)]
于 2012-11-07T03:20:01.837 回答
0

为什么不使用numpy.corrcoef

import numpy as np
data = [[1, 2, 4], [9, 5, 1], [8, 3, 3]]  

结果:

>>> np.corrcoef(data)
array([[ 1.        , -0.98198051, -0.75592895],
       [-0.98198051,  1.        ,  0.8660254 ],
       [-0.75592895,  0.8660254 ,  1.        ]])
于 2012-11-07T03:32:28.503 回答
0

range() 函数只会为每次迭代提供一个 int,并且不能将一个 int 分配给一对值。

如果您想遍历该范围内所有可能的整数对,您可以尝试

import itertools

h = [pearson(x,y) for x,y in itertools.product(range(len(data)), repeat=2)]

这将把给定范围内的所有可能性组合在一个 2 个元素的元组中

请记住,使用您定义的函数,当 x==y 时,您将拥有 None 值。要解决这个问题,您可以使用:

import itertools

h = [pearson(x,y) for x,y in itertools.permutations(range(len(data)), 2)]
于 2012-11-07T03:36:20.130 回答