最小二乘法MSE
最小二乘法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前景知识: 矩阵相关公式
y=(339−11430126−395−87422−309)y=\begin{pmatrix} 339&\\ -114&\\ 30&\\ 126&\\ -395&\\ -87&\\ 422&\\ -309 \\\end{pmatrix}y=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛339−11430126−395−87422−309⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
X=X=X=(014805−29−31−41064−14−2−1481−1−65−123−32−215−23105114−81−15−15−8−157−4−122111−10−243−9−671−1404−35101371−3−7−2−80−6−5−91)\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}⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛0−4−15−1511−14−31410−6−2−15−100−78653−8−24−204−1210−154−3−85−14357350−2−2−311−4−910−69−1424−12−613−5−38−2−8277−911111111⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
W=(w1w2w3w4w5w6w7w8w0)W=\begin{pmatrix} w_1&\\ w_2&\\ w_3&\\ w_4&\\ w_5&\\ w_6&\\ w_7&\\ w_8&\\w_0\end{pmatrix}W=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛w1w2w3w4w5w6w7w8w0⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
2最小二乘法
h(x)=w1x1+w2x2+w3x3+w4x4+w5x5+w6x6+w7x7+w8x8+w0x0h(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_0h(x)=w1x1+w2x2+w3x3+w4x4+w5x5+w6x6+w7x7+w8x8+w0x0
loss=[(h1(x)−y1)2+(h2(x)−y2)2+...(hn(x)−yn)2]/n=1n∑i=1n(h(xi)−yi)2=1n∣∣(XW−y)∣∣2=12∣∣(XW−y)∣∣2这就是传说中的最小二乘法公式∣∣A∣∣2是欧几里得范数的平方 也就是每个元素的平方相加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 是欧几里得范数的平方\,也就是每个元素的平方相加loss=[(h1(x)−y1)2+(h2(x)−y2)2+...(hn(x)−yn)2]/n=n1∑i=1n(h(xi)−yi)2=n1∣∣(XW−y)∣∣2=21∣∣(XW−y)∣∣2这就是传说中的最小二乘法公式∣∣A∣∣2是欧几里得范数的平方也就是每个元素的平方相加
虽然这个案例中n=8,但是常常令n=2,因为是一个常数 求最小值时n随便取哪个正数都不会影响W结果,但是求导过程可以约掉前面的系数,会加速后面的计算
h(x1)表示y1,=X第1行分别和W相乘h(x_1)表示y^,_1= X第1行分别和W相乘h(x1)表示y1,=X第1行分别和W相乘
h(x2)表示y2,=X第2行分别和W相乘h(x_2)表示y^,_2= X第2行分别和W相乘h(x2)表示y2,=X第2行分别和W相乘
…
高斯把公式给了,但是何时loss最小呢?
1.二次方程导数为0时最小
loss=12∣∣(XW−y)∣∣2求导:loss=\frac{1}{2}||(XW-y)||^2 求导:loss=21∣∣(XW−y)∣∣2求导:
2.先展开矩阵乘法
loss=12(XW−y)T(XW−y)loss=\frac{1}{2}(XW-y)^T(XW-y)loss=21(XW−y)T(XW−y)
loss=12(WTXT−yT)(XW−y)loss=\frac{1}{2}(W^TX^T-y^T)(XW-y)loss=21(WTXT−yT)(XW−y)
loss=12(WTXTXW−WTXTy−yTXW+yTy)loss=\frac{1}{2}(W^TX^TXW-W^TX^Ty-y^TXW+y^Ty)loss=21(WTXTXW−WTXTy−yTXW+yTy)
3.进行求导(注意X,y都是已知的,W是未知的)
loss′=12(WTXTXW−WTXTy−yTXW+yTy)′loss'=\frac{1}{2}(W^TX^TXW-W^TX^Ty-y^TXW+y^Ty)'loss′=21(WTXTXW−WTXTy−yTXW+yTy)′
loss′=12(XTXW+(WTXTX)T−XTy−(yTX)T)loss'=\frac{1}{2}(X^TXW+(W^TX^TX)^T-X^Ty-(y^TX)^T)loss′=21(XTXW+(WTXTX)T−XTy−(yTX)T)
loss′=12(XTXW+XTXW−XTy−XTy)loss'=\frac{1}{2}(X^TXW+X^TXW-X^Ty-X^Ty)loss′=21(XTXW+XTXW−XTy−XTy)
loss′=12(2XTXW−2XTy)loss'=\frac{1}{2}(2X^TXW-2X^Ty)loss′=21(2XTXW−2XTy)
loss′=XTXW−XTyloss'=X^TXW-X^Tyloss′=XTXW−XTy
4.令导数loss′=0loss'=0loss′=0
0=XTXW−XTy0=X^TXW-X^Ty0=XTXW−XTy
XTXW=XTyX^TXW=X^TyXTXW=XTy
5.矩阵没有除法,使用逆矩阵转化
(XTX)−1(XTX)W=(XTX)−1XTy(X^TX)^{-1}(X^TX)W=(X^TX)^{-1}X^Ty(XTX)−1(XTX)W=(XTX)−1XTy
W=(XTX)−1XTyW=(X^TX)^{-1}X^TyW=(XTX)−1XTy
有了W,回到最初的问题:
求如果karen的各项指标是:
被爱:11 学习指数:14 抗压指数:8 运动指数:10 饮食水平:5 金钱:10 权利:8 压力:1
那么karen的健康程度是多少?
分别用W各项乘以新的X 就可以得到y健康程度
3 API
sklearn.linear_model.LinearRegression()
功能: 普通最小二乘法线性回归, 权重和偏置是直接算出来的,对于数量大的不适用,因为计算量太大,计算量太大的适合使用递度下降法参数:
fit_intercept bool, default=True是否计算此模型的截距(偏置)。如果设置为False,则在计算中将不使用截距(即,数据应中心化)。
属性:
coef_ 回归后的权重系数
intercept_ 偏置print("权重系数为:\n", estimator.coef_) #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)
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=data[:,0:8]
y=data[:,8:]
estimator=LinearRegression(fit_intercept=False)
estimator.fit(x,y)
print("权重系数为:\n", estimator.coef_) #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)
x_new=[[11,14,8,10,5,10,8,1]]
y_predict=estimator.predict(x)
print("预测结果:\n",y_predict)
print(-3*0.4243965-7*7.32281732-2*15.05217218-8*3.5996297+0*12.05805264-6*1.76972959-5*17.0276393-9*11.31212591)
权重系数为:[[ 0.4243965 7.32281732 15.05217218 3.5996297 12.05805264 1.7697295917.0276393 11.31212591]]
偏置为:0.0
预测结果:[[ 399.][-144.][ 30.][ 126.][-395.][ -87.][ 422.][-309.]]
-308.99999993