Python人工智慧參考 最小二乘法小結

2022-03-01 18:02:28 字數 4223 閱讀 3816

最小二乘法是用來做函式擬合或者求函式極值的方法。在機器學習,尤其是回歸模型中,經常可以看到最小二乘法的身影最小二乘法矩陣法比代數法要簡潔,且矩陣運算可以取代迴圈,所以現在很多書和機器學習庫都是用的矩陣法來做最小二乘法。首先,最小二乘法需要計算x(t)x的逆矩陣,有可能它的逆矩陣不存在,這樣就沒有辦法直接用最小二乘法了,此時梯度下降法仍然可以使用。

第二,當樣本特徵n非常的大的時候,計算x(t)x的逆矩陣是乙個非常耗時的工作(nxn的矩陣求逆),甚至不可行。此時以梯度下降為代表的迭代法仍然可以使用。

第三,如果擬合函式不是線性的,這時無法使用最小二乘法,需要通過一些技巧轉化為線性才能使用,此時梯度下降仍然可以用。**或參考:最小二乘法小結 - 劉建平pinard -

最小二乘法是用來做函式擬合或者求函式極值的方法。在機器學習,尤其是回歸模型中,經常可以看到最小二乘法的身影,這裡就對我對最小二乘法的認知做乙個小結。

最小二乘法是由勒讓德在19世紀發現的,原理的一般形式很簡單,當然發現的過程是非常艱難的。形式如下式:$$目標函式 = \sum\limits(觀測值-理論值)^2$$

觀測值就是我們的多組樣本,理論值就是我們的假設擬合函式。目標函式也就是在機器學習中常說的損失函式,我們的目標是得到使目標函式最小化時候的擬合函式的模型。舉乙個最簡單的線性回歸的簡單例子,比如我們有m個只有乙個特徵的樣本:

\((x^,y^), (x^,y^,...(x^,y^)\)

樣本採用下面的擬合函式:

\(h_\theta(x) = \theta_0 + \theta_1 x\)

這樣我們的樣本有乙個特徵x,對應的擬合函式有兩個引數\(\theta_0 和 \theta_1\)需要求出。

我們的目標函式為:

\(j(\theta_0, \theta_1) = \sum\limits_^(y^ - h_\theta(x^)^2 = \sum\limits_^(y^ -  \theta_0 - \theta_1 x^)^2 \) 

用最小二乘法做什麼呢,使\(j(\theta_0, \theta_1)\)最小,求出使\(j(\theta_0, \theta_1)\)最小時的\(\theta_0 和 \theta_1\),這樣擬合函式就得出了。

那麼,最小二乘法怎麼才能使\(j(\theta_0, \theta_1)\)最小呢?

上面提到要使\(j(\theta_0, \theta_1)\)最小,方法就是對\(\theta_0 和 \theta_1\)分別來求偏導數,令偏導數為0,得到乙個關於\(\theta_0 和 \theta_1\)的二元方程組。求解這個二元方程組,就可以得到\(\theta_0 和 \theta_1\)的值。下面我們具體看看過程。

\(j(\theta_0, \theta_1)對\theta_0\)求導,得到如下方程:

\(\sum\limits_^(y^ -  \theta_0 - \theta_1 x^) = 0 \)                                  ①

\(j(\theta_0, \theta_1)對\theta_1\)求導,得到如下方程:

\(\sum\limits_^(y^ -  \theta_0 - \theta_1 x^)x^ = 0 \)         ②

①和②組成乙個二元一次方程組,容易求出\(\theta_0 和 \theta_1\)的值:

\(\theta_0 = \sum\limits_^\big(x^)^2\sum\limits_^y^ - \sum\limits_^x^\sum\limits_^x^y^ \bigg/ m\sum\limits_^\big(x^)^2 - \big(\sum\limits_^x^)^2\)

\(\theta_1 = m\sum\limits_^x^y^ - \sum\limits_^x^\sum\limits_^y^ \bigg/ m\sum\limits_^\big(x^)^2 - \big(\sum\limits_^x^)^2\)

這個方法很容易推廣到多個樣本特徵的線性擬合。

擬合函式表示為 \(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_x_1 + ... + \theta_x_\), 其中\(\theta_i \) (i = 0,1,2... n)為模型引數,\(x_i \) (i = 0,1,2... n)為每個樣本的n個特徵值。這個表示可以簡化,我們增加乙個特徵\(x_0 = 1 \) ,這樣擬合函式表示為:

\(h_\theta(x_0, x_1, ...x_n) = \sum\limits_^\theta_x_\)。

損失函式表示為:

\(j(\theta_0, \theta_1..., \theta_n) = \sum\limits_^(h_\theta(x_0^), x_1^, ...x_n^)) - y^))^2 = \sum\limits_^(\sum\limits_^\theta_x_^- y^)^2 \)

利用損失函式分別對\(\theta_i\)(i=0,1,...n)求導,並令導數為0可得:

