一.公式化简
- 一般的我们学到的公式:
一般我们学到的皮尔逊相关系数公式可能长这个样子,但是这个样子不好用代码实现呀!所以我们帮它化简成下面的样子
- 化简后的公式:
二.代码部分
-
代码说明:
程序中用Numpy库中自带的相关系数包进行了结果验证,结果是一样的,所以可以证明此代码的正确性!
【另外说明一点,Numpy库输出的是相关系数矩阵,只不过矩阵化了,是一个意思!】 -
运行环境:
2019版PyCharm,Python版本是3.8
import numpy as np
from math import *
def myltipl(a,b):
"""
作用:求取∑xiyi(序列1和序列2所有元素分别相乘再相加)
地位:总体公式的子公式
:param a:x序列
:param b:y序列
:return:
"""
sumofab = 0.0
for i in range(len(a)):
temp = a[i]*b[i]
sumofab+=temp
return sumofab
def cal_pccs(x,y):
"""
总体公式
(Pearson)皮尔逊相关系数总体计算公式
:param x:序列1
:param y:序列2
:return:返回相关系数
"""
n = len(x) # 获取“序列1”的长度
# 求和
sum1=sum(x) # ∑xi 计算”序列1“所有元素的和
sum2=sum(y) # ∑yj 计算“序列2”所有元素的和
# 求乘积之和
sumofxy = myltipl(x,y) # 求∑xiyi
# 求平方和
sumofx2 = sum([pow(i,2) for i in x]) # pow(i,2)函数功能求的是i的平方
sumofy2 = sum([pow(j,2) for j in y])
num = sumofxy-(float(sum1) * float(sum2) / n) # 公式中分子的“被减数 - 减数”
# 计算皮尔逊相关系数
den = sqrt((sumofx2 - float(sum1**2) / n) * (sumofy2 -float(sum2**2) / n)) # 公式中的分母
return num/den # 返回最终的计算结果
def Zpow():
print(pow(2,2))
if __name__=='__main__':
"""-----------数据集-------------------"""
x = np.array([1,2,3,4,5,6,7,8,9]) # 这两个序列是测试用的
y = np.array([1,2,3,4,5,6,7,8,9])
"""-----------手写公式-------------------"""
corr_Handcraft = cal_pccs(x,y) # 输入两个序列
"""-----------numpy库写公式-------------------"""
corr_Numpy = np.corrcoef(x, y)
"""-----------展示-------------------"""
print("手写皮尔逊相关系数公式的结果:",corr_Handcraft)
print("运用numpy包写的皮尔逊相关系数公式:\n",corr_Numpy)
如果对你有帮助的话请点个赞再走吧~你的支持是我做下去的动力呀!