从 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 个列表中查找相关系数的主要内容,如果未能解决你的问题,请参考以下文章