機器學習從入門到XX(二):多元線性迴歸和正規方程

多元線性迴歸

多特徵

多個特徵變量也稱爲多元線性迴歸(multivariate linear regression)。先解釋一些符號含義:算法

  • $ x^{(i)} $ 表示訓練集中的第i組用例
  • $ x^{(i)}_j $ 表示第i組用例中的第j個特徵變量
  • m表示訓練用例的總數
  • n表示每組用例的特徵數

多個特徵變量有以下假設函數:編程

$$ h_θ(x) = θ_0 + θ_1x_1+ θ_2x_2+ θ_3x_3 + ... + θ_nx_n $$編程語言

好比,咱們能夠認爲$ θ_0 $是房子的基礎價格,$ θ_1 $是每平米價格,$ x_1 $是面積;$ θ_2 $是每層價格,$ x_2 $是層數;等等。函數

使用矩陣乘法來表示上面這個函數:測試

$$ h_θ(x)=\begin{bmatrix} θ_0 & θ_1 & \cdots & θ_n \\ \end{bmatrix} \begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix} = θ^T x $$spa

上一篇,曾給出過關於兩個特徵$ (θ_0,θ_1) $時候的算法推導式設計

$$ θ_0 := θ_0 - α{1 \over m} {\sum_{i=1}^m(h_θ(x_i)-y_i)} $$3d

$$ θ_1 := θ_1 - α{1 \over m} {\sum_{i=1}^m((h_θ(x_i)-y_i)x_i)} $$code

應用到多個特徵時,不難想到推導式應該以下:orm

$$ \begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; & \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_0^{(i)}\newline \; & \theta_1 := \theta_1 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_1^{(i)} \newline \; & \theta_2 := \theta_2 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_2^{(i)} \newline & \cdots \newline \rbrace \end{align*} $$

即:

$$ \begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0...n}\newline \rbrace\end{align*} $$

多元線性迴歸實踐

經過將訓練樣本中不一樣的特徵的取值範圍限制在大體相同的範圍內,能夠加快梯度降低的收斂速度。這是由於,當輸入的範圍比較小的時候,$ θ $的遞減速度比較快,而輸入的範圍比較大的時候,遞減速度會變慢。理想狀況下,能夠經過對輸入變量進行處理,將其限制在一個範圍內,這個範圍多是−1 ≤ x ≤ 1−0.5 ≤ x ≤ 0.5。並不須要嚴格在這個範圍內,由於咱們的目的僅僅是讓算法執行速度更快一些。

有兩種技術作到這點,分別是特徵縮放(feature scaling)均值歸一化(mean normalization)。特徵縮放是將輸入值除以輸入變量的範圍(例如最大值減最小值),獲得一個新的僅爲1的範圍。均值歸一化是將輸入值減去平均值後,再除以輸入變量的範圍,獲得一個0左右的範圍:

$$ x_i := \dfrac{x_i - \mu_i}{s_i} $$

$ u_i $表示特徵的平均值,$ s_i $能夠是(max-min)表示的範圍,或者是標準差。例如,若是$ x_i $表示房價,範圍是100到2000,平均爲1000,那麼:

$$ x_i := \dfrac{price-1000}{2000-100} $$

咱們須要保證咱們的梯度降低算法工做正常。繪製一張圖,x軸是迭代次數,y軸是$ J(θ) $,隨着迭代次數的增長,$ J(θ) $應該呈降低趨勢,不然,應當減少α。另外,爲了測試收斂,能夠設定一個E值,當先後兩次$ J(θ) $的降低小於這個值時,認爲收斂,好比可讓E取值爲$ 10^{-3} $,在實踐中這個閾值不容易肯定。

clipboard.png

咱們能夠經過多種方式改善咱們的假設函數。咱們能夠將多個特徵合併成一個,好比將$ x_1 $和$ x_2 $合併成$ x_3 $,使$ x_3 = x_1 * x_2 $。

