梯度下降 最小二乘法 matlab,机器学习个人笔记——(二)线性回归,最小二乘法和梯度下降...

一、线性回归

1.概念

线性回归,能够用一个直线较为精确地描述数据之间的关系。这样当出现新的数据的时候,就能够预测出一个合理的值

如下图,平面中存在200个样本,需找出一条合理的直线对其进行拟合

ae8ac0a40b0b9e11c0196fd22c3c4e36.png

通过线性回归,拟合直线效果如下

921f35b7db53a1727ee40cda329f60f3.png

在上述二维平面中,需要做的就是找出一条最佳拟合直线方程,形式如下:

h(x)=w0x0+w1x1(通常x0为1)∴直线表达式为=>h(x)=w0+w1x1\begin{aligned}

h(x) & = w_{0}x_{0}+w_{1}x_{1}{(通常x_{0}为1)}\\{\therefore 直线表达式为=>}h(x)& = w_{0}+w_{1}x_{1}

\end{aligned}h(x)∴直线表达式为=>h(x)​=w0​x0​+w1​x1​(通常x0​为1)=w0​+w1​x1​​

通过不同的算法求解w0,w1w_{0},w_{1}w0​,w1​得到直线方程,x0x_{0}x0​代表第一个特征值,x1x_{1}x1​代表第二个特征值

实际中,若舍去特征值x0x_{0}x0​, 则得到的直线恒过原点,而为了使直线拟合度更高,加入了常数项w0w_{0}w0​, 相当于y=kx+by=kx+by=kx+b中的bbb,为了方便与w0,w1w_{0},w_{1}w0​,w1​相乘相加,x0x_{0}x0​是人为添加的,且恒为1,直线可以看成y=kx+b∗1=>h=w0+w1x1y=kx+b*1=>h= w_{0}+w_{1}x_{1}y=kx+b∗1=>h=w0​+w1​x1​

由此可得,在一般情况下,样本可能具有n个特征值,x1,x2,...,xnx_{1},x_{2},...,x_{n}x1​,x2​,...,xn​,加入常数项x0=1x_{0}=1x0​=1,则需求解的超平面方程如下:

h(x)=w0x0+w1x1+w2x2+...+wnxn(通常x0为1)\begin{aligned}

h(x)& = w_{0}x_{0}+w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}{(通常x_{0}为1)}

\end{aligned}h(x)​=w0​x0​+w1​x1​+w2​x2​+...+wn​xn​(通常x0​为1)​

需求解w0,w1x,w2,..wnw_{0},w_{1}x,w_{2},..w_{n}w0​,w1​x,w2​,..wn​的值以确定该方程。

为了方便表示该方程,设w参数向量为

wT=[w0w1w2...wn]\mathbf{w^{T}}=\begin{bmatrix}

w_{0}&w_{1}

&w_{2}

&...&w_{n}

\end{bmatrix}wT=[w0​​w1​​w2​​...​wn​​]

样本特征值为:

xT=[x0x1x2...xn](x0=1)\mathbf{x^{T}}=\begin{bmatrix}

x_{0}&x_{1}

&x_{2}

&...&x_{n}

\end{bmatrix}{(x_{0}=1)}xT=[x0​​x1​​x2​​...​xn​​](x0​=1)

h(x)h(x)h(x)可表示为:

h(x)=wTxh(\mathbf{x})=\mathbf{w^{T}x}h(x)=wTx

目标: 求解w\mathbf{w}w向量的最优解

2.损失函数

通过建立一个损失函数来衡量估计值和实际之间的误差的大小,将最小化损失函数作为一个约束条件来求出参数向量的最优解。

样本集为:

X=[x10x20...xm0x11x21...xm1............x1nx2n...xmn]\mathbf{X}

=\begin{bmatrix}

x_{10}&x_{20}&...&x_{m0}\\

x_{11}&x_{21}&...&x_{m1}\\

...&...&...&...\\

x_{1n}&x_{2n}&...&x_{mn}

