標籤:機器學習 線性模型 口袋演算法 線性迴歸 非線性模型轉換
這一課時主要是講述了線性模型的一些處理。
包括:
1、輸入資料的表示(Input Representation)
2、線性分類(Linear Classification)
3、線性迴歸(Linear Regression)
4、非線性模型轉換(Nonlinear Transformation)
作者認為,如果要測試某個模型的可用性,做好就是用真實資料。
為了講解線性模型如何應用,作者利用線性模型來解決郵局資料辨別問題:
由於不同的人有不同的書寫習慣,對於同一個數字其書寫形式可能各異,但是其基本骨架不會變化太大。如下面一幅圖是來自郵局中的,來自真實世界的資料:
在的那些資料中有些數字是很容易辨認的,但是有些資料卻難以辨認,比如倒數第二行最後一個數字究竟是‘8’還是‘0’ ?
為了識別這些數字,我們需要機器學習。在這裡作者利用了感知器模型(線性模型)來解決這個問題。
需要做的第一點就是如何輸入資料(Input Representation)?
假設每個數字像素都是 16*16的,
那麼我們可以對每一張圖片輸入16*16 = 256 個點,對應的我們有 256+1 個參數:x0 -- x256。我們期望通過機器學習來確定所有的這些參數的值,可是參數這麼多,機器學習可能需要很多的時間來完成,而且效果不一定好。觀察到有一些像素點是不需要的,因此我們應該從這些像素點中抽取出一些特徵出來,用來表示每一張圖片,這樣就可以把維度降下來,從而降低學習強度。觀察到不同的數字其強度(黑色的點數)和對稱性是不一樣的,因此我們嘗試用強度和對稱性來描述每一張圖片,即抽取出特徵,從而把維度從 257 降到 3 維(不要忘記w0)。當然我們在提取出有用的資訊的同時可能也丟掉了同樣多的有用資訊。進過特徵抽取後,每一張圖片的表示如下:
現在我們可以利用這些特徵來進行機器學習了。(Linear Classification)(為了簡化問題,只處理了數字‘1’和‘5’)。根據線性模型的公式:h(X) = WX(W T 均是向量)。下面是學習的。
每幅圖的左邊是利用了線性模型進行學習的過程及結果,左圖中紅色線表示實際的結果,綠色線表示學習的結果。由於資料不是線性可分的,所以演算法不會自動停止。因此在這裡定義迭代1000次後強制停止。並把最後一次迭代結果作為最終輸出。但是學習的效果並不是很理想,分割線太過偏上了。這是因為最後一次迭代的結果不一定是最後的,有可能剛好迭代到一次壞的資料那裡就停止了。所以就有了後面的口袋演算法(Pocket Algorithm)如下每幅圖中右邊的圖就表明是利用口袋演算法得到的結果,可以看到,最後結果表現的很好,但是依然有一些點無法正確分類,但是沒所謂,不要求百分百正確,主要錯誤在允許的範圍內就可以。
說了這麼多,那麼究竟什麼是口袋演算法呢?
口袋演算法就是增加一個跟蹤器,該跟蹤器最終最好的結果,並把它記錄下來,當進行下一次迭代結束的時候,就把跟蹤器當前的結果跟迭代的結果進行對比,始終追蹤記錄最後的結果。這樣在最後的時候,跟蹤器就保留了所有迭代中的做好的那次迭代。可是為什麼叫做口袋演算法而不是什麼其它的?作者解析說:想象一下,每次都把最好的結果放到口袋裡,當發現更好的結果的時候,就把更好的放到你的口袋中並丟棄口袋中原有的結果。最後當演算法結束時,你只需要把你口袋裡面的結果拿出來就是了。所以叫做口袋演算法。(呵呵,好生動)
接下來作者講到線性迴歸(Linear Regression )問題
Regression = Real-Valued Output
當每次提到一些變數是否跟別的變數是否有關時,想到的就是迴歸。
利用線性迴歸我們求出一條線(或面,這個要根據參數數量即維數來決定),使得誤差最小
二維:線 三維:面
線性迴歸方程如下:
但是應該如何衡量誤差?畢竟迴歸就是為了找出一個函數,使得該函數與真實函數之間的誤差最小化。作者在這裡用了標準的迴歸誤差計算函數:平方差。
為了求出該誤差函數的最小值及相應的 W,我們需要進行求導:標準矩陣微積分:
只要當 XW = y 時即可求出,求解過程如下:等式左邊同時乘上 X 的逆,然後同時乘上 XtX 的反,那個 X頭上有個加號的叫做偽倒數。
現在,我們已經求出 W 了。但是如何利用線性迴歸來進行分類?因為二元結果也屬於實數,所以可以利用線性迴歸進行分類,當結果為真的時候我們把它作為 +1 類,為負時則認為是 -1 類。
問題是線性迴歸真的可以用來進行分類?先看一張:
其中藍色部分屬於 +1 類,紅色屬於 -1 類。越往上的地區,正直越大,越往下的地區正直越小。但是迴歸方程試圖使所有的負數變為 -1, 所有的正數變為 +1,可是它不能,對於那些 -2,-3 的值來說它只能把它當做錯誤處理。所以線性迴歸只能最小化誤差,但是不是真正的分類!什嗎?不是真正的分類?are you kidding me ?
不急,雖然不是真正的分類,但是我們已經成功了一半了,如果我們把 W 初始化為線性迴歸算出來的 W 然後繼續利用口袋演算法等進行迭代那樣就能加速整個過程了,畢竟如果一開始就是靠口袋演算法,可能要迭代很久才能達到我們需要的值,因此我們為什麼不來一次跳躍呢?這就是線性迴歸於分類的結合了。
(雖然是這麼說,只是我不是很懂那個為什麼不能把負數變成 -1,為什麼會把 -2 等當做錯誤來處理???...)
最後,作者講到如何把非線性問題轉換為線性問題。
在本節中作者並沒有提出一個理論性的方法關於如何指導轉換,這些將會在下一課時提到。在這一課時中,作者提出了一個例子並且利用了轉換方法,成功地把非線性可分問題轉換成線性可分問題,如下:
左邊的是原始的資料集,很明顯是非線性可分的,但是如果我們對輸入進行處理,把 x1,x2 的值同時平方,則相當於把左邊的空間映射到右邊的空間中,這樣就成功的把非線性可分問題轉換成線性可分問題了,需要注意的一點是,當輸入新的x的時候我們要利用同樣的方法先進行轉換。
結論:
線性可分模型是機器學習中一個很重要的模型之一,要很多模型都是建立線上性可分模型上面的。
當我們的輸入是多維的時候,為了降低學習的難度及時間,我們需要對輸入的表示進行處理,抽取出特徵,降低維度,從而降低機器學習的成本。
為了加快機器學習的過程及品質,可以利用線性迴歸方法先求出一個 W 作為線性模型的初始值,然後再此初始值上進行迭代。
由於現實中很多問題的資料都不是嚴格線性可分的。如果存在一條可以接受的邊界(只有小數點分類錯誤),對於這類問題,我們沒有辦法使演算法收斂,但是我們依然可以應用線性模型來解決,只是我們需要限定迭代的次數,同時利用口袋演算法找出在迭代過程中最好的結果作為最終的結果。
另外對於那些明顯線性不可分的問題,我們可以通過對輸入資料進行處理從而轉換成線性可分的問題,然後利用線性模型進行求解。
加州理工學院公開課:機器學習與資料採礦_線性模型