从两个列表中找到相关系数

4

我正在处理一个项目,该项目可以在给定一些数据列表时执行许多功能。我已经将这些列表分开,并定义了一些函数,我确定它们是正确的,其中包括均值函数和标准差函数。问题在于当我测试我的列表时,我得到了正确的平均值、正确的标准偏差,但错误的相关系数。我的数学运算可能出问题了吗?我需要使用Python标准库来查找相关系数。

我的代码:

def correlCo(someList1, someList2):

    # First establish the means and standard deviations for both lists.
    xMean = mean(someList1)
    yMean = mean(someList2)
    xStandDev = standDev(someList1)
    yStandDev = standDev(someList2)
    zList1 = []
    zList2 = []

    # Create 2 new lists taking (a[i]-a's Mean)/standard deviation of a
    for x in someList1:
        z1 = ((float(x)-xMean)/xStandDev)
        zList1.append(z1)

    for y in someList2:
        z2 = ((float(y)-yMean)/yStandDev)
        zList2.append(z2)

    # Mapping out the lists to be float values instead of string     
    zList1 = list(map(float,zList1))
    zList2 = list(map(float,zList2))
    # Multiplying each value from the lists
    zFinal = [a*b for a,b in zip(zList1,zList2)]
    totalZ = 0
    # Taking the sum of all the products
    for a in zFinal:
        totalZ += a
    # Finally calculating correlation coefficient
    r = (1/(len(someList1) - 1)) * totalZ

    return r

样例运行:

我有一个列表[1,2,3,4,4,8]和[3,3,4,5,8,9]

我期望得到正确答案r = 0.8848,但是得到的是r = .203727

编辑:为了包含我所做的平均值和标准差函数。

def mean(someList):
    total = 0
    for a in someList:
        total += float(a)
    mean = total/len(someList)
    return mean

def standDev(someList):
    newList = []
    sdTotal = 0
    listMean = mean(someList)
    for a in someList:
        newNum = (float(a) - listMean)**2
        newList.append(newNum)

    for z in newList:
        sdTotal += float(z)

    standardDeviation = sdTotal/(len(newList))

    return standardDeviation

你能添加平均值和标准差函数吗? - Tilak Putta
在编辑中添加了这些函数。它们似乎都正常工作。 - user7884512
4个回答

4
Pearson相关系数可以使用numpy的corrcoef进行计算。
import numpy
numpy.corrcoef(list1, list2)[0, 1]

正如我所说,重要的是使用默认库来完成这个任务,而不是导入像numpy或pandas这样的任何东西。 - user7884512

4

皮尔逊相关系数

Pearson Correlation Coeficient

代码(修改后)

def mean(someList):
    total = 0
    for a in someList:
        total += float(a)
    mean = total/len(someList)
    return mean
def standDev(someList):
    listMean = mean(someList)
    dev = 0.0
    for i in range(len(someList)):
        dev += (someList[i]-listMean)**2
    dev = dev**(1/2.0)
    return dev
def correlCo(someList1, someList2):

    # First establish the means and standard deviations for both lists.
    xMean = mean(someList1)
    yMean = mean(someList2)
    xStandDev = standDev(someList1)
    yStandDev = standDev(someList2)
    # r numerator
    rNum = 0.0
    for i in range(len(someList1)):
        rNum += (someList1[i]-xMean)*(someList2[i]-yMean)

    # r denominator
    rDen = xStandDev * yStandDev

    r =  rNum/rDen
    return r

print(correlCo([1,2,3,4,4,8], [3,3,4,5,8,9]))

输出

0.884782972876

希望这可以帮助到你。 - Tilak Putta
这个有效!谢谢。我有一个关于找到r分子部分的问题。这是从每个列表中相同位置(即i的位置)的每个乘积的总和吗?由于列表包含字符串而不是浮点数/整数,这不会成为问题吗?为什么它不需要先映射出来呢? - user7884512
@DeathPox 你误导了,列表中是数字而不是字符串。 - Tilak Putta
如果您提供的是 ['1','2','3','4','4','8'], ['3','3','4','5','8','9'] 这样的字符串,但我们需要将其转换为 [1,2,3,4,4,8], [3,3,4,5,8,9] 的形式。 - Tilak Putta
啊!我忘记在示例中使用了数字。实际上,我从一个将它们保存为字符串的数据表中获取我的列表。所以我需要做的就是应用map函数将其全部转换为浮点数。 - user7884512

0

你的标准差计算有误。你忘记取平方根了。 实际上,你从那个函数中返回的是方差而不是标准差。 @DeathPox


@DeathPox,另外,您正在使用总体标准差,而应该使用样本标准差,即 standardDeviation = square-root ( sdTotal / (len(newList) -1) )https://www.easycalculation.com/statistics/standard-deviation.php - Ashutosh Bharti

0

通常根据标准差公式,在对其进行平方根运算之前,您应该将偏差除以样本数量(列表长度)。对吧? 我的意思是: dev += ((someList[i]-listMean)**2)/len(someList)

在此输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接