\end{bmatrix}X=⎣⎢⎢⎡​x10​x11​...x1n​​x20​x21​...x2n​​............​xm0​xm1​...xmn​​⎦⎥⎥⎤​

mmm为样本数量,nnn为特征值数量

单个样本向量可以如下

x1=[x10x11...x1n],x2=[x20x21...x2n],...,xm=[xm0xm1...xmn]\mathbf{x^{1}}=\begin{bmatrix}

x_{10}\\x_{11}\\...\\x_{1n}\\

\end{bmatrix},\mathbf{x^{2}}=\begin{bmatrix}

x_{20}\\x_{21}\\...\\x_{2n}\\

\end{bmatrix},...,\mathbf{x^{m}}=\begin{bmatrix}

x_{m0}\\x_{m1}\\...\\x_{mn}\\

\end{bmatrix}x1=⎣⎢⎢⎡​x10​x11​...x1n​​⎦⎥⎥⎤​,x2=⎣⎢⎢⎡​x20​x21​...x2n​​⎦⎥⎥⎤​,...,xm=⎣⎢⎢⎡​xm0​xm1​...xmn​​⎦⎥⎥⎤​

第i个样本向量如下:

xi=[xi0xi1...xin]\mathbf{x^{i}}=\begin{bmatrix}

x_{i0}\\x_{i1}\\...\\x_{in}\\

\end{bmatrix}xi=⎣⎢⎢⎡​xi0​xi1​...xin​​⎦⎥⎥⎤​

第i个样本的预测值为:

h(xi)=wTxih(\mathbf{x^{i}})=\mathbf{w^{T}x^{i}}h(xi)=wTxi

损失函数如下:

J(w)=12m∑i=1m(wTx−yi)2=12m∑i=1m(h(xi)−yi)2求min⁡J(w)\begin{aligned}

J(\mathbf{w}) &= \frac{1}{2m}\sum_{i = 1}^{m}(\mathbf{w^{T}x}-y^{i})^{2}\\

&=\frac{1}{2m}\sum_{i = 1}^{m}(h(\mathbf{x^{i}})-y^{i})^{2}\\\\{求}&\min J(\mathbf{w})

\end{aligned}J(w)求​=2m1​i=1∑m​(wTx−yi)2=2m1​i=1∑m​(h(xi)−yi)2minJ(w)​

yiy^{i}yi为某一个样本的实际值,h(xi)h(\mathbf{x^{i}})h(xi)为预测值,J(w)J(\mathbf{w})J(w)函数即为误差的平方和,求当J(w)J(\mathbf{w})J(w)取最小时,w\mathbf{w}w(参数向量)的值,12\frac{1}{2}21​为常数项对最小值无影响,方便后续求导

二、最小二乘法

为了方便计算,对样本集特征矩阵X,参数向量w,以及y向量做以下规定:

样本集特征矩阵X

X=[x10x11x12...x1nx20x21x22...x2n...............xm0xm1xm2...xmn]Xi=[xi0xi1xi2...xin]\begin{aligned}

\mathbf{X} & = \begin{bmatrix}

x_{10}&x_{11}&x_{12}&...&x_{1n}\\

x_{20}&x_{21}&x_{22}&...&x_{2n}\\

...&...&...&...&...\\

x_{m0}&x_{m1}&x_{m2}&...&x_{mn}\\

\end{bmatrix}\\\\\mathbf{X^{i}} &= \begin{bmatrix}

x_{i0}&x_{i1}&x_{i2}&...&x_{in}

\end{bmatrix}

\end{aligned}XXi​=⎣⎢⎢⎡​x10​x20​...xm0​​x11​x21​...xm1​​x12​x22​...xm2​​............​x1n​x2n​...xmn​​⎦⎥⎥⎤​=[xi0​​xi1​​xi2​​...​xin​​]​

参数向量w:

W=[w0w1w2...wn]\mathbf{W}=\begin{bmatrix}

