2019/08/25

機器學習_分類

如果要判斷矩形是橫向或是縱向,通常可以直接看出結果。

可以將所有矩形左下角跟原點對齊,以右上角的座標位置,來判斷橫或縱向。分類就是要找出一條分類的線,將兩種矩形分類。

這條線,是將權重向量 (weight) 視為法線的直線,因為互相垂直,所以內積為 0。

\(w \cdot x = \sum_{i=1}^{n} w_ix_i = 0\)

如果有兩個維度,且 \(weight = (1,1)\)

\(w \cdot x = w_1x_1 + w_2x_2 = 1 \cdot x_1 + 1 \cdot x_2 = x_1 + x_2 = 0\)

內積也可以用另一個式子

\(w \cdot x = |w| \cdot |x| \cdot cos𝜃​\)

因為內積為 0,表示 \(cos𝜃 =0\),也就是 \(𝜃=90^o \) 或 \(𝜃=270^o\)

一般來說是要用機器學習,找出權重向量,得到跟該向量垂直的直線,再透過該直線進行分類。

感知器

感知器是一個可以接受多個輸入,並對每一個值,乘上權重再加總,輸出得到的結果的模型。

  • 準備機器學習的資料
矩形大小 形狀 \(x_1\) \(x_2\) \(y\)
80 x 150 縱向 80 150 -1
60 x 110 縱向 60 110 -1
160 x 50 橫向 160 50 1
125 x 30 橫向 125 30 1

識別函數 \(f_w(x)​\) 就是給定向量 \(x​\) 後,回傳 1 或 -1 的函數,用來判斷橫向或縱向。

