7.8回归中的相关度和R平方值应用

Python实现:

# -*- coding:utf-8 -*-
# Author:YaHuYang
#2018/7/25
import numpy as np
import math
from astropy.units import Ybarn


# 相关度
def computeCorrelation(X, Y):
    xBar = np.mean(X)
    yBar = np.mean(Y)
    SSR = 0
    varX = 0
    varY = 0
    for i in range(0, len(X)):
        diffXXBar = X[i] - xBar
        diffYYBar = Y[i] - yBar
        SSR += (diffXXBar * diffYYBar)
        varX += diffXXBar ** 2
        varY += diffYYBar ** 2
    SST = math.sqrt(varX * varY)
    return SSR / SST


# 多项式回归
def polyfit(x, y, degree):  # degree是x的次数,此处为:1
    results = {}
    coeffs = np.polyfit(x, y, degree)  # 对传入的参数自动计算回归方程
    results['polynomial'] = coeffs.tolist()  # 转换成列表
    p = np.poly1d(coeffs)

    yhat = p(x)
    ybar = np.sum(y) / len(y)
    ssreg = np.sum((yhat - ybar) ** 2)
    print("ssreg:", str(ssreg))
    sstot = np.sum((y - ybar) ** 2)
    print("sstot:", str(sstot))
    results['determination'] = ssreg / sstot
    print("results:", results)

    return results


testX = [1, 3, 8, 7, 9]
testY = [10, 12, 24, 21, 34]
print("r:", computeCorrelation(testX, testY))
print("r^2:", str(computeCorrelation(testX, testY) ** 2))  # 简单线性回归的决定系数
print(polyfit(testX, testY, 1)['determination'])

结果:

r: 0.94031007654487
r^2: 0.8841830400518192
ssreg: 333.16016949152566
sstot: 376.8
results: {'polynomial': [2.65677966101695, 5.322033898305075], 'determination': 0.8841830400518197}
0.8841830400518197
 

猜你喜欢

转载自blog.csdn.net/weixin_41790863/article/details/81203594