【线性回归(最小二乘法MSE)】——机器学习

发布于:2025-07-18 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

1 最小二乘法MSE

1.1 前景知识:矩阵相关公式

1.2 最小二乘法

1.3 API

1.4 示例代码


1 最小二乘法MSE

x1 x2 x3 x4 x5 x6 x7 x8 x0 y
0 14 8 0 5 -2 9 -3 1 339
-4 10 6 4 -14 -2 -14 8 1 -114
-1 -6 5 -12 3 -3 2 -2 1 30
5 -2 3 10 5 11 4 -8 1 126
-15 -15 -8 -15 7 -4 -12 2 1 -395
11 -10 -2 4 3 -9 -6 7 1 -87
-14 0 4 -3 5 10 13 7 1 422
-3 -7 -2 -8 0 -6 -5 -9 1 -309

1.1 前景知识:矩阵相关公式

y=\begin{pmatrix} 339&\\ -114&\\ 30&\\ 126&\\ -395&\\ -87&\\ 422&\\ -309 \\\end{pmatrix}

X=\begin{pmatrix} 0& 14& 8& 0& 5& -2& 9& -3&1 \\ -4& 10& 6& 4& -14& -2& -14& 8&1\\-1& -6& 5& -12& 3& -3& 2& -2&1\\5& -2& 3& 10& 5& 11& 4& -8&1\\-15& -15& -8& -15& 7& -4& -12& 2&1\\11& -10& -2& 4& 3& -9& -6& 7&1\\-14& 0& 4& -3& 5& 10& 13& 7&1\\-3& -7& -2& -8& 0& -6& -5& -9&1\end{pmatrix}

W=\begin{pmatrix} w_1&\\ w_2&\\ w_3&\\ w_4&\\ w_5&\\ w_6&\\ w_7&\\ w_8&\\w_0\end{pmatrix}

1.2 最小二乘法

h(x)=w_1x_1+w_2x_2+w_3x_3+w_4x_4+w_5x_5+w_6x_6+w_7x_7+w_8x_8+w_0x_0

loss=[(h_1(x)-y_1)^2+(h_2(x)-y_2)^2+...(h_n(x)-y_n)^2]/n\\=\frac{1}{n} \textstyle\sum_{i=1}^{n}(h(x_{i})-y_{i})^{2}\\=\frac{1}{n}||(XW-y)||^2\\=\frac{1}{2}||(XW-y)||^2

这就是最小二乘法公式,||A||^2是欧几里得范数的平方,也就是每个元素的平方相加

虽然这个案例中n=8,但是常常令n=2,因为是一个常数 求最小值时n随便取哪个正数都不会影响W结果,但是求导过程可以约掉前面的系数,会加速后面的计算

h(x_1)表示y^,_1= X第1行分别和W相乘

h(x_2)表示y^,_2= X第2行分别和W相乘

高斯把公式给了,但是何时loss最小呢?

1.二次方程导数为0时最小

loss=\frac{1}{2}||(XW-y)||^2求导:

2.先展开矩阵乘法:

loss=\frac{1}{2}(XW-y)^T(XW-y)\\\\ loss=\frac{1}{2}(W^TX^T-y^T)(XW-y)\\\\ loss=\frac{1}{2}(W^TX^TXW-W^TX^Ty-y^TXW+y^Ty)

3.进行求导(注意X,y都是已知的,W是未知的)

loss'=\frac{1}{2}(W^TX^TXW-W^TX^Ty-y^TXW+y^Ty)'\\\\ loss'=\frac{1}{2}(X^TXW+(W^TX^TX)^T-X^Ty-(y^TX)^T)\\\\ loss'=\frac{1}{2}(X^TXW+X^TXW-X^Ty-X^Ty)\\ \\loss'=\frac{1}{2}(2X^TXW-2X^Ty)\\ \\loss'=X^TXW-X^Ty\\

4.令导数loss'=0

0=X^TXW-X^Ty

X^TXW=X^Ty

5.矩阵没有除法,使用逆矩阵转化

(X^TX)^{-1}(X^TX)W=(X^TX)^{-1}X^Ty

W=(X^TX)^{-1}X^Ty

第二种方式链式求导(推荐,因为后期深度学习全是这种):

内部函数是f(W) = XW - y,外部函数是 g(u) = \frac{1}{2} u^2,其中 u = f(W)

外部函数的导数:\frac{\partial g}{\partial u} = u = XW - y

内部函数的导数:\frac{\partial f}{\partial W} = X^T

应用链式法则,我们得到最终的梯度: \frac{\partial L}{\partial W} = \left( \frac{\partial g}{\partial u} \right) \left( \frac{\partial f}{\partial W} \right) = (XW - y) X^T

有了W,回到最初的问题:

求如果karen的各项指标是:

被爱:11 学习指数:14 抗压指数:8 运动指数:10 饮食水平:5 金钱:10 权利:8 压力:1

那么karen的健康程度是多少?

分别用W各项乘以新的X 就可以得到y健康程度

1.3 API

sklearn.linear_model.LinearRegression()
功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法

参数:
fit_intercept	bool, default=True
	是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。
属性:	 
coef_ 回归后的权重系数
intercept_ 偏置

print("权重系数为:\n", estimator.coef_)  #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)

1.4 示例代码

from sklearn.linear_model import LinearRegression
import numpy as np
data=np.array([[0,14,8,0,5,-2,9,-3,399],
               [-4,10,6,4,-14,-2,-14,8,-144],
               [-1,-6,5,-12,3,-3,2,-2,30],
               [5,-2,3,10,5,11,4,-8,126],
               [-15,-15,-8,-15,7,-4,-12,2,-395],
               [11,-10,-2,4,3,-9,-6,7,-87],
               [-14,0,4,-3,5,10,13,7,422],
               [-3,-7,-2,-8,0,-6,-5,-9,-309]])
x,y = data[:,:-1],data[:,-1]

model = LinearRegression(fit_intercept=False) #不计算偏置项 b=0
model.fit(x, y)

print("偏置系数,w向量:",model.coef_)
print("偏置项:",model.intercept_)

w = model.coef_
b = model.intercept_s
x = [[0,14,8,0,5,-2,9,-3]]
y_pred = model.predict(x)#x@w.T+b#np.sum(w*x)+b
print("预测值:",y_pred)

输出结果:

偏置系数,w向量: [ 3.41704677  9.64733333  9.96900258  0.49065266 10.67072206  4.50852922
 17.60894156 12.27111727]
偏置项: 18.18163864119797
预测值: [399.]


网站公告

今日签到

点亮在社区的每一天
去签到