前言
過去幾個月,一直在學習機器學習模型,輸入只是學習的一部分,輸出可以幫助自己更熟練地掌握概念和知識。把一個複雜的事物簡單的講述出來,才能表示真正弄懂了這個知識。所以我將在部落格中儘量簡單地把這些模型講述出來,以加深自己的掌握,也為他人提供一點點參考。在此感謝大神劉建平Pinard的部落格,如有任何疑惑可參考該神部落格,這只是我的狗尾續貂之作。
正文
本篇介紹分類模型中的代數模型,分類模型我個人認為,根據基本數學方法進行分類,有代數模型,樹模型,概率模型,其他。具體分類情況如下:
代數模型的意思是,我們總是運用Xθ+b=y的或者類似的形式來求得分類和迴歸的結果。這裡樣本矩陣(m*n),θ是我們要求的係數(n*1),乘積結果就是m個樣本的迴歸結果。儘管我們後面可能進行啟用函式的變換,但基本的數學方法就是如此。
1.線性迴歸
基本思想
線性迴歸的基本思想在二維平面的展現就是:用一條直線來儘量擬合圖中的點,讓所有點到這條直線的距離最小,我們的目的是求得這樣一條直線y=θx+b,在二維裡θ是一個數,但在多維上,就是一個向量了。
輸入
輸入是樣本矩陣和樣本的y(這個叫標籤值)。比如一個如下的樣本:
輸出
輸出是係數向量θ
θ的解釋:在本例裡θ是一個形如(θ1,θ2,θ3,θ4)的向量,他們分別與身高年齡等特徵相乘最後相加,得到髮量y‘(y'跟實際的y是有差距的,畢竟我們是擬合得來的,我們的目的就是通過損失函式的優化,讓差距最小)。
θ的作用:當得到一個新的樣本,有身高、年齡、性別、體重,我們用θ可以預測到髮量,這就是迴歸。
損失函式
模型的損失我們用均方差來度量,(y'-y)2(這個也好解釋,就是預測的y值與實際y值得差距),我們想得到一個θ讓所有樣本的均方差和最小,於是我們對θ求偏導等於0。
損失函式:所有樣本的均方差和(前面的1/2只是為了求導方便而新增的,不會影響求導結果:比如y=x2和y=2x2求導y'=0結果都一樣)
優化方法
優化方法就是求極值的方法,對於線性模型,我們可以用梯度下降和最小二乘:
梯度下降:(隨便另一個初始θ,a是迭代步長,可以自己設定),迭代數次後θ變化不大,就可以得出結果了。
這裡求梯度是標量對向量的求導,運用的到公式主如下,非常簡單就可以計算出來
最小二乘:(是一種求解析解的方法,可以直接得到結果,但最小二乘有一些侷限性)
虛擬碼
輸入特徵矩陣X和y值
設定一個初始θ
迴圈
直到θ變化很小
輸出θ
2.邏輯迴歸
基本思想
邏輯迴歸的基本思想在二維平面上借鑑線性迴歸,我們想要一條線把二維平面上的兩類點儘量分開。我們再把結果y用一個函式g(啟用函式)投射到一個有限的空間(0-1)裡面去,這樣我們就能通過判斷g(Y)的值來判斷類別。比如g(Y)>0.5是1類,g(Y)<0.5是0類。(為什麼要用這個啟用函式?個人理解它非常適合我們的1、0概率模型)
這個函式g我們用sigmoid啟用函式。它的基本形式是(這裡z就是y的意思),這個函式形式可以讓y值無窮大時接近1,無窮小時接近0,y取0時接近為0.5。它的導數有很好的性質:
用矩陣形式表示(算出來是一個向量)
輸入
輸入還是X和y,這時候y就是0和1的值了,二分類嘛
輸出
我們想得到一個θ,讓分類結果儘量正確。
損失函式
由於是y是0,1構成,不再是連續值,所以不能使用均方差了。於是我們用最大似然法來得到損失函式,最大似然法的基本思想就是求得θ,讓P(概率)儘量大。單個樣本的概率分散式為,y只能取0和1。
對所有樣本來說,概率分佈為:(其實就是把各個樣本的概率乘起來,極其簡單)
我們要最大化這個函式,就等於最小化-L(θ)這個函式
於是損失函式為:(加了個對數,為了方便計算,因為對數可以把乘法轉化為加法)
(E是全為1的向量)
(這裡再說一說極大似然法,舉個簡單的例子,我有兩個硬幣(100元的硬幣,1元的硬幣),分別丟擲,我想得到1,0的觀測結果(1是正面),我用力度θ可以控制正反面的概率,於是我當然要求一個θ讓100元的硬幣正面概率大,讓1元的反面概率大,這樣相乘的結果才能最大概率接近我想要的。這就是極大似然,求出現概率最大時,θ等於多少)
(同時再說一下這裡極大似然的幾何意義,最大概率,也就是所有點儘可能離分界線遠遠的)
優化方法
還是用梯度法:
虛擬碼
輸入特徵矩陣X和y值
設定一個初始θ
迴圈
直到θ變化很小
輸出θ
3.感知機
基本思想
感知機的基本思想和邏輯迴歸類似,在二維平面上,用一條線分開兩類,在三維平面上,用一個平面分開兩類。所以使用感知機的資料必須是線性可分的資料。與邏輯迴歸不同,邏輯迴歸讓所有點儘量遠離分隔線,感知機讓誤分類的樣本距離分隔線儘量近,讓誤分類樣本離超平面的距離儘量小(當沒有誤分類點時,感知機存在多個超平面都可以正確分類)。並且用的啟用函式也不同,感知機用了最簡單的啟用函式:
(θ和x均為向量,這個啟用函式有利於我們區分誤分類點)
輸入
感知機的輸入,依然是X樣本集,y是1和-1的標籤(設立-1的標籤有利於我們設定損失函式)
輸出
得到合適的超平面的引數θ
損失函式
我們用誤分類點到超平面的距離作為損失函式,並求它的最小值,那麼哪些是誤分類點呢:的點就是誤分類點,因為對於誤分類點,y和θ*x一定異號。判斷好了哪些是誤分類點後,把他們跟超平面的距離加起來,總的距離為:(這個公式理解起來很容易,把-y和求和符號除開,就是點到線的距離公式,-y只是為了保證式子為正,求和符號為了求得所有誤分類點距離,對了||θ||2表示2範數,就等於θ向量中每個數的平方和求平方根)
觀察式子,式子的分子分母同時存在θ,很顯然當θ增大N倍,分母分子同樣增大N倍,整體不變。由於我們不關心具體求導等於多少,只關心什麼時候是極值,所以我們可以固定分母或者分子為1,然後求另一個即分子自己或者分母的倒數的最小化作為損失函式,這樣可以簡化我們的損失函式。
於是損失函式為:
優化方法
我們採用隨即梯度下降法(SGD),每次更新只用一個誤分類樣本進行梯度迭代更新:
(批量迭代是這樣)
(隨機迭代的更新公式,yx在誤分類樣本中隨機選擇)
虛擬碼
輸入X和y(1,-1)的樣本集
1.設定初始θ,迭代步長a(感知機不唯一,所以初始值和步長會影響超平面)
2.判斷誤分類樣本集M
3.在誤分類樣本中隨機選擇1個樣本
4.更新
5.檢查訓練集裡是否還有誤分類的點,如果沒有,演算法結束,輸出。如果有,繼續第2步
(感知機還有一個對偶的演算法形式,可以簡化演算法,就是提前計算好Gram矩陣,每次呼叫內積就行了,由於我是講基本原理,這裡就不贅述了,有興趣請自行搜尋)
4.支援向量機
基本思想
支援向量機的基本思想與感知機類似,但是在超平面的規定上進行了一些優化。感知機想要誤分類點到超平面的距離最近,最好為0也就沒有誤分類點了。在沒有誤分類點時,感知機存在多個超平面都可以進行有效分類。而支援向量機則考慮在那麼多個超平面中,哪個最好呢?於是選擇一個超平面,讓支援向量到超平面的間隔最大。所以這裡支援向量機的基礎條件是不存在誤分類點。
什麼叫支援向量:支援向量就是正確分類後,那些距離超平面很近的點。更通俗來說,比如一個欄杆把學生分為了男生女生,最靠近欄杆的學生就是支援向量,而這個最靠近的學生跟欄杆的垂直距離叫間隔。
(間隔的度量,這裡我們用幾何間隔,幾何間隔就是求點到線的正常公式,還有一個函式間隔就是隻取這個公式的分子部分,分子部分就是函式間隔,函式間隔可以用來判斷分類正確與否,用來做約束條件,跟感知機一樣)
(中間實線為最優超平面)
輸入
輸入與感知機一樣,樣本X和分類y(1,-1)
輸出
輸出最佳的超平面引數θ
損失函式
我們要最大化,支援向量到超平面的距離(幾何間隔),我們最大化這個距離的目標函式為:
(min的目的是找支援向量,max的目的是最大化支援向量和超平面的距離,約束條件是在正確分類的點的情況下。勘誤:w範數下面應該有個2,這裡的分母w意思是分子的w中的元素新增上b,參看感知機用一個θ就完全表示了)
很明顯,這個函式極其難優化,因為不同的w,我們要選不同的樣本點的xi,但是我們經過一系列abaaba的操作後,就可以簡化為下面的式子,我們的損失函式為:
(這裡是abaaba操作,可以不看,具體操作如下:我們注意到與感知機一樣,分子上下都有w,可以同時縮放w和b而不影響求最大值,那麼我們同時放大N倍,使得N*y(wx+b)=1,於是我們整個公式就相當於求,單看這個公式,前面的公式不要去想,公式成這樣以後,1代表了函式間隔,我們前面說了正確分類的點,距離要大於函式間隔,因此約束條件相應改變。注意,這裡求距離的時候,我們已經沒有選擇用哪個點的xi了,公式裡沒有xi了,我們把函式間隔就設定為1)
優化方法
對於上面這個式子,它叫做不等式約束條件下的最優化,又叫KKT條件問題,解決這種問題的方法我們有一個套路叫“拉格朗日函式法”,把有約束優化問題轉化無約束優化問題:
對於上述式子,我們通過對偶形式轉換,求w,b偏導數為0來得到w,b關於a的式子,並把總方程轉化為只關於ai的式子:
通過SMO演算法求a向量,最終可解得w,b
這裡說一下求b的方法,找出S個支援向量,判斷條件是a向量(形狀為m*1)裡面ai>0的點對應的i這個樣本,就是支援向量,對於這個支援向量有公式如下:
,於是我們可以計算出每個支援向量的b,然後求均值,其實這裡b值應該都一樣,只是為了以後演算法改進軟間隔的健壯性求個均值。
(這是一個解析法+迭代法的優化,求偏導為0是解析法,smo是迭代法)
虛擬碼
輸入跟感知機一樣,X樣本和y(1,-1)
1.構造一個約束優化問題,即上面只關於a的哪個式子
2.用SMO法求a
3.求出w,
4.求出b:找出支援向量,運用公式求出每個支援向量的b,求均值
輸出一個w和b,也就是θ
演算法改進(關於軟間隔和硬間隔)
上述演算法只能應對線性完全可分的情況,但如果資料大部分是線性可分,但是存在異常點,導致不能線性可分了,如
又或者,異常點沒有達到不可分的底部,但會嚴重擠壓間隔空間,如:
如果沒有藍點,那麼我的超平面間隔就會寬且合理,有了這個異常點讓分隔變得異常窄。
如何處理這兩種情況呢?SVM引入軟間隔的方法來解決,相對來說,我們上面的方法就是硬間隔
硬間隔的最大化條件為
軟間隔引入一個鬆弛變數ξi,使得約束成為,這樣對於異常點,只要我們ξi變大,就能抵消異常點的傷害了,但是如果所有點都加大鬆弛變數,不就亂套了嗎,於是我們對於鬆弛變數的變大也要有懲罰,,這樣我們就可以得到合適的應對誤分類點的方法了。C是懲罰係數,要自己規定,C越小,就越可以容忍誤分類點,具體設定可以通過網格搜尋確定。
關於軟間隔的損失函式優化問題,其實與硬間隔類似,任然求偏導,得到a的表示式,用SMO求a,得解。
演算法改進(非線性問題)
SVM演算法內容實在是多啊
對於非線性問題,我們的基本思想是,投影到高維平面去,增加維度,就可以變成線性的,比如y=x+x2這個非線性問題,我們把x2設為x2,那麼y=x1+x2這個線性問題,問題就得到了解決。
看看我們的目標函式最終形態:
關於維度的問題,只出現在了xi*xj這個向量內積上,於是比如本來xi是1維非線性,我們用一個函式把它投射到2維線性可分,於是公式變成:,但是當維數太高,比如1萬維,太難以計算,於是我們就用上了核函式!
核函式的基本思想是要讓我們能用低緯向量計算,卻產生高維向量線性可分的結果。如何計算?那就涉及到我們用哪個核函式了,現有的核函式有:
多項式核函式:
高斯核函式:
sigmoid核函式:
其中引數都需要自己調整,以適應高維可分性。
於是我們的目標函式變成:
代入到我們的演算法當中,就可求解,至此SVM的優化結束
本章完結撒花,後續還有神經網路,矩陣分解
找出所有的S個支援向量,即滿足αs>0對應的樣本(xs,ys),通過 ys(∑i=1mαiyixTixs+b)=1,計算出每個支援向量(xx,ys)對應的b∗s,計算出這些b∗s=ys−∑i=1mαiyixTixs. 所有的b∗s對應的平均值即為最終的b∗=1S∑i=1Sb∗s