梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解
最小二乘法
在線性回歸中,聽的最多的應(yīng)該算是最小二乘法了。最小二乘法在具體實現(xiàn)過程中保留核心思想的同時,會在算法上進(jìn)行不同程度的改進(jìn),因此,最小二乘法有很多演變體,例如:遞推最小二乘法,加權(quán)最小二乘法。這些都會根據(jù)實際情況而變化。本文,主要講一下我對最小二乘法的理解。
所謂“最小二乘法”,least squares method,從字面上看,least就是一個最優(yōu)化問題的體現(xiàn),因此,最小二乘法是一個最優(yōu)化問題(optimization problem)。
概念
什么是回歸
我的理解:當(dāng)自變量和因變量存在某種函數(shù)關(guān)系可以用來近似描述時,我們把這種行為叫做回歸。而這個函數(shù)叫做回歸函數(shù)。
回歸的意義
回歸可以幫助我們對因變量進(jìn)行預(yù)測,根據(jù)以往的數(shù)據(jù)和回歸函數(shù),我們能大致預(yù)測接下來的因變量的走勢。這個在股市上用的很多,在一些時間序列問題上也應(yīng)用廣泛。
我們假設(shè)我們有一組數(shù),
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
x=np.linspace(0,10,10)
random.seed()
y=np.linspace(5,15,10)+[random.uniform(-5,5) for _ in range(10)]
print(y)
plt.scatter(x,y)
plt.show()
生成了一組隨機數(shù),然后我們想用一種函數(shù)來描述橫軸x和縱軸y的關(guān)系,我們先假設(shè)是線性關(guān)系,hypothesis function就為H(x)=\theta_0+\theta_1*x
如果我們得到了\theta_0, \theta_1,那么我們的回歸函數(shù)就得以確定。通過x就可以計算出對應(yīng)的y。
如何得到H(x)
要讓我們的假設(shè)函數(shù)對真實數(shù)據(jù)描述性更強,也就是假設(shè)函數(shù)更接近真實數(shù)據(jù)的分布。那么他們兩者之間的誤差就應(yīng)該達(dá)到最小。
于是,我們得到cost function,
J(\theta_0, \theta_1)=\frac{1}{2m}\sum_{i=1}^m(H(x^{(i)})-y^{(i)})^2
對每個離散值和計算值進(jìn)行誤差平方再求和計算總誤差。
這時候,我們目標(biāo)就是計算:
minimize J(\theta_0, \theta_1)
以上就是最小二乘法的概念。
梯度下降法
最小二乘法是一種優(yōu)化問題的想法,梯度下降法是實現(xiàn)這種優(yōu)化想法具體的一種求解方法。
在最小二乘法問題中求解minimize J(\theta_0, \theta_1)過程中,如果是線性問題,我們可以嘗試用矩陣也就是normal equation。這里只需要確保(x^Tx)^{-1}是存在的。當(dāng)然這也是矩陣計算的一個局限性。
正常比較萬能的方法,就是梯度下降法(不要說他慢)。
梯度下降法的本質(zhì)就是迭代。通過迭代更新\theta值,逐漸找到J(\theta_0,\theta_1)的最小值。
從上圖可以發(fā)現(xiàn),縱軸的J值隨著橫軸迭代次數(shù)的增加,逐漸變小。
算法思路
我們已知cost function J(\theta_0, \theta_1)=\frac{1}{2m}\sum_{i=1}^m(H(x^{(i)})-y^{(i)})^2
我們的目標(biāo)函數(shù)是minimize J(\theta_0, \theta_1)
因此,讓J(\theta_0, \theta_1)分別對 \theta_0, \theta_1求偏導(dǎo)。
得到,
\frac{\partial J(\theta_0, \theta_1)}{\partial \theta_0} = \frac{1}{m}\sum_{i=1}^m(x^{(i)})-y^{(i)})
\frac{\partial J(\theta_0, \theta_1)}{\partial \theta_1} = \frac{1}{m}\sum_{i=1}^m(x^{(i)})-y^{(i)})x_i
對\theta進(jìn)行更新:
\theta_0: \theta_0-\alpha \frac{\partial J(\theta_0)}{\partial \theta_0}
\theta_1: \theta_1-\alpha \frac{\partial J(\theta_1)}{\partial \theta_1}
thetaSet=np.array(thetaSet)
J=np.zeros((50,50))
theta0Max,theta0Min=max(thetaSet[:,0]),min(thetaSet[:,0])
theta1Max,theta1Min=max(thetaSet[:,1]),min(thetaSet[:,1])
theta0=np.linspace(0,1.8,50)
theta1=np.linspace(0,1.8,50)
T0,T1=np.meshgrid(theta0,theta1)
for i in range(50):
for j in range(50):
J[i,j]=sum((theta0[i]+theta1[j]*x-y)**2)/len(x)
plt.contour(T0,T1,J)
plt.scatter(thetaSet[:,0],thetaSet[:,1])
plt.ylabel('theta 1')
plt.xlabel('theta 0')
plt.scatter(thetaSet[-1,0],thetaSet[-1,1],c="r",s=300,alpha=0.5)
plt.show()
在這里五彩線是梯度線,我們可以看出,我們初始\theta為[0,0],然后\theta逐漸向最小cost逼近,最后到達(dá)[1.6,1.6]的位置。
最終線性擬合
在梯度下降法里,我們還會有增量梯度下降法等等,但都是為了更快實現(xiàn)逼近而設(shè)計的,這個根據(jù)具體需求具體分析。
總結(jié)
以上是生活随笔為你收集整理的梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载服务 php,文件下载: 云---p
- 下一篇: matlab怎么在c 中调用,在C中调用