有時,咱們沒法使用一條直線來定義假設函數,由於那樣可能並不合適。這個時候,能夠把假設函數設計成二次函數、三次函數、平方根函數等。例如,能夠把$ h_θ(x) = θ_0 + θ_1 x_1 $設計成二次函數$ h_θ(x) = θ_0 + θ_1 x_1 + θ_2 x_1^2 $或三次函數$ h_θ(x) = θ_0 + θ_1 x_1 + θ_2 x_1^2 + θ_3 x_1^3 $,這樣的擬合效果可能更好。對於上面的三次函數,咱們能夠引入兩個新的特徵$ x_2 $和$ x_3 $,使得$ x_2 = x_1^2 $,$ x_3 = x_1^3 $。還能夠考慮平方根函數$ h_θ(x) = θ_0 + θ_1 x_1 + θ_2 \sqrt{x_1} $。須要記得,這個時候特徵縮放就顯得格外重要了。

正規方程

梯度降低給出了最小化代價函數的算法,本節咱們要討論的另外一種方式,是一種不基於迭代的算法,而是經過一個直接的計算公式,稱爲正規方程(Normal Equation)

$$ θ = (X^T X)^{-1}X^T y $$

下圖是一個例子,以及上述公式中Xy的定義:

clipboard.png

X是指一個m x n+1的矩陣,其中m是指樣本數量,n是特徵個數,之因此是n+1,是由於第一列用全1填充。y是一個m x 1的向量,表示樣本的結果。能夠從數學上證實正規方程獲得的θ能使代價函數最小化。對於使用正規方程計算時,咱們無需考慮上面提到的特徵縮放和歸一化。

對比一下梯度降低和正規方程解法的優劣:

梯度降低 正規方程
須要調整α 無需調整α
須要屢次迭代 無需迭代
複雜度$ O(kn^2) $ 計算$ X^TX^{-1} $時的複雜度爲$ O(n^3) $
適用於n很大的時候 n很大時很慢(>10000)

正規方程還有一個問題是,$ X^TX $未必是可逆的(不可逆的矩陣也稱爲奇異陣)。在使用octave計算正規方程是,一般使用pinv函數而不是inv函數,前者在$ X^TX $不可逆的狀況下也能工做。

致使$ X^TX $不可逆的因素可能包括:

  • 特性冗餘,即兩個特性之間聯繫比較緊密,好比存在線性依賴關係
  • 特性比樣本多,即(m ≤ n)

解決辦法一般就是刪除一些冗餘的特性,或者簡化特性。

線性迴歸代碼總結

在整個線性迴歸問題中,主要有以下幾個算法須要實現:

  • 代價函數
  • 梯度降低算法
  • 特徵縮放
  • 正規方程

使用octavematlab利於快速驗證算法和模型。在使用這兩種編程語言和平臺時,要始終以向量和矩陣的思惟方式去思考,這樣才能更好的利用兩種語言的優點,將不少看似複雜的公式用幾行代碼實現。

前面定義過代價函數:

$$ J(θ) = {1 \over 2m} {\sum_{i=1}^m(h_θ(x_i)-y_i)^2} $$

這裏的$ θ $就是向量的概念,而不是單個變量,能夠用以下代碼實現它,X是輸入矩陣:

y = data(:, 2);
m = length(y);
X = [ones(m, 1), data(:,1)];
J = sum((X * theta  - y).^2) / (2*m);

前面概括太低度降低函數的算法:

$$ \begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0...n}\newline \rbrace\end{align*} $$

用代碼實現:

for iter = 1:num_iters
    theta = theta - (sum((X * theta - y) .* X) * alpha / m)';
end

對於特性縮放,能夠這麼實現:

$$ x_i := \dfrac{x_i - \mu_i}{s_i} $$

mu = mean(X);
sigma = std(X);
X_norm = (X - mu) ./ sigma;

正規方程就比較簡單了:

$$ θ = (X^T X)^{-1}X^T y $$

theta = pinv(X' * X) * X' * y;
相關文章
相關標籤/搜索