w_{0}\\w_{1}

\\w_{2}

\\...\\w_{n}

\end{bmatrix}W=⎣⎢⎢⎢⎢⎡​w0​w1​w2​...wn​​⎦⎥⎥⎥⎥⎤​

XW矩阵相乘:

XW=[h1h2h3...hm]\mathbf{XW}=

\begin{bmatrix}

h_{1} \\

h_{2}\\

h_{3}\\...\\

h_{m}

\end{bmatrix}XW=⎣⎢⎢⎢⎢⎡​h1​h2​h3​...hm​​⎦⎥⎥⎥⎥⎤​

hih_{i}hi​为第i个样本预测值

y向量:

Y=[y1y2y3...ym]\mathbf{Y}=\begin{bmatrix}

y_{1}\\y_{2}

\\y_{3}

\\...\\y_{m}

\end{bmatrix}Y=⎣⎢⎢⎢⎢⎡​y1​y2​y3​...ym​​⎦⎥⎥⎥⎥⎤​

yiy_{i}yi​为样本实际值

损失函数:J(w)=∑i=1m(h(xi)−yi)2\begin{aligned}

J(\mathbf{w}) =\sum_{i = 1}^{m}(h(\mathbf{x^{i}})-y^{i})^{2}

\end{aligned}J(w)=i=1∑m​(h(xi)−yi)2​

可以表示为:J(W)=(Y−XW)T(Y−XW):J(\mathbf{W})=(\mathbf{Y}-\mathbf{XW})^{T}(\mathbf{Y}-\mathbf{XW}):J(W)=(Y−XW)T(Y−XW)

对W\mathbf{W}W求导得:

∂J(W)∂W=−2XTY+2XTXW\frac{\partial J(\mathbf{W})}{\partial \mathbf{W}} =-2\mathbf{X^{T}Y}+2\mathbf{X^{T}XW}∂W∂J(W)​=−2XTY+2XTXW

令:∂J(W)∂W=−2XTY+2XTXW=0\frac{\partial J(\mathbf{W})}{\partial \mathbf{W}} =-2\mathbf{X^{T}Y}+2\mathbf{X^{T}XW}=0∂W∂J(W)​=−2XTY+2XTXW=0

相当于对J(W)中,分别对w0,w1,w2,…,wn求偏导,令偏导等于0,解出w0,w1,w2…,wn

解得:W=(XTX)−1XY\mathbf{W}=(\mathbf{X^{T}X})^{-1}\mathbf{X}\mathbf{Y}W=(XTX)−1XY

即求得最优参数向量W

三、梯度下降法

使用最小二乘法效率可能比较低,需解出n(特征值数量)个方程,可使用梯度下降法,对w参数向量进行迭达

梯度下降:沿着增长最快的相反方向,移动α\alphaα 的步长,即逐步递减值最低值,迭代公式如下

w=w−α∇f\large w=w-\alpha \nabla {f}w=w−α∇f

∇f\nabla {f}∇f表示增长最快的方向,使用减号表示递减(梯度下降),若加表示递增(梯度上升)

使用梯度下降(或上升)时,一般给定w一个初始值,再通过不断迭代得到最优值

此时即需求J(w)J(\mathbf{w})J(w)的梯度, 需分别对对wiw_{i}wi​求偏导

∇f=[∂J(w)∂w0∂J(w)∂w1∂J(w)∂w2...∂J(w)∂wn]\large \nabla {f}=\begin{bmatrix}

\frac{\partial\mathrm J(\mathbf{w})}{\partial w_{0}}\\

\frac{\partial\mathrm J(\mathbf{w})}{\partial w_{1}}\\

\frac{\partial\mathrm J(\mathbf{w})}{\partial w_{2}}\\

...\\

\frac{\partial\mathrm J(\mathbf{w})}{\partial w_{n}}\\

