python手擼線性迴歸及參數解釋

線性迴歸,簡單的理解,在二維空間中,找到一條直線去儘可能的擬合樣本數據,給出新的樣本x,可以預測其y值,y是連續值,分類是離散值,如圖1所示;如果是高維空間,那就是找到一個超平面去擬合,當然也可以是曲線;爲了方便理解,以二維空間的直線爲例,所謂找到最好的直線,就是找參數a和b,也就是theta[0],theta[1]。

         如何去衡量一條直線是否是最好,在迴歸問題中一般用預測值與真實值之間的距離來定義損失函數,如圖2所示,使損失函數值最小的直線就是最好的直線,注意,損失函數是圖中紅色線段的平方和,而不是綠色線段,m代表樣本的總數量,1/2是爲了求導方便,可以與2次項約爲1。


圖 1線性迴歸舉例



圖2 損失函數


         所以,線性迴歸的目標就是找到一組theta值,使損失函數最小,所以線性迴歸就變爲求最小化J的問題。

         最小化J常用的方法是梯度下降,梯度下降是逐步減小損失的過程,方向就是梯度(梯度/導數的方向是變化最快的方向),學習速率a是步長,可以理解爲沿着梯度的方向每次變化多少,梯度下降的原理如圖3所示,當走到最低點後,也就是損失最小的地方,此時梯度爲0,theta將不再變化。


圖3 梯度下降原理圖

         下面就用python來實現一個簡單的線性迴歸模型


圖4 讀入數據並畫出散點圖



圖5 定義損失函數、梯度下降函數並使用學習速率0.01畫出損失變化圖


圖6 畫出自實現的線性迴歸與sklearn中的模型做比較


圖7 損失函數與theta的變化關係

下面我們來看一下學習速率a和迭代次數對模型的影響,代碼下所示



圖8是迭代次數爲20000,學習速率分別是0.0001,0.001,0.003,0.01時,cost隨迭代次數的變化曲線,可以看出a越大,收斂越快,能夠越快的取到最優解,而當a取0.0001和0.001時,所有迭代完成後,都沒有達到最優;不斷調大迭代次數,發現當迭代次數到500000時,a=0.0001仍沒有收斂。Andrew在其機器課程中提到a的選擇一般按照如下策略:從一個較小的a,比如0.001,然後每次增大3倍(0.003,0.01……)在訓練集開始嘗試,畫出迭代次數與cost的變化曲線,取一個略小於最大值(使cost下降最快)的a應用在測試集,這樣能加快訓練速度。如果a的值取的太大會怎樣,圖14畫出a取0.03時的變化曲線,可以看出損失函數不能收斂,當a太大時,會出現震盪不收斂的情況,我們可以這樣來理解,如果a取100000000,在向下的時候,因爲步子太大,就可能跨過最低點,甚至超過對稱點,再往上走。



圖8 迭代20000次


圖9 迭代50000次


圖10迭代100000次


圖11迭代200000次


圖12迭代500000次


圖13迭代1000000次



圖14 a=0.03


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章