梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解
最小二乘法
在線性回歸中,聽的最多的應該算是最小二乘法了。最小二乘法在具體實現過程中保留核心思想的同時,會在算法上進行不同程度的改進,因此,最小二乘法有很多演變體,例如:遞推最小二乘法,加權最小二乘法。這些都會根據實際情況而變化。本文,主要講一下我對最小二乘法的理解。
所謂“最小二乘法”,least squares method,從字面上看,least就是一個最優化問題的體現,因此,最小二乘法是一個最優化問題(optimization problem)。
概念
什么是回歸
我的理解:當自變量和因變量存在某種函數關系可以用來近似描述時,我們把這種行為叫做回歸。而這個函數叫做回歸函數。
回歸的意義
回歸可以幫助我們對因變量進行預測,根據以往的數據和回歸函數,我們能大致預測接下來的因變量的走勢。這個在股市上用的很多,在一些時間序列問題上也應用廣泛。
我們假設我們有一組數,
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()
生成了一組隨機數,然后我們想用一種函數來描述橫軸x和縱軸y的關系,我們先假設是線性關系,hypothesis function就為H(x)=\theta_0+\theta_1*x
如果我們得到了\theta_0, \theta_1,那么我們的回歸函數就得以確定。通過x就可以計算出對應的y。
如何得到H(x)
要讓我們的假設函數對真實數據描述性更強,也就是假設函數更接近真實數據的分布。那么他們兩者之間的誤差就應該達到最小。
于是,我們得到cost function,
J(\theta_0, \theta_1)=\frac{1}{2m}\sum_{i=1}^m(H(x^{(i)})-y^{(i)})^2
對每個離散值和計算值進行誤差平方再求和計算總誤差。
這時候,我們目標就是計算:
minimize J(\theta_0, \theta_1)
以上就是最小二乘法的概念。
梯度下降法
最小二乘法是一種優化問題的想法,梯度下降法是實現這種優化想法具體的一種求解方法。
在最小二乘法問題中求解minimize J(\theta_0, \theta_1)過程中,如果是線性問題,我們可以嘗試用矩陣也就是normal equation。這里只需要確保(x^Tx)^{-1}是存在的。當然這也是矩陣計算的一個局限性。
正常比較萬能的方法,就是梯度下降法(不要說他慢)。
梯度下降法的本質就是迭代。通過迭代更新\theta值,逐漸找到J(\theta_0,\theta_1)的最小值。
從上圖可以發現,縱軸的J值隨著橫軸迭代次數的增加,逐漸變小。
算法思路
我們已知cost function J(\theta_0, \theta_1)=\frac{1}{2m}\sum_{i=1}^m(H(x^{(i)})-y^{(i)})^2
我們的目標函數是minimize J(\theta_0, \theta_1)
因此,讓J(\theta_0, \theta_1)分別對 \theta_0, \theta_1求偏導。
得到,
\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進行更新:
\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逼近,最后到達[1.6,1.6]的位置。
最終線性擬合
在梯度下降法里,我們還會有增量梯度下降法等等,但都是為了更快實現逼近而設計的,這個根據具體需求具體分析。
總結
以上是生活随笔為你收集整理的梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载服务 php,文件下载: 云---p
- 下一篇: php trimmsg,c语言实现php