python - 尝试计算相关系数但返回的值高得离谱

标签 python math statistics

所以在开始之前,先看一下代码:

from math import sqrt

def Summation(valueList):
    outValue = 0
    for item in valueList:
        outValue += item
    return outValue
def multSummation(vOne, vTwo):
    outValue = 0
    for item in range(0, len(vOne)):
        outValue += vOne[item] * vTwo[item]
    return outValue
def Correlator(xList=[],yList=[]):
    #r = n(Exy)-(Ex)(Ey) / sqrt([nEx^2-(Ex)^2][nEy^2-(Ey)^2])#God help me

    r = (len(xList) * multSummation(xList,yList)) - (Summation(xList) * Summation(yList)) / (sqrt((len(xList) * (multSummation(xList,xList)) - (multSummation(xList,xList) * multSummation(xList,xList))) * ((len(xList) * multSummation(yList,yList)) - (multSummation(yList,yList) * multSummation(yList,yList)))))
    return r

valOne = {1950:5,1955:9,1960:8,1965:3,1970:6,1975:7,1980:6}
valTwo = {1950:2,1956:5,1960:4,1965:1,1968:2,1975:3,1980:3}
matchingKeysList = []
for x in valOne.keys():
    for y in valTwo.keys():
        if x == y:
            matchingKeysList.append(x)
valOneCleaned = {}
valTwoCleaned = {}
for x in valOne:
    if x in matchingKeysList:
        valOneCleaned[x] = valOne[x]
for y in valTwo:
    if y in matchingKeysList:
        valTwoCleaned[y] = valTwo[y]

valOneList = []
valTwoList = []
for x in valOneCleaned:
    valOneList.append(valOneCleaned[x])
for y in valTwoCleaned:
    valTwoList.append(valTwoCleaned[y])


#MAIN LOOP HERE
print(valOneList)
print(valTwoList)
print(Correlator(valOneList, valTwoList))

仅供引用,这不是一个大学项目。它基本上需要两个字典 valOne 和 valTwo 并清理数据,以便只清理两者之间的匹配年份。完成此操作后,它将获取这些值并将它们放入列表中,然后将其提供给相关器函数,该函数接收两个列表并在两者之间计算相关系数。该值应该在 -1 和 1 之间,但最终却给出了高得离谱的数字,例如 419.9。请帮助我可怜的未受过教育的大脑。

最佳答案

相关公式中的括号不正确。在您的代码中,实际上只有分子的一部分被分母除。而且,分母的公式并不完全正确。试试这个:

r = ((len(xList) * multSummation(xList,yList)) - (Summation(xList) * Summation(yList))) / (sqrt((len(xList) * (multSummation(xList,xList)) - (Summation(xList) * Summation(xList))) * ((len(xList) * multSummation(yList,yList)) - (Summation(yList) * Summation(yList)))))

使用多行重写方程将更容易阅读和调试。您可以使用内置的 sum 来代替使用 Summation 函数。

n = len(xList)
Ex = sum(xList)
Ey = sum(yList)
Exx = multSummation(xList,xList)
Exy = multSummation(xList,yList)
Eyy = multSummation(yList,yList)
numerator = n * Exy - Ex * Ey
denominator = sqrt(n * Exx - Ex * Ex) * sqrt(n * Eyy - Ey * Ey)
r = numerator / denominator

关于python - 尝试计算相关系数但返回的值高得离谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863816/

相关文章:

algorithm - 几何图案质量和填充

python - 计算最小二乘拟合的置信带

python - 图像拼接

python - 在 TensorFlow 重新训练诗人期间 GPU 利用率为 0%

Python + Selenium WebDriver : open URL in new tab

python - Django:上传的文件没有被垃圾收集,导致内存问题

c# - 线条旋转问题

math - 用于地形生成的 Perlin 噪声

algorithm - 如何找到给定范围内可被给定值整除的值的数量?

java - 如何将这个峰度公式从 java 文档转换为 Ruby?