對最小二乘法的理解以及python實現

1 最小二乘法

參考 http://www.cnblogs.com/iamccme/archive/2013/05/15/3080737.html

       https://blog.csdn.net/yhao2014/article/details/51491413

1.1 解釋“最小二乘法”

        我們以最簡單的一元線性模型來解釋最小二乘法。什麼是一元線性模型呢? 監督學習中,如果預測的變量是離散的,我們稱其爲分類(如決策樹,支持向量機等),如果預測的變量是連續的,我們稱其爲迴歸。迴歸分析中,如果只包括一個自變量和一個因變量,且二者的關係可用一條直線近似表示,這種迴歸分析稱爲一元線性迴歸分析。如果迴歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關係,則稱爲多元線性迴歸分析。對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面...

         對於一元線性迴歸模型,假設從總體中獲取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對於平面中的這n個點,可以使用無數條曲線來擬合。要求樣本回歸函數儘可能好地擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。 選擇最佳擬合曲線的標準可以確定爲:使總的擬合誤差(即總殘差)達到最小。有以下三個標準可以選擇,以確定直線位置:

(1) “殘差和最小”

        缺點是“殘差和”之間存在相互抵消的問題,會影響最終的“殘差和”

(2) “殘差絕對值和最小”

        缺點是絕對值在計算上比較麻煩,增加了計算複雜度

(3) “殘差平方和最小”

        這個思想就是“最小二乘法”的原則,既可以避免殘差之間互相抵消的問題,也可以降低計算複雜度。這種方法對異常值十分敏感

        使用最多的是“普通最小二乘法OLS(Ordinary Least Square)”:其迴歸模型應該能夠使得訓練集的“殘差平方和”達到最小。Q爲殘差平方和-代價函數,也叫平方損失函數

1.2 最小二乘法的定義:

        對於給定的數據,在取定的假設空間H中,求解h(x)∈H,使得殘差的最小,即



1.3 最小二乘法的解

        從幾何上講,就是尋找與給定點距離平方和最小的曲線y=h(x)。h(x)稱爲擬合函數或者最小二乘解,求解擬合函數h(x)的方法稱爲曲線擬合的最小二乘法

h(x)一般情況下是一條多項式的曲線:

        這裏h(x,w)是一個n次多項式,w是其參數。也就是說,最小二乘法就是要找到這樣一組,使得最小。

1.4 求解最小二乘法

        以一個比較簡單的線性函數舉例:

        

求解最小二乘法實質就是找出這麼一組w,使得殘差平方和最小

        

 

        這裏令爲樣本的平方損失函數

        這裏的Q(w)即爲我們要進行最優化的風險函數。這是一個典型的求解極值的問題,只需要分別W0,W1對求偏導數,然後令偏導數爲0,即可求解出極值點,即:

        


1.5 python實現

# _*_ coding: utf-8 _*_

import numpy as np  # 引入numpy

import scipy as sp

import pylab as pl

from scipy.optimizeimport leastsq  # 引入最小二乘函數

 

n = 9  # 多項式次數 

# 目標函數y=sin(2πx)

def real_func(x):

    return np.sin(2 * np.pi * x)

# 多項式函數

def fit_func(p, x):

    f = np.poly1d(p)

    return f(x)

 # 殘差函數

def residuals_func(p, y,x):

    ret =fit_func(p, x) - y

    return ret

x = np.linspace(0, 1,9)  # 隨機選擇9個點作爲x

x_points =np.linspace(0, 1, 1000)  # 畫圖時需要的連續點

y0 = real_func(x)  # 目標函數

y1 =[np.random.normal(0, 0.1) + y for y in y0] # 添加正太分佈噪聲後的函數

p_init =np.random.randn(n)  # 隨機初始化多項式參數

plsq =leastsq(residuals_func, p_init, args=(y1, x))

print 'FittingParameters: ', plsq[0]  # 輸出擬合參數

pl.plot(x_points,real_func(x_points), label='real')

pl.plot(x_points,fit_func(plsq[0], x_points), label='fitted curve')

pl.plot(x, y1, 'bo',label='with noise')

pl.legend()

pl.show()


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