一個線性迴歸例項的公式推導、程式碼實現、問題解析以及模型評價
1. 公式推導:
線性模型:
y = a x + b y = ax+b y=ax+b
損失函式:
l ( a , b ) = 1 2 m ∑ i = 1 m ( a x i + b − y l a b e l ) 2 l(a,b) = \frac{1}{2m}\sum_{i = 1}^{m} (ax_i + b - y_{label})^2 l(a,b)=2m1∑i=1m(axi+b−ylabel)2
梯度函式及其簡單推導:
∂ l ∂ a \frac{\partial l }{\partial a} ∂a∂l
= 1 2 m ∑ i = 1 m [ 2 ( a x i + b − y l a b e l ) x i ] = \frac{1}{2m}\sum_{i = 1}^{m}[2(ax_i+b-y_{label})x_i] =2m1∑i=1m[2(axi+b−ylabel)xi]
= 1 m ∑ i = 1 m [ ( a x i + b − y l a b e l ) x i ] =\frac{1}{m}\sum_{i = 1}^{m}[(ax_i+b-y_{label})x_i] =m1∑i=1m[(axi+b−ylabel)xi]
∂ l ∂ b \frac{\partial l }{\partial b} ∂b∂l
= 1 2 m ∑ i = 1 m 2 ( a x i + b − y l a b e l ) = \frac{1}{2m}\sum_{i = 1}^{m}2(ax_i+b-y_{label}) =2m1∑i=1m2(axi+b−ylabel)
= 1 m ∑ i = 1 m ( a x i + b − y l a b e l ) =\frac{1}{m}\sum_{i = 1}^{m}(ax_i+b-y_{label}) =m1∑i=1m(axi+b−ylabel)
梯度下降迭代公式:
a : = a − α ∂ l ∂ a a := a - \alpha \frac{\partial l }{\partial a} a:=a−α∂a∂l
b : = b − α ∂ l ∂ b b := b - \alpha\frac{\partial l }{\partial b} b:=b−α∂b∂l
2. 程式碼實現:
import numpy as np
import matplotlib.pyplot as plt
class MyModel(object):
'''
對南京仙林大學城二手房價格的預測
'''
def __init__(self):
self._train_data_x = np.array([26,30,48,50,52,60,68,84,\
89,93,99,100,110,126,136])
self._train_data_y = np.array([126,116,195,205,188,220,240,\
325,262,350,275,258,410,455,430])
def func_linear_model(self,x,a,b):
'''
面積 - 價格的線性模型
y = a * x + b
'''
return a * x + b
def func_lost(self,x,a,b,y):
y_pred = self.func_linear_model(x,a,b)
return sum(pow(y_pred - y,2)) / 2 / len(x)
def _gradient_descent(self,x,a,b,y):
grad_b = sum(a * x + b - y) / len(y)
grad_a = sum((a * x + b - y).T * x) / len(y)
return grad_a,grad_b
def train(self,alpha=0.0002,times=100000):
a = 3
b = 40
x = self._train_data_x
y = self._train_data_y
lostList = []
for i in range(times):
delta_a,delta_b = self._gradient_descent(x,a,b,y)
a -= alpha * delta_a
b -= alpha * delta_b
lostList.append(self.func_lost(x,a,b,y))
return a,b,lostList
3. 問題解析:
- 建立房子的面積與總價之間的線性模型:由於忽略了房間數,所以此線性模型是單變數的,只要輸入房子的面積x,我們就能對其總價y進行預測;又因為要求是建立線性模型,所以我們可以簡單的假設此模型為 y = a x + b y = ax+b y=ax+b,需要確定的是引數a和b。我們採用梯度下降的做法求解這兩個引數。
- 梯度下降的本質是通過某種迭代求解a和b,使得使用這兩個引數進行預測的時候,預測結果儘可能的與真實值 Y l a b e l Y_{label} Ylabel相同,所以我們需要一個量考量預測值 a x + b ax+b ax+b與真實值 y l a b e l y_{label} ylabel之間的關係,這個量與引數有關,我們稱其為損失函式: l ( a , b ) = 1 2 m ∑ i = 1 m ( a x i + b − y l a b e l ) 2 l(a,b) = \frac{1}{2m}\sum_{i = 1}^{m} (ax_i + b - y_{label})^2 l(a,b)=2m1∑i=1m(axi+b−ylabel)2,其中,m是現有資料的總量,我們將一組現有資料的每個單個資料 x i x_i xi放入模型預測,將預測值與資料的真實值作差並平方,再對所有的單個資料誤差求和、除以 2 m 2m 2m。其中的 2 2 2只是為了後續處理的方便,並無真實含義。
- 得到損失函式以後,由於損失函式與兩個引數a與b有關,是一個二元函式,所以我們對其求偏導;在累加中,對整體的偏導可以轉化為對部分的偏導結果進行累加,所以這兩個偏導數的求解並不困難。
- 求解出偏導函式(或者所謂梯度函式)以後,我們需要對梯度下降進行理解。我們的目的是使得在已有資料集上使得損失函式的值最小,這樣我們的模型使用的引數a和b能進行最好的預測,這就是梯度下降的作用——使得損失函式的值最小,而我們有了損失函式的兩個偏導函式。
我們不妨先假設損失函式不是二元函式,而是一個簡單的一元函式,或者進一步的,是一個簡單的一元二次函式,我們的偏導數就相當於損失函式的導函式。我們首先任意選擇一個起始點a,此時的導函式(即梯度函式)值就是a處損失函式的導數。我們沿著負方向將a的值減小一個值,這個值是a與導數的乘積的某個倍數,此倍數稱為步長;之後繼續此過程,很容易發現,經過多次迭代,我們會找到這個一元二次損失函式的“谷底”——損失函式的最小值,這就是梯度下降演算法的含義。
4. 模型評價:
- 使用梯度下降演算法建立的模型遠不如使用最小二乘法擬合得到的模型。
- 此模型的建立需要嚴格的步長、初始的引數值。
- 模型的問題可能出在資料——資料的問題可能是量較少,也可能是資料的線性關係不明顯、不適合線性模型的梯度下降擬合。
從損失函式與迭代次數的關係可以明顯看到,模型的工作結果很差。
相關文章
- 線性迴歸模型公式推導完整簡潔版模型公式
- 線性迴歸推導
- 一文徹底理解邏輯迴歸:從公式推導到程式碼實現邏輯迴歸公式
- 【深度學習基礎-11】簡單線性迴歸(下)--例項及python程式碼實現深度學習Python
- ML-梯度下降程式碼-線性迴歸為例梯度
- 一元線性迴歸模型模型
- 線性迴歸-程式碼庫
- PRML 迴歸的線性模型模型
- 基於MXNET框架的線性迴歸從零實現(房價預測為例)框架
- pytorch實現線性迴歸PyTorch
- TensorFlow實現線性迴歸
- 多元線性迴歸模型模型
- 梯度下降法實現最簡單線性迴歸問題python實現梯度Python
- 迴歸模型的演算法效能評價模型演算法
- 線性迴歸基礎程式碼
- python實現線性迴歸之簡單迴歸Python
- 數學推導+Python實現機器學習演算法:線性迴歸Python機器學習演算法
- 【pytorch_5】線性迴歸的實現PyTorch
- 使用線性迴歸模型預測黃金ETF價格模型
- Pytorch 實現簡單線性迴歸PyTorch
- 線性迴歸 go 語言實現Go
- 線性迴歸實戰
- 演算法金 | 線性迴歸:不能忽視的五個問題演算法
- 邏輯迴歸求解二分類問題以及SPSS的實現邏輯迴歸SPSS
- 機器學習——線性迴歸-KNN-決策樹(例項)機器學習KNN
- MyCat分片:水平拆分例項解析和程式碼實現!
- 03_利用pytorch解決線性迴歸問題PyTorch
- 線性迴歸
- 【深度學習 01】線性迴歸+PyTorch實現深度學習PyTorch
- 線性迴歸:最小二乘法實現
- 【機器學習】線性迴歸python實現機器學習Python
- 【機器學習】線性迴歸sklearn實現機器學習
- 核化線性降維中部分公式的推導公式
- 用Python實現線性迴歸,8種方法哪個最高效?Python
- 機器學習--線性迴歸--梯度下降的實現機器學習梯度
- 二項式定理公式推導公式
- 機器學習實戰(一)—— 線性迴歸機器學習
- 【深度學習】TensorFlow實現線性迴歸,程式碼演示。全md文件筆記(程式碼文件已分享)深度學習筆記