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