线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析, 简单来说线性回归其实是试图找到自变量与因变量之间的关系
比如房子的面积和价格:
房子的面积越大,房子的价格就越高
假设房子的面积和价格符合方程y = mx + b
import numpy as np
data = np.array([[80,200],
[95,230],
[104,245],
[112,247],
[125,259],
[135,262]])
要预测140平方的房子价格,根据上面已有的数据,求解出m和b的最优值,就可以预测出140平方的房子价格。
均方误差是各数据
偏离真实值
的差值的平方和
的平均数
M S E MSE MSE = = = 1 N {1} \over {N} N1 ∑ i = 1 N ( 预 测 值 − 真 实 值 ) 2 \displaystyle \sum^{N}_{i=1}\left(预测值-真实值\right)^2 i=1∑N(预测值−真实值)2
简化公式为:
M S E MSE MSE = ∑ i = 1 N ( 预 测 值 − 真 实 值 ) 2 =\displaystyle \sum^{N}_{i=1}\left(预测值-真实值\right)^2 =i=1∑N(预测值−真实值)2
举例:
在运动学中,物体的位移对于时间的导数就是物体的瞬时速度, 速度的导数就是加速度原函数:
x = np.linspace(-100,100,100)
y = x**2 + 5
plt.figure()
plt.scatter(x,y,c="b")
plt.show()
导函数:
x = np.linspace(-100,100,100)
y = 2*x
plt.figure()
plt.scatter(x,y,c="r")
plt.show()
结合导数的原理总结规律:
所以:
y=mx + b
带入到公式:M S E MSE MSE = ∑ i = 1 N ( m × 面 积 i + b − 真 实 值 i ) 2 =\displaystyle \sum^{N}_{i=1}\left(m\times 面积i + b-真实值i\right)^2 =i=1∑N(m×面积i+b−真实值i)2
b
:
M S E Δ b {MSE} \over {\Delta b} ΔbMSE = 2 × ∑ i = 1 N ( m × x i + b − 真 实 值 i ) =\displaystyle 2 \times\sum^{N}_{i=1}\left(m\times xi + b-真实值i\right) =2×i=1∑N(m×xi+b−真实值i)
m
:
M S E Δ m {MSE} \over {\Delta m} ΔmMSE = 2 × ∑ i = 1 N ( m × x i + b − 真 实 值 i ) × x =\displaystyle 2 \times\sum^{N}_{i=1}\left(m\times xi + b-真实值i\right) \times x =2×i=1∑N(m×xi+b−真实值i)×x
梯度下降步骤:
# 定义m和b的初始值
m = 1
b = 1
# 定义学习率,小一点,如果太大就有可能一步跨到函数梯度下降的反方向
learningrate = 0.00001
def gradient_descent():
"""
梯度下降的函数
"""
global m,b
# 每次进入函数重新定义mse和m、b的偏导数 以便多次训练模型
mse,mslop,bslop = 0,0,0
# 遍历历史数据
for x_i,real_i in data:
# 均方误差公式 算出均方误差
mse += (m * x_i + b - real_i)**2
# 计算出m的偏导数
mslop += 2*(m*x_i+b - real_i)*x_i
# 计算出b的偏导数
bslop += 2*(m*x_i+b -real_i)
# 更新m的值 如果偏导数为负值 m - mslop就等于加值
# 如果偏导数为正值m - mslop就会减值,mse一直会朝着函数最小值前进
# 乘以学习率是为了让步伐小一点,避免一下跨步很大
m = m - mslop*learningrate
b = b - bslop*learningrate
return m,b,mse
# 定义计算后的最优m和b的值
final_m,final_b,final_mse=0,0,0
# 训练3百万次
for i in range(3000000):
final_m,final_b,final_mse = gradient_descent()
if i%100000 == 0:
print("m={},b={},mse={}".format(final_m,final_b,final_mse))
当mse收敛到一定程度不再怎么收敛,就说明找到了参数m和b的最优解
画图查看模型精度,评估:
# 真实房子数据
plt.scatter(data[:,0],data[:,1],c='pink')
# 画出回归完的模型
X = np.linspace(50,200,200)
Y = final_m * X + final_b
plt.plot(X,Y,c='r')
此时使用m和b的值来预测140平方米的房子需要多少钱:
y = final_m * 140 + final_b
print(f'140平米的房子预测需要:{y}万元')