梯度降低算法是一個很基本的算法,在機器學習和優化中有着很是重要的做用,本文首先介紹了梯度降低的基本概念,而後使用python實現了一個基本的梯度降低算法。梯度降低有不少的變種,本文只介紹最基礎的梯度降低,也就是批梯度降低。html
實際應用例子就不詳細說了,網上關於梯度降低的應用例子不少,最多的就是NG課上的預測房價例子:
假設有一個房屋銷售的數據以下:python
面積(m^2) 銷售價錢(萬元)算法
面積(m^2) | 銷售價錢(萬元) |
---|---|
123 | 250 |
150 | 320 |
87 | 180 |
根據上面的房價咱們能夠作這樣一個圖:dom
因而咱們的目標就是去擬合這個圖,使得新的樣本數據進來之後咱們能夠方便進行預測:
機器學習
對於最基本的線性迴歸問題,公式以下:
x是自變量,好比說房子面積。θ是權重參數,也就是咱們須要去梯度降低求解的具體值。函數
在這兒,咱們須要引入損失函數(Loss function 或者叫 cost function),目的是爲了在梯度降低時用來衡量咱們更新後的參數是不是向着正確的方向前進,如圖損失函數(m表示訓練集樣本數量):
下圖直觀顯示了咱們梯度降低的方向,就是但願從最高處一直降低到最低出:
學習
梯度降低更新權重參數的過程當中咱們須要對損失函數求偏導數:
求完偏導數之後就能夠進行參數更新了:
僞代碼如圖所示:
測試
好了,下面到了代碼實現環節,咱們用Python來實現一個梯度降低算法,求解:優化
y=2x1+x2+3y=2x1+x2+33d
,也就是求解:
y=ax1+bx2+cy=ax1+bx2+c
中的a,b,c三個參數 。
下面是代碼:
import numpy as np import matplotlib.pyplot as plt #y=2 * (x1) + (x2) + 3 rate = 0.001 x_train = np.array([ [1, 2], [2, 1], [2, 3], [3, 5], [1, 3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7] ]) y_train = np.array([7, 8, 10, 14, 8, 13, 20, 16, 28, 26]) x_test = np.array([ [1, 4], [2, 2], [2, 5], [5, 3], [1, 5], [4, 1] ]) a = np.random.normal() b = np.random.normal() c = np.random.normal() def h(x): return a*x[0]+b*x[1]+c for i in range(10000): sum_a=0 sum_b=0 sum_c=0 for x, y in zip(x_train, y_train): sum_a = sum_a + rate*(y-h(x))*x[0] sum_b = sum_b + rate*(y-h(x))*x[1] sum_c = sum_c + rate*(y-h(x)) a = a + sum_a b = b + sum_b c = c + sum_c plt.plot([h(xi) for xi in x_test]) print(a) print(b) print(c) result=[h(xi) for xi in x_train] print(result) result=[h(xi) for xi in x_test] print(result) plt.show()
x_train是訓練集x,y_train是訓練集y, x_test是測試集x,運行後獲得以下的圖,圖片顯示了算法對於測試集y的預測在每一輪迭代中是如何變化的:
咱們能夠看到,線段是在逐漸逼近的,訓練數據越多,迭代次數越多就越逼近真實值。