前言
過去幾個月,一直在學習機器學習模型,輸入只是學習的一部分,輸出可以幫助自己更熟練地掌握概念和知識。把一個復雜的事物簡單的講述出來,才能表示真正弄懂了這個知識。所以我將在博客中盡量簡單地把這些模型講述出來,以加深自己的掌握,也為他人提供一點點參考。在此感謝大神劉建平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元的反面概率大,這樣相乘的結果才能最大概率接近我想要的。這就是極大似然,求出現概率最大時,θ等於多少)
(同時再說一下這里極大似然的幾何意義,最大概率,也就是所有點盡可能離分界線遠遠的)
優化方法
還是用梯度法:
(這里我補充一下推導過程,以J(θ)的第一項來做例子)
偽代碼
輸入特征矩陣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的優化結束
本章完結撒花,后續還有神經網絡,矩陣分解