从 2 个列表中查找相关系数

Posted

技术标签:

【中文标题】从 2 个列表中查找相关系数【英文标题】:Finding correlation coefficient from 2 lists 【发布时间】:2018-05-19 13:15:27 【问题描述】:

我正在开发一个项目,该项目在给定几个数据列表时具有许多功能。我已经分离了列表,并且定义了一些我知道可以正常工作的函数,即平均函数和标准差函数。我的问题是在测试我的列表时,我得到了正确的均值、正确的标准差,但相关系数不正确。我的数学可以在这里关闭吗?我只需要用 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

【问题讨论】:

可以添加mean,standDev函数 在编辑中添加了这些功能。它们似乎都工作正常。 【参考方案1】:

皮尔逊相关系数可以用numpy的corrcoef来计算。

import numpy
numpy.corrcoef(list1, list2)[0, 1]

【讨论】:

正如我所说,重要的是使用默认库完成此操作,而不是导入 numpy 或 pandas 之类的任何内容。【参考方案2】:

皮尔逊相关系数

代码(修改)

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

【讨论】:

希望对您有所帮助 这行得通!谢谢你。我对 r 分子部分的发现有疑问。这是从每个列表中的同一位置(i 的位置)获取每个产品的总和吗?由于列表包含字符串而不是浮点数/整数,这不是一个问题吗?为什么不需要先映射出来? @DeathPox 你被误导了,列表有数字而不是字符串。 如果你这样提供 ['1','2','3','4','4','8'], ['3','3','4 ','5','8','9'] 那么它是字符串。但我们将其发送为 [1,2,3,4,4,8], [3,3,4,5,8,9] 啊!我忘记了我在示例中使用了数字。我实际上是从将它们保存为字符串的数据表中获取我的列表。所以我需要做的就是应用 map 函数将其全部转换为浮点数。【参考方案3】:

你的标准差是错误的。你忘了取平方根。 您实际上返回的是方差而不是该函数的标准偏差。 @死亡痘

【讨论】:

@DeathPox 同样,您使用的是总体标准差,而您应该使用样本标准差,即 standardDeviation = square-root ( sdTotal / (len(newList) -1) ) easycalculation.com/statistics/standard-deviation.php跨度> 【参考方案4】:

通常根据标准差公式,你应该在sqrrt之前将dev除以样本数(列表的长度)。对吧? 我是说: dev += ((someList[i]-listMean)**2)/len(someList)

enter image description here

【讨论】:

以上是关于从 2 个列表中查找相关系数的主要内容,如果未能解决你的问题,请参考以下文章

怎么用excel求两行数据的相关系数?

如何利用matlab求相关系数?

python3-相关系数

如何使用SPSS分析三个变量之间的相关系数(x1、X2、y)?

Excel 公式CORREL算出来应该是啥相关系数?

如何理解皮尔逊相关系数