本文通过使用最小二乘法来求解一元线性回归方程来解释一下为啥线性回归可以直接求解
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w’x+e,e为误差服从均值为0的正态分布。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
给定d个特征的样本 X = ( X 1 ; X 2 ; . . . ; X d ) X = (X1; X2; ... ;Xd) X=(X1;X2;...;Xd),其中 X i X_i Xi表示一个样本的一种特征上的取值,线性模型试图学得一个通过特征的线性组合来进行预测的函数,即:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x) = w_1x_1 + w_2x_2 + ... + w_dx_d + b f(x)=w1x1+w2x2+...+wdxd+b
假设特征和结果都满足线性,即不大于一次方。w
和b
学得之后,模型就得以确定。
回归问题分类
回归学习的损失函数:平方损失函数
如果选取平方损失函数作为损失函数,回归问题可以用著名的最小二乘法(least squares)
来求解。
基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method),主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小。 如下图所示,最小二乘法就是试图寻找一条直线,使得所有样本到直线的欧式距离之和最小。
求解w
和b
,使得 E ( w , b ) = ∑ m i = 1 ( y i − w x i − b ) 2 E(w,b)=\sum_m^{i=1}(y_i - wx_i - b)^2 E(w,b)=∑mi=1(yi−wxi−b)2最小化的过程,称为线性回归模型的“最小而成参数估计”
对 E ( w , b ) E(w,b) E(w,b)中w
和b
分别进行求导,可以得到:
∂ E w , b ∂ w = 2 ( w ∑ i = 1 m x i 2 − ∑ i = 1 m ( y i − b ) x i ) \frac{\partial E_{w,b}}{\partial w} = 2 (w\sum_{i=1}^mx_i^2 - \sum_{i=1}^m(y_i - b)x_i) ∂w∂Ew,b=2(wi=1∑mxi2−i=1∑m(yi−b)xi)
∂ E w , b ∂ b = 2 ( m b − ∑ i = 1 m ( y i − w x i ) ) \frac{\partial E_{w,b}}{\partial b} = 2 (mb - \sum_{i=1}^m(y_i-wx_i)) ∂b∂Ew,b=2(mb−i=1∑m(yi−wxi))
令偏导数为0,可以得到:
w = ∑ i = 1 m y i ( x i − x ˉ ) ∑ i = 1 m x ı ˊ 2 − 1 m ( ∑ i = 1 m x i ) 2 , 其 中 x ˉ = 1 m ∑ i = 1 m x i w = \frac{\sum_{i=1}^my_i(x_i-\bar{x})}{\sum_{i=1}^mx_í ^2 - \frac{1}{m}(\sum_{i=1}^mx_i)^2},\ 其中\ \bar{x}=\frac1m\sum_{i=1}^mx_i w=∑i=1mxıˊ2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ), 其中 xˉ=m1i=1∑mxi
b = 1 m ∑ i = 1 m ( y i − w x i ) b = \frac1m\sum_{i=1}^m(y_i-wx_i) b=m1i=1∑m(yi−wxi)
问题
假设你现在来到了披萨店,想要一份12寸的披萨,但它是是隐藏菜,并没有标明价格。不过可以用机器学习方法建一个线性回归模型,通过分析匹萨的直径与价格的数据的线性关系,来预测12寸直径披萨的价格。
代码
from sklearn import linear_model
# X代表披萨尺寸
X = [[6], [8], [10], [14], [18]]
# y代表披萨价格
y = [[7], [9], [13], [17.5], [18]]
# 请你补全以下代码,创建一个线性回归的模型 model,并预测12寸直径披萨的价格
model = linear_model.LinearRegression()
model.fit(X,y)
# 参数值
print(model.coef_,model.intercept_)
print("预测一张12英寸匹萨价格:{:.2f}".format(model.predict([[12]])[0][0]))
# 可视化
import matplotlib.pyplot as plt
# 原来的数据
plt.scatter(X, y, marker = 'x',color = 'red', s = 40 )
# 预测的曲线
px = [[x*0.01] for x in range(2000)]
py = model.predict(px)
plt.scatter(px, py, marker = '.',color = 'green', s = 1)
# 预测的数据
plt.scatter([[12]], model.predict([[12]]), marker = '.',color = 'blue', s = 400)
————————————————
版权声明:本文为CSDN博主「文三路张同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36160277/article/details/121918182