php是最好的语言

python3原生代码实现皮尔森相关系数

import pandas as pd
import sys
from math import sqrt
import numpy
import pandas

def person(x,y):
    data = pandas.DataFrame()
    data['x'] = x
    data['y'] = y

    print('x与y相关系数为:',data.corr()['x']['y'])

def multiply(a,b):
    #a,b两个列表的数据一一对应相乘之后求和
    sum_ab=0.0
    for i in range(len(a)):
        temp=a[i]*b[i]
        sum_ab+=temp
    return sum_ab

# https://blog.csdn.net/xzfreewind/article/details/73550856 下面用的是最后一个公式来实现的
def cal_pearson(x,y):

    n=len(x)
    #求x_list、y_list元素之和
    sum_x = sum(x)
    sum_y = sum(y)

    #求x_list、y_list元素乘积之和
    sum_xy=multiply(x,y)
    #求x_list、y_list的平方和
    sum_x2 = sum([pow(i,2) for i in x])
    sum_y2 = sum([pow(j,2) for j in y])
    molecular=sum_xy-(float(sum_x)*float(sum_y)/n)
    #计算Pearson相关系数,molecular为分子,denominator为分母
    denominator=sqrt((sum_x2-float(sum_x**2)/n)*(sum_y2-float(sum_y**2)/n))

    print('x与y相关系数为:',molecular/denominator)


if __name__=='__main__':

    x = numpy.array([1,2,1])
    y = numpy.array([4,2,13])
    #自带函数
    person(x,y)
    #自己编写函数
    cal_pearson(x,y)
    # x与y相关系数为: -0.6404640308067907
    # x与y相关系数为: -0.6404640308067903
    #运行结果几乎一致的


作者:xTao 分类:LNMP 浏览:2392 评论:0