线性回归

# -*- 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值