\(\sum\limits_^(\sum\limits_^(\theta_x_^ - y^)x_i^\) = 0   (i=0,1,...n)

這樣我們得到乙個n+1元一次方程組,這個方程組有n+1個方程,求解這個方程,就可以得到所有的n+1個未知的\(\theta\)。

這個方法很容易推廣到多個樣本特徵的非線性擬合。原理和上面的一樣,都是用損失函式對各個引數求導取0,然後求解方程組得到引數值。這裡就不累述了。

矩陣法比代數法要簡潔,且矩陣運算可以取代迴圈,所以現在很多書和機器學習庫都是用的矩陣法來做最小二乘法。

這裡用上面的多元線性回歸例子來描述矩陣法解法。

假設函式\(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_x_1 + ... + \theta_x_\)的矩陣表達方式為:

\(h_\mathbf(\mathbf) = \mathbf\) 

其中, 假設函式\(h_\mathbf(\mathbf)\)為mx1的向量,\(\mathbf\)為nx1的向量,裡面有n個代數法的模型引數。\(\mathbf\)為mxn維的矩陣。m代表樣本的個數,n代表樣本的特徵數。

損失函式定義為\(j(\mathbf\theta) = \frac(\mathbf - \mathbf)^t(\mathbf - \mathbf)\)

其中\(\mathbf\)是樣本的輸出向量,維度為mx1. \(\frac\)在這主要是為了求導後係數為1,方便計算。

根據最小二乘法的原理,我們要對這個損失函式對\(\mathbf\)向量求導取0。結果如下式:

\(\fracj(\mathbf\theta) = \mathbf^t(\mathbf - \mathbf) = 0 \)

這裡面用到了矩陣求導鏈式法則,和兩個個矩陣求導的公式。

公式1:\(\frac}(\mathbf) =2\mathbf\;\;x為向量\)

公式2:\(\nabla_xf(ax+b) = a^t\nabla_yf,\;\; y=ax+b,\;\;f(y)為標量\)

\( \mathbfx\theta} = \mathbfy} \)

兩邊同時左乘\((\mathbfx})^\)可得:

\( \mathbf = (\mathbfx})^\mathbfy} \)

這樣我們就一下子求出了\(\theta\)向量表示式的公式,免去了代數法乙個個去求導的麻煩。只要給了資料,我們就可以用\( \mathbf = (\mathbfx})^\mathbfy} \)算出\(\theta\)。

從上面可以看出,最小二乘法適用簡潔高效,比梯度下降這樣的迭代法似乎方便很多。但是這裡我們就聊聊最小二乘法的侷限性。

首先,最小二乘法需要計算\(\mathbfx}\)的逆矩陣,有可能它的逆矩陣不存在,這樣就沒有辦法直接用最小二乘法了,此時梯度下降法仍然可以使用。當然,我們可以通過對樣本資料進行整理,去掉冗餘特徵。讓\(\mathbfx}\)的行列式不為0,然後繼續使用最小二乘法。

第二,當樣本特徵n非常的大的時候,計算\(\mathbfx}\)的逆矩陣是乙個非常耗時的工作(nxn的矩陣求逆),甚至不可行。此時以梯度下降為代表的迭代法仍然可以使用。那這個n到底多大就不適合最小二乘法呢?如果你沒有很多的分布式大資料計算資源,建議超過10000個特徵就用迭代法吧。或者通過主成分分析降低特徵的維度後再用最小二乘法。

第三,如果擬合函式不是線性的,這時無法使用最小二乘法,需要通過一些技巧轉化為線性才能使用,此時梯度下降仍然可以用。

第四,講一些特殊情況。當樣本量m很少,小於特徵數n的時候,這時擬合方程是欠定的,常用的優化方法都無法去擬合資料。當樣本量m等於特徵數n的時候,用方程組求解就可以了。當m大於n時,擬合方程是超定的,也就是我們常用與最小二乘法的場景了。

Python與人工智慧

python python是乙個非常快捷的計算機程式語言,類庫非常豐富,解決各種問題都有很多現成的工具和例子,使得很多複雜的應用根本無須了解系統細節就能輕鬆實現所需功能。python可以運用到很多方面,可以做日常任務 可以做 比如知乎 youtube就是python寫的 可以做網路遊戲的後台。其它比...

Python 人工智慧學習路線

一 python基礎系列 資料的儲存 運算子與表示式 迴圈 基礎資料結構1 基礎資料結構2 函式1函式2 html5的標籤 html5互動與 css js初步 dom操作 jquery初步 jquery製作動畫 ajax linux作業系統 檔案系統與使用者管理 文字操作命令 網路命令 程序管理與服...

Python之人工智慧(一)

是不是看到標題感覺很高大上?其實就是人工智障啦hhh 本篇文件是典型的標題黨,雖然是人工智慧,但是沒有演算法,只是站在巨人的肩膀上而已。傳送門 接著就能看到自己建立的應用啦 from aip import aipspeech import os11711274 api key il6rnzgpjpl...