# [筆記] 機器學習 基礎與線性回歸
### 定義 :
> A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
![](https://i.imgur.com/pBIYQVb.png)
* 使用訓練資料產出一個函式 `h`,再用 `h` 去判斷 input `x` 產出 output `y`
### Octave for Microsoft Windows
* 主要用於數值分析的軟體,在初學機器學習很好用
* 下載地址 : [Octave 官方網站](http://wiki.octave.org/Octave_for_Microsoft_Windows)
![](https://i.imgur.com/DOyKeIN.png)
* 下載地址
![](https://i.imgur.com/Dsv02Tn.png)
* 下載 installer 後不斷 `next` 就能安裝完成了
P.S.下載任何版本都可以,但不要下載 `Octave 4.0.0`,此版本有重大的 bug
### Supervised learing ( 監督式學習 )
* 定義 : 機器去學習事先標記過的訓練範例 ( 輸入和預期輸出 ) 後,去預測這個函數對任何可能出現的輸入的輸出
* 函數的輸出可以分為兩類 :
* 回歸分析 ( Regression ) : 輸出連續的值,例如 : 房價
* 分類 ( Classification ) : 輸出一個分類的標籤,例如 : 有或沒有
### Unsupervised learing ( 非監督式學習 )
* 定義 : 沒有給定事先標記過的訓練範例,自動對輸入的資料進行分類或分群
* 常用於分群,有兩類應用 :
* 聚類 ( Clustering ) : 將資料集中的樣本劃分為若干個通常是不相交的子集,例如 : 分類成不同類別的新聞
* 非聚類 ( Non-clustering ) : 例如 : 雞尾酒會演算法,從帶有噪音的資料中找到有效資料,可用於語音辨識
### 線性回歸算法 ( Linear Regression )
* `hθ(x) = θ₀ + θ₁x₁` : 線性回歸算式
* `m` : 資料量
* `x⁽ⁱ⁾` : i 代表第 i 筆資料
#### 代價函數 ( Cost Function )
![](https://i.imgur.com/2UNCKfj.png)
* 算出代價函數
```Octave=
function J = costFunctionJ(X, y, theta)
m = length(y);
J = 0
predictions = X * theta;
sqrErrors = (predictions - y).^2;
J = 1 / (2 * m) * sum(sqrErrors);
end
```
* 在 Octave 上的代價函數函式
![](https://i.imgur.com/ryFygNy.png)
* 找出代價函數的最小值,來找出 θ₀、θ₁
#### 使用梯度下降 ( Gradient descent ) 將函數 J 最小化
1. 初始化 θ₀、θ₁ ( θ₀=0, θ₁=0 也可以是其他值)
2. 不斷改變 θ₀、θ₁ 直到找到最小值,或許是局部最小值
![](https://i.imgur.com/lDD0Y7J.png)
* 梯度下降公式,不斷運算直到收斂,θ₀、θ₁ 必須同時更新
* α 後的公式其實就是導數 ( 一點上的切線斜率 )
* α 是 learning rate
![](https://i.imgur.com/PLkKjd4.png)
* 正確的算法
![](https://i.imgur.com/CmwvFgc.png)
* 錯誤的算法,沒有同步更新
```Octave=
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
delta = 1 / m * (X' * X * theta - X' * y);
theta = theta - alpha .* delta;
J_history(iter) = computeCost(X, y, theta);
end
end
```
* 在 Octave 上的梯度下降函式
**Learning Rate α**
* α 是 learning rate,控制以多大幅度更新 θ₀、θ₁
* 決定 α 最好的方式是隨著絕對值的導數更新,絕對值的導數越大,α 越大
* α 可以從 0.001 開始 ( 每次 3 倍 )
* α 太小 : 收斂會很緩慢
* α 太大 : 可能造成代價函數無法下降,甚至無法收斂
#### 結合梯度下降與代價函數
![](https://i.imgur.com/kR0TFuh.png)
* 將代價函數帶入梯度下降公式
* 以**所有樣本**帶入梯度下降公式不斷尋找 θ₀、θ₁,在機器學習裡稱作批量梯度下降 ( batch gradient descent )
#### 多特徵線性回歸 ( Linear Regression with multiple variables)
* `hθ(x) = θ₀x₀ + θ₁x₁ + θ₂x₂ + ... + θₙxₙ` : 多特徵線性回歸算式,x₀ = 1
* `n` : 特徵量
![](https://i.imgur.com/pOI4Lqt.png)
#### 使用梯度下降解多特徵線性回歸
![](https://i.imgur.com/4QvQlBf.png)
* 相較於一元線性回歸,只是多出最後的 xⱼ
![](https://i.imgur.com/ATD0b1b.png)
* 拆開後
#### 特徵縮放 ( Feature Scaling ) 與均值歸一化 ( Mean Normalization )
* 目的 : 加快梯度下降,因為特徵值範圍相差過大會導致梯度下降緩慢
![](https://i.imgur.com/HTHEYLJ.png)
* `sᵢ` : 特徵縮放,通常使用數值範圍
* `μᵢ` : 均值歸一化,通常使用數值的平均
```Octave=
function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
mu = mean(X);
sigma = std(X);
for i = 1:size(X, 2)
X_mu = X(:, i) - mu(i);
X_norm(:, i) = X_mu ./ sigma(i);
end
end
```
* 在 Octave 上的特徵縮放與均值歸一化函式
#### 多項式回歸 ( Polynomial Regression )
* 我們可以結合多種有關的特徵,產生一個新的特徵,例如 : 房子長、寬結合成房子面積
* 假如線性的 ( 直線 ) 函式無法很好的符合數據,我們也可以使用二次、三次或平方根函式 ( 或其他任何的形式 )
#### 正規方程 ( Normal Equation )
X = 各特徵值
y = 各結果
* 算式 : `(XᵀX)⁻¹Xᵀy`
* Octave : `pinv(X'*X)*X'*y`
```Octave=
function [theta] = normalEqn(X, y)
theta = zeros(size(X, 2), 1);
theta = pinv(X' * X) * X' * y
end
```
* 在 Octave 上的正規方程函式
在 Octave 裡我們通常用 `pinv` 而不是 `inv`,因為使用 `pinv` 就算 `XᵀX` 為不可逆,還是會給予 θ 的值
* `XᵀX` 不可逆的原因 :
* 多餘且無關的特徵值
* 特徵值過多 ( m<=n ),刪除一些或正規化
#### 梯度下降 vs 正規方程
* 梯度下降
* 優點 :
* 特徵量大時,可以正常運作
* O(kn²)
* 缺點 :
* 需要選擇 α
* 需要不斷迭代
* 正規方程
* 優點 :
* 不需要選擇 α
* 不用迭代
* 缺點 :
* 需運算 (XᵀX)⁻¹,所以當特徵量大時,會耗費很多運算時間 ( n > 10000 )
* O(n³)
###### tags: `筆記` `機器學習` `線性回歸`