一、原理
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。在实际中,我们不能够找到一条直线完全拟合所用的数据,但是我们能够找到一条直线来近似的拟合数据。这条直线的预测值和真实值之间是有误差的,我们通过使预测值和真实值总误差最小,可以得到一条相对来说最好的直线来拟合所有的数据。根据上面的思路,我们可以先求得总误差,如式1-1所示:
使Q对a和b的导数为0可得到使总误差最小时,参数a和b的大小,如式1-2和1-3所示:
二 、不使用矩阵原理及代码
2.1原理
通过联立式1-2和式1-3可得:
通过式1-5和1-6,我们可以由数据求得参数a和b,进而求得能够拟合数据得最佳直线。如下表1-1为伪代码:
2.2代码
导入库:
import matplotlib.pyplot as plt from numpy import *
求平均值
# 求平均值 def ping_jun(x): a = 0 n = len(x) for i in x: a += i return a / n
求参数
# 求参数a def param_w(x, y): x_ = ping_jun(x) n = len(x) a = 0 b = 0 c = 0 for i in range(n): a += y[i] * (x[i] - x_) b += x[i] ** 2 c += x[i] return a / (b - c ** 2 / n)
求参数b,并画图
# 不依靠数组进行编程 # 求参数b,并画图 def linear1(x, y): a = 0 n = len(x) w = param_w(x, y) b = ping_jun(y) - w * ping_jun(x) y_hat = w * x + b plt.scatter(x, y, c='r') plt.plot(x, y_hat, c='b') plt.show() return w, b
三、使用矩阵原理及代码
3.1 原理
要使损失函数最小,如式1-7最小(即1-12所示):
最小化损失函数,可得到如式1-12,有1-12可得到回归直线的参数,权重和偏置。
编程主要注意要构造出Xb矩阵,然后就是矩阵乘法,可得到theta。
3.2 代码
# 依靠数组进行编程 def linear2(x, y): n = len(x) # 构造出矩阵x_b x_b = np.zeros((n, 2)) x_b[:, 0] = 1 for i in range(n): x_b[i, 1] = x[i] param = np.dot(np.dot(np.linalg.inv(np.dot(x_b.T, x_b)), x_b.T), np.mat(y).T) y_hat = x_b * param # 画图 plt.scatter(x, y, c='r') plt.plot(x, y_hat, 'b') plt.show() return param
注意求得的参数a,b都包含在param中
四、可视化结果图
4.1 不基于矩阵可视化结果图
4.2 不基于矩阵可视化结果图