\(f_w(x) = \left\{\begin{matrix} 1 \quad (w \cdot x \geq 0) \\ -1 \quad (w \cdot x < 0) \end{matrix}\right.​\)

回到 \(w \cdot x = |w| \cdot |x| \cdot cos𝜃\) 這個式子,如果內積為負數,那麼表示 \( 90^o < 𝜃 < 270^o\)

內積是用來表示向量之間相似程度,如果是正數,就是相似,0 是直角,負數代表不相似。

  • 權重更新式

\(w := \left\{\begin{matrix} w + y^{(i)}x^{(i)} \quad (f_w(x) \neq y^{(i)}) \\ w \quad \quad \quad \quad (f_w(x) = y^{(i)}) \end{matrix}\right.​\)

i 是學習資料的索引,這個權重更新是針對所有學習資料重複處理,用來更新權重向量。上面的部分,意思是藉由識別函數進行分類失敗時,才要去更新權重向量。

權重向量是用隨機的值初始化的

因為一開始識別函數的結果為 -1,而學習資料 \(y^{(1)} =1\),所以要更新權重向量

\( w + y^{(1)}x^{(1)} = w + x^{(1)}​\)

運用向量加法得到新的 w,而新的 w 的法線,會讓 (125, 30) 跟 w 向量在同一側。

線性可分離

感知器有個缺點,只能用來解決線性可分離的問題,以下這樣的問題,無法用一條線去分類。

所以如果要處理圖片分類,就沒辦法以線性的方式處理。

上面例子是單層的感知器,多層感知器,就是神經網路。

另外有一種方法,可用在線性不可分離的問題上:邏輯迴歸 Logistic Regression

邏輯迴歸 Logistic Regression

這種方法是將分類用機率來思考。以一開始矩形橫向或縱向的例子,這邊假設橫向為 1,縱向為 0。

S 型函數

前面的回歸有提到 \(f_𝜃(x) = 𝜃^T x​\) 這個函數,可用最速下降法或隨機梯度下降法學習 𝜃,然後用 𝜃 求得未知資料 x 的輸出值。

這邊需要的函數為,其中 \(exp(-𝜃^Tx) = e^{-𝜃^T x}\) , e 為自然對數的底數 Euler's number (2.71828)

\(f_𝜃(x) = \frac{1}{1 + exp(-𝜃^Tx)}​\)

會稱為 S 函數是因為如果將 \(𝜃^Tx\) 設為橫軸,\(f_𝜃(x)\) 設定為縱軸,會出現這樣的圖形

S函數的特徵是 當 \(𝜃^Tx = 0​\) 會得到 \(f_𝜃(x) = 0.5​\),且 \(0< f_𝜃(x) <1 ​\)

當作機率處理的原因是 \(0< f_𝜃(x) <1 \)

決策邊界

將未知資料 x 屬於橫向的機率設為 \(f_𝜃(x)\) ,用條件機率的方式描述為

\(P( y = 1 | x) = f_𝜃(x)​\)

當給予資料 x 時,y=1的機率為 \(f_𝜃(x)\) 。如果計算後的結果,機率為 0.7,就表示矩形為橫向的機率為 0.7。以 0.5 為閥值,判斷是不是橫向。

\(y = \left\{\begin{matrix} 1 \quad (f_𝜃(x) \geq 0.5) \\ 0 \quad (f_𝜃(x) < 0.5) \end{matrix}\right.​\)

回頭看 S 函數,當 \(f_𝜃(x) \geq 0.5​\),也就是 \(𝜃^T x >0​\) ,就判定為橫向。可將判斷式改為

\(y = \left\{\begin{matrix} 1 \quad (𝜃^T x \geq 0) \\ 0 \quad (𝜃^T x < 0) \end{matrix}\right.\)


任意選擇一個 𝜃 為例子,\(x_1\) 是橫長, \(x_2\) 是高

\(𝜃= \left[ \begin{matrix} 𝜃_0 \\ 𝜃_1 \\𝜃_2 \end{matrix} \right] = \left[ \begin{matrix} -100 \\ 2 \\ 1 \end{matrix} \right] , x= \left[ \begin{matrix} 1 \\ x_1 \\x_2 \end{matrix} \right] ​\)

\(𝜃^T x = -100 \cdot 1 +2x_1 +x_2 \geq 0 \)

\( x_2 \geq -2x_1 +100 \) 就表示分類為橫向

以圖形表示

以 \(𝜃^Tx =0\) 這條直線為邊界線,就能區分橫向或縱向,這條線就是決策邊界。但實際上,這個任意選擇的 𝜃 並不能正確的進行分類,因此為了求得正確的 𝜃 ,就要定義目標函數,進行微分,以求得正確的參數 𝜃 ,這個方法就稱為邏輯迴歸。

似然函數

現在要找到 𝜃 的更新式

一開始將 x 為橫向的機率 \(P( y = 1 | x) ​\) 定義為 \(f_𝜃(x)​\) ,根據這個定義,學習資料 \(y​\) 跟 \(f_𝜃(x)​\) 的關係,最佳的狀況是 \(y=1, f_𝜃(x)=1​\) , \(y=0, f_𝜃(x)=0​\) ,但還要改寫為

  • \( y=1 ​\) 時,要讓機率 \(P( y = 1 | x) ​\) 是最大,判定為橫向
  • \( y=0 ​\) 時,要讓機率 \(P( y = 0| x) ​\) 是最大,判定為縱向
矩形大小 形狀 \(y\) 機率
80 x 150 縱向 0 要讓機率 $P( y = 0
60 x 110 縱向 0 要讓機率 $P( y = 0
160 x 50 橫向 1 要讓機率 $P( y = 1
125 x 30 橫向 1 要讓機率 $P( y = 1

因為所有學習資料互相獨立沒有關聯,整體的機率就是全部的機率相乘

\(L(𝜃) = P( y^{(1)} = 0|x^{(1)} ) P( y^{(2)} = 0|x^{(2)} ) P( y^{(3)} = 1|x^{(3)} ) P( y^{(4)} = 1|x^{(4)} ) \)

這個式子可改寫為

\(L(𝜃) = \prod _{i=1}^{n} P( y^{(i)} = 1|x^{(i)} )^{y^{(i)}} P( y^{(i)} = 0|x^{(i)} )^{1-y^{(i)}}​\)


如果假設 \(y^{(i)} = 1​\)

\(P( y^{(i)} = 1|x^{(i)} )^1 P( y^{(i)} = 0|x^{(i)} )^0 = P( y^{(i)} = 1|x^{(i)} )​\)

如果假設 \(y^{(i)} =0 \)

\(P( y^{(i)} = 1|x^{(i)} )^0 P( y^{(i)} = 0|x^{(i)} )^1 = P( y^{(i)} = 0|x^{(i)} )​\)


目標函數 \(L(𝜃)\) 就稱為似然函數 Likelihood,就是要找到讓 \(L(𝜃)\) 最大的參數 𝜃

對數似然函數

因為機率都小於 1,機率的乘積會不斷變小,在程式設計會產生精確度的問題。所以加上 log

\(\log L(𝜃) = \log \prod _{i=1}^{n} P( y^{(i)} = 1|x^{(i)} )^{y^{(i)}} P( y^{(i)} = 0|x^{(i)} )^{1-y^{(i)}}​\)

因為 log 是單調遞增函數,因此不會影響到結果。換句話說,要讓 \(L(𝜃)​\) 最大化,跟要讓 \(logL(𝜃)​\) 最大化是一樣的。

\(\begin{equation} \begin{split} \log L(𝜃) &= \log \prod _{i=1}^{n} P( y^{(i)} = 1|x^{(i)} )^{y^{(i)}} P( y^{(i)} = 0|x^{(i)} )^{1-y^{(i)}}\\ &=\sum_{i=1}^{n}( \log P( y^{(i)} = 1|x^{(i)} )^{y^{(i)}} + log P( y^{(i)} = 0|x^{(i)} )^{1-y^{(i)}} ) \\ &=\sum_{i=1}^{n}( {y^{(i)}} \log P( y^{(i)} = 1|x^{(i)} ) + ({1-y^{(i)}}) \log P( y^{(i)} = 0|x^{(i)} ) ) \\ &=\sum_{i=1}^{n}( {y^{(i)}} \log P( y^{(i)} = 1|x^{(i)} ) + ({1-y^{(i)}}) \log (1-P( y^{(i)} = 1|x^{(i)} )) ) \\ &=\sum_{i=1}^{n}( {y^{(i)}} \log f_𝜃( x^{(i)} ) + ({1-y^{(i)}}) \log (1- f_𝜃(x^{(i)} )) ) \\ \end{split} \end{equation}​\)

  • \(\log(ab) = \log a + \log b\)
  • \(\log a^b = b \log a​\)
  • 因為只考慮 \(y=1\) 或 \(y=0\),所以 \(P( y^{(i)} = 0|x^{(i)} ) = 1 - P( y^{(i)} = 1|x^{(i)} )\)

似然函數的微分

邏輯迴歸,就是將這個對數似然函數當作目標函數使用

\( \log L(𝜃) =\sum_{i=1}^{n}( {y^{(i)}} \log f_𝜃( x^{(i)} ) + ({1-y^{(i)}}) \log (1- f_𝜃(x^{(i)} )) ) ​\)

要將這個函數,個別針對參數 \(𝜃_j\) 進行偏微分

同樣利用合成函數的微分方法

\( u = \log L(𝜃)​\)

\(v = f_𝜃 (x) = \frac{1}{1 + exp(-𝜃^Tx)}​\)

然後

\(\frac{𝜕E}{𝜕𝜃_j} = \frac{𝜕u}{𝜕v} \frac{𝜕v}{𝜕𝜃_j}​\)


先計算第一項

因為 \(\log (v)\) 的微分是 \(\frac{1}{v}\)

而 \( \log (1-v)\) 的微分為

\( s =1-v ​\)

\( t = \log (s) \)

\( \frac{dt}{dv} = \frac{dt}{ds} \cdot \frac{ds}{dv} = \frac{1}{s} \cdot -1 = - \frac{1}{1-v} \)

所以

\( \frac{𝜕u}{𝜕v} = \frac{𝜕}{𝜕v} \sum_{i=1}^{n}( {y^{(i)}} \log (v) + ({1-y^{(i)}}) \log (1- v ) ) = \sum_{i=1}^{n} ( \frac{y^{(i)}}{v} - \frac{1- y^{(ii)} }{1-v} )\)


然後將 \(v\) 以 \(𝜃_j\) 微分

\(\frac{𝜕v}{𝜕𝜃_j} = \frac{𝜕}{𝜕𝜃_j} \frac{1}{ 1+ exp(-𝜃^Tx)} ​\)

因為 \(f_𝜃 (x)\) 是 S 型函數,且已知 S 型函數的微分為

\( \frac{d𝜎(x)}{dx} = 𝜎(x) (1-𝜎(x)) \)

利用合成函數的微分方法

\( z = 𝜃^T x\)

\(v = f_𝜃 (x) = \frac{1}{1 + exp(-z)}\)

\(\frac{𝜕v}{𝜕𝜃_j} = \frac{𝜕v}{𝜕z} \frac{𝜕z}{𝜕𝜃_j} ​\)

前面的部分

\( \frac{𝜕v}{𝜕z} = v(1-v) ​\)

後面的部分

\( \frac{𝜕z}{𝜕𝜃_j} = \frac{𝜕}{𝜕𝜃_j} 𝜃^Tx = \frac{𝜕}{𝜕𝜃_j} (𝜃_0x_0 +𝜃_1x_1 +\cdots + 𝜃_nx_n ) = x_j ​\)

所以

\(\frac{𝜕v}{𝜕𝜃_j} = \frac{𝜕v}{𝜕z} \frac{𝜕z}{𝜕𝜃_j} = v(1-v) x_j ​\)


\(\begin{equation} \begin{split} \frac{𝜕u}{𝜕𝜃_j} &= \frac{𝜕u}{𝜕v} \frac{𝜕v}{𝜕𝜃_j} \\ & = \sum_{i=1}^{n}( \frac{y^{(i)}}{v} - \frac {1 - y^{(i)}}{1-v} ) \cdot v(1-v) \cdot x_j^{(i)} \\ & = \sum_{i=1}^{n}( y^{(i)}(1-v) - (1-y^{(i)})v )x_j^{(i)} \\ & = \sum_{i=1}^{n}( y^{(i)} -v )x_j^{(i)} \\ & = \sum_{i=1}^{n}( y^{(i)} - f_𝜃(x^{(i)}) )x_j^{(i)} \\ \end{split} \end{equation}​\)

先前最小化,是要往微分後的結果的正負符號相反方向移動。但現在要最大化,所以要往微分後的結果的正負符號相同方向移動。

\( 𝜃_j := 𝜃_j + 𝜂 \sum_{i=1}^{n}( y^{(i)} - f_𝜃(x^{(i)}) )x_j^{(i)} ​\)

也能配合多元迴歸,改寫成這樣

\(𝜃_j := 𝜃_j - 𝜂 \sum_{i=1}^{n}( f_𝜃(x^{(i)}) - y^{(i)} )x_j^{(i)}\)

線性不可分離

線性不可分離的問題不能直線,但可嘗試用曲線。

例如,將 \(x_1^2\) 加入學習資料

\(𝜃= \left[ \begin{matrix} 𝜃_0 \\ 𝜃_1 \\𝜃_2 \\𝜃_3 \end{matrix} \right] , x= \left[ \begin{matrix} 1 \\ x_1 \\x_2 \\x_1^2\end{matrix} \right] ​\)

然後

\( 𝜃^Tx = 𝜃_0+𝜃_1x_1+𝜃_2x_2+𝜃_3x_1^2 ​\)

假設

\(𝜃= \left[ \begin{matrix} 𝜃_0 \\ 𝜃_1 \\𝜃_2 \\𝜃_3 \end{matrix} \right] = \left[ \begin{matrix} 0 \\ 0 \\1 \\-1 \end{matrix} \right] \)

因為 \(𝜃^Tx \geq 0​\)

\( 𝜃^Tx = 𝜃_0+𝜃_1x_1+𝜃_2x_2+𝜃_3x_1^2 = x_2 - x_1^2 \geq 0 ​\)

得到方程式 \( x_2 \geq x_1^2 ​\)

現在的決策邊界變成曲線,因為參數 𝜃 是任意選擇的,所以資料沒有被正確地分類。

可以增加次方數,得到複雜的形狀的決策邊界。

另外還有 SVM (支援向量機) 的分類演算法,多元分類處理方法。

References

練好機器學習的基本功:用Python進行基礎數學理論的實作

沒有留言:

張貼留言