爱心目录
一.公式化简二.代码部分一.公式化简
一般的我们学到的公式:一般我们学到的皮尔逊相关系数公式可能长这个样子,但是这个样子不好用代码实现呀!所以我们帮它化简成下面的样子
化简后的公式:
二.代码部分
代码说明:
程序中用Numpy库中自带的相关系数包进行了结果验证,结果是一样的,所以可以证明此代码的正确性!
【另外说明一点,Numpy库输出的是相关系数矩阵,只不过矩阵化了,是一个意思!】
运行环境:
版PyCharm,Python版本是3.8
import numpy as npfrom math import *def myltipl(a,b):"""作用:求取∑xiyi(序列1和序列2所有元素分别相乘再相加)地位:总体公式的子公式:param a:x序列:param b:y序列:return:"""sumofab = 0.0for i in range(len(a)):temp = a[i]*b[i]sumofab+=tempreturn sumofabdef 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)
如果对你有帮助的话请点个赞再走吧~你的支持是我做下去的动力呀!