# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def coef(data):
"""
计算回归系数
:param data:数据结构,2行n列,每1列是一组数据,第1行代表x,第2行代表y
:return: k,b
"""
xy = np.sum(data[0] * data[1]) # x, y对应元素相乘的和
n = len(data[0])
mx = np.mean(data[0]) # x的均值
my = np.mean(data[1]) # y的均值
sx = np.sum([x ** 2 for x in data[0]]) # x的平方和
k = (xy - n * mx * my) / (sx - n * mx ** 2) # 回归系数k
b = my - k * mx # 回归系数b
return (k, b)
def regression(x, data):
"""
构造回归方程
:param x:
:param data:
:return: k*x+b
"""
k, b = coef(data)[0], coef(data)[1]
return k * x + b
def relative(data):
"""相关程度"""
my = np.mean(data[1]) # y的均值
py = [regression(x, data) for x in data[0]] # y的预测值
r = np.sum([(i - my) ** 2 for i in py]) / np.sum([(i - my) ** 2 for i in data[1]])
return r
def plot(data):
"""绘制原始数据点,回归直线"""
plt.scatter(data[0], data[1]) # 原始数据点
x = np.linspace(0, int(max(data[0])), 100)
plt.plot(x, regression(x, data)) # 回归直线
plt.savefig("test.png", dpi=800)
plt.show()
def report(data):
"""生成报告"""
print("回归系数\nk={}\nb={}".format(np.round(coef(data)[0], 3), np.round(coef(data)[1], 3)))
print("回归方程:y={}x+{}".format(np.round(coef(data)[0], 3), np.round(coef(data)[1], 3)))
print("相关程度:{}".format(np.round(relative(data), 3)))
if __name__ == "__main__":
"""测试代码"""
x = np.arange(1, 38) # 共37个数据
y = [6.73, 6.27, 5.93, 5.77, 5.72, 5.80, 5.87, 5.78, 5.96, 6.03, 6.50, 7.00, 6.80, 6.68, 7.03, 7.67, 7.59, 6.96,
7.17, 6.99, 6.64, 6.71, 7.01, 7.40, 7.49, 7.75, 8.17, 8.09, 8.11, 8.48, 8.99, 9.05, 9.25, 9.57, 9.36, 8.98,
8.44]
data = np.vstack([x, y])
report(data)
px = 36
print("{}的预测值:{}".format(px, np.round(regression(px, data), 3)))
plot(data)
线性回归
最新推荐文章于 2024-10-30 22:37:50 发布