\end{bmatrix}∇f=⎣⎢⎢⎢⎢⎢⎢⎢⎡​∂w0​∂J(w)​∂w1​∂J(w)​∂w2​∂J(w)​...∂wn​∂J(w)​​⎦⎥⎥⎥⎥⎥⎥⎥⎤​

通过对对损失函数J(w)J(\mathbf w)J(w)求偏导后(参考梯度上升),梯度可以表示为:

∇f=−1m[∑i=1m(yi−h(wTxi))xi0∑i=1m(yi−h(wTxi))xi1∑i=1m(yi−h(wTxi))xi2......∑i=1m(yi−h(wTxi))xin]\large \nabla {f}=-\frac{1}{m} \begin{bmatrix}

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i0}\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i1}\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i2}\\

......\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{in}\\

\end{bmatrix}∇f=−m1​⎣⎢⎢⎢⎢⎢⎢⎡​∑i=1m​(yi​−h(wTxi​))xi0​∑i=1m​(yi​−h(wTxi​))xi1​∑i=1m​(yi​−h(wTxi​))xi2​......∑i=1m​(yi​−h(wTxi​))xin​​⎦⎥⎥⎥⎥⎥⎥⎤​

所以代入原方程,

梯度上升算法的迭代过程:α\alphaα 为步长 (α>0)(\alpha >0)(α>0)

w=w−α∇f=[w0w1w2...wn]+α1m[∑i=1m(yi−h(wTxi))xi0∑i=1m(yi−h(wTxi))xi1∑i=1m(yi−h(wTxi))xi2......∑i=1m(yi−h(wTxi))xin]\begin{aligned}

\mathbf{w} &=\mathbf{w} -\alpha \nabla f\\\\&=\begin{bmatrix}

w_{0}\\

w_{1}\\

w_{2}\\...\\w_{n}

\end{bmatrix}+\alpha \frac{1}{m}\begin{bmatrix}

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i0}\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i1}\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{i2}\\

......\\

\sum_{i=1}^{m}(y_{i}-h(\mathbf{w^{T}x_{i}}))x_{in}\\

\end{bmatrix}

\end{aligned}w​=w−α∇f=⎣⎢⎢⎢⎢⎡​w0​w1​w2​...wn​​⎦⎥⎥⎥⎥⎤​+αm1​⎣⎢⎢⎢⎢⎡​∑i=1m​(yi​−h(wTxi​))xi0​∑i=1m​(yi​−h(wTxi​))xi1​∑i=1m​(yi​−h(wTxi​))xi2​......∑i=1m​(yi​−h(wTxi​))xin​​⎦⎥⎥⎥⎥⎤​​

经过上述不断迭代的过程,最终得到一个合适的w\mathbf{w}w参数

四、代码

import numpy as np

#from matplotlib import pyplot as plt

def load_datas(filename):

with open(filename, 'r') as fr:

data_mat=[]

data_labels=[]

for line in fr:

curr_line=line.strip().split('\t')

data_mat.append(list(map(float, curr_line[:-1])))

data_labels.append(float(curr_line[-1]))

return np.mat(data_mat), np.mat(data_labels)

def get_weights0(datas, labels):

"""

最小二乘法

:param datas:

:param labels:

:return:weights

"""

xTx=datas.T*datas

if(np.linalg.det(xTx)!=0.0):

weights=xTx.I*datas.T*labels.T

return weights

return None

def get_weights1(datas, y_labels, alpha=1, r=300):

"""

梯度下降法

:param datas:

:param labels:

:return:weights

"""

shape = datas.shape

weights=np.ones((shape[1], 1))

for i in range(r):

err = y_labels-datas*weights

weights=weights+(alpha/shape[0])*datas.T*err

return weights

print('最小二乘法')

data_mat, data_labels = load_datas('ex1.txt')

weights=get_weights0(data_mat, data_labels)

print(weights)

print('梯度下降法')

weights=get_weights1(data_mat, data_labels.T)

print(weights)

本文地址:https://blog.csdn.net/weixin_42582355/article/details/107548744

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值