一個線性迴歸例項的公式推導、程式碼實現、問題解析以及模型評價

NumLock桌發表於2020-11-21


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)=2m1i=1m(axi+bylabel)2

梯度函式及其簡單推導

∂ l ∂ a \frac{\partial l }{\partial a} al

= 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] =2m1i=1m[2(axi+bylabel)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] =m1i=1m[(axi+bylabel)xi]

∂ l ∂ b \frac{\partial l }{\partial b} bl

= 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}) =2m1i=1m2(axi+bylabel)

= 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}) =m1i=1m(axi+bylabel)

梯度下降迭代公式:

a : = a − α ∂ l ∂ a a := a - \alpha \frac{\partial l }{\partial a} a:=aαal

b : = b − α ∂ l ∂ b b := b - \alpha\frac{\partial l }{\partial b} b:=bαbl


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. 問題解析:

在這裡插入圖片描述

  1. 建立房子的面積與總價之間的線性模型:由於忽略了房間數,所以此線性模型是單變數的,只要輸入房子的面積x,我們就能對其總價y進行預測;又因為要求是建立線性模型,所以我們可以簡單的假設此模型為 y = a x + b y = ax+b y=ax+b,需要確定的是引數a和b。我們採用梯度下降的做法求解這兩個引數。
  2. 梯度下降的本質是通過某種迭代求解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)=2m1i=1m(axi+bylabel)2,其中,m是現有資料的總量,我們將一組現有資料的每個單個資料 x i x_i xi放入模型預測,將預測值與資料的真實值作差並平方,再對所有的單個資料誤差求和、除以 2 m 2m 2m。其中的 2 2 2只是為了後續處理的方便,並無真實含義。
  3. 得到損失函式以後,由於損失函式與兩個引數a與b有關,是一個二元函式,所以我們對其求偏導;在累加中,對整體的偏導可以轉化為對部分的偏導結果進行累加,所以這兩個偏導數的求解並不困難。
  4. 求解出偏導函式(或者所謂梯度函式)以後,我們需要對梯度下降進行理解。我們的目的是使得在已有資料集上使得損失函式的值最小,這樣我們的模型使用的引數a和b能進行最好的預測,這就是梯度下降的作用——使得損失函式的值最小,而我們有了損失函式的兩個偏導函式。
    我們不妨先假設損失函式不是二元函式,而是一個簡單的一元函式,或者進一步的,是一個簡單的一元二次函式,我們的偏導數就相當於損失函式的導函式。我們首先任意選擇一個起始點a,此時的導函式(即梯度函式)值就是a處損失函式的導數。我們沿著負方向將a的值減小一個值,這個值是a與導數的乘積的某個倍數,此倍數稱為步長;之後繼續此過程,很容易發現,經過多次迭代,我們會找到這個一元二次損失函式的“谷底”——損失函式的最小值,這就是梯度下降演算法的含義。

4. 模型評價:

  • 使用梯度下降演算法建立的模型遠不如使用最小二乘法擬合得到的模型。
  • 此模型的建立需要嚴格的步長、初始的引數值。
  • 模型的問題可能出在資料——資料的問題可能是量較少,也可能是資料的線性關係不明顯、不適合線性模型的梯度下降擬合。

在這裡插入圖片描述
從損失函式與迭代次數的關係可以明顯看到,模型的工作結果很差。

相關文章