機器學習基礎 第三章 分類算法

1 線性分類器-感知器

1.1 感知器

有如圖1.1所示的兩類數據希望找到,如果想把他們分開,最簡單的方法就是用圖中的綠線將它們分開。顯然綠線的方程爲

t=ω0+ω1x+ω1y1.11

假設紅色點爲 {xr,yr} ,綠色點的集合爲{xg,yg} ,則紅色和綠色點分別滿足

t0,t<01.12

所以只要能求出式(1-1)並按照式(1-2)的規則就能將兩類數據分開,將以上的想法表示成如下形式,可以稱之爲感知器

f(t)=sign(ω0+ω1x+ω1y )1.13

sign 爲符號函數

sign(x)={+1, x01,x<0 1.14


這裏寫圖片描述
圖1. 1

假設樣本集合爲 {xi,yi;ti}1iNN 爲樣本總數。

1.2 感知器的學習策略

和迴歸模型一樣,感知器也要進行學習,才能獲取感知器的參數ω ,所以也需要構造損失函數

圖1.1中的直線稱爲分類線,如果數據是高維的,則線就會變成超平面了。在這裏爲了找到這條分類線,這條線需要滿足這樣的準則(損失函數):即線兩邊的點被誤分的總數要最少,圖1.1中所示的情況下,誤分的總數爲0。這樣的損失函數不是參數ω 的連續可導函數,不容易優化,所以下面引入另一種損失函數。

對於誤分類來說,有

t(ω0+ω1x+ω1y)>01.22

這是因爲, ω0+ω1x+ω1y>0 時,t=1 ,反之亦然。因此將樣本點中所有符合式(1.2-2)的樣本點累加作爲損失函數,並使其最小,就可以確定 ω ,損失函數如下

E(ω)=i=1Mti(ω0+ω1xi+ω1yi)1.23

其中的 MN 個樣本中被誤分樣本的個數。當式(1.2-3)爲0時,全部樣本分類正確。

1.3 優化損失函數

根據第二部分介紹的梯度下降法,需要求解損失函數的偏導數,式(1.2-3)可以直接求出偏導數而不用數值導數的求法

E(ω)ω0=i=1Mti

E(ω)ω1=i=1Mtixi

E(ω)ω2=i=1Mtiyi

(1.3-1)

ω0=ω0λE(ω)ω0

ω1=ω1λE(ω)ω1

ω2=ω2λE(ω)ω2

(1.3-2)

這裏給出另一種類似梯度下降法的優化方法:隨機梯度下降法(《Pattern Recognition And Machine Learning》M.
Bishop一書中感知機一節中的解釋),隨機梯度下降法不對整個樣本集合求導數,而對單個樣本就導數,所以式(1.3-2)變成

ω0=ω0+λti

ω1=ω1+λtixi

ω2=ω2+λtiyi

最終的優化流程如下:

假設訓練樣本爲{xi,yi;ti}1iNN 爲樣本總數

(1)選取初值ω0,ω1,ω2
(2)在訓練集{xi,yi;ti} 中選擇(xi,yi;ti)

(3)如果 ti(ω0+ω1xi+ω1yi)>0 ,則更新:

ω0=ω0+λti

ω1=ω1+λtixi

ω2=ω2+λtiyi

(4)轉到(2)直到訓練集合中沒有誤分點

1.4 代碼實現

第一步:生成訓練數據集

def twoSamples(n = 30):
    x = []
    y = []
    x.extend([[1.0 + random.random(), 1.0 + random.random()] for i in xrange(n)])
    x.extend([[2.5 + random.random(), 2.5 + random.random()] for i in xrange(n)])
    y.extend([-1 for i in xrange(n)])
    y.extend([1 for i in xrange(n)])
    return [x, y]

第二步:隨機梯度下降法優化目標函數

def perSGD(x, y):
    w0 = np.array([0.1, 0.1])
    b0 = 0.1
    lamda = 0.1
    while 1:
        k = 0
        for i in xrange(len(x)):
            xi = x[i]
            yi = y[i]
            if yi * (w0[0] * xi[0] + w0[1] * xi[1] + b0) <= 0.0:
                w0 = w0 + lamda * yi * w0
                b0 = b0 + lamda * yi
                k = k + 1
        if k == 0:
            break
    return w0, b0

第三步:畫出分類線

def plotDL(x, y, w, b):
    px = [0.0, -b/w[1]]
    py = [-b/w[0], 0.0]
    x = np.array(x)
    y = np.array(y)
    plt.plot(x[y == 1, :][:,0], x[y == 1, :][:,1], 'ro', markersize = 12)
    plt.plot(x[y == -1, :][:,0], x[y == -1, :][:,1], 'go', markersize = 12)
    plt.plot(px, py)
    plt.legend(('positive','negtive'))
    plt.xlim([0, 5])
    plt.ylim([0, 5])
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

用上面的程序計算的兩幅圖如下


這裏寫圖片描述
(a) ω0=0.1,ω1=0.2,ω2=0.8


這裏寫圖片描述
(b) ω0=0.1,ω1=0.2,ω2=0.2
圖1.4.1 不同參數時的分類線

圖1.4.1說明感知器對參數的初始值比較敏感,不同的初值得到不同的分類線。這也是感知器的缺點

2 線性分類器-邏輯迴歸

2.1 邏輯迴歸分佈

定義:設 X 爲連續隨機變量, X 服從邏輯分佈是指 X 具有如下分佈函數和概率密度函數

F(x)=P(Xx)=11+e(xμ)γ2.11

f(x)=F(x)=e(xμ)γγ(1+e(xμ)γ)22.12

其中, μ 爲位置參數, γ>0 爲形狀參數。

下圖是不用 γ 參數下的兩幅分佈圖和概率密度圖


這裏寫圖片描述
這裏寫圖片描述
圖 2.1.1 不同參數γ 時的分佈圖和概率密度圖

F(x) 滿足

F(x+μ)12=F(xμ)+122.12

F(x) 對稱中心爲 (μ,12) ,隨着 γ 變小 F(x) 在對稱中心處變化率變大, f(x) 變得尖銳。

2.2 二項邏輯迴歸

二項邏輯迴歸模型是一種分類模型,由條件概率 P(Y|X) 表示,這裏隨機變量 X 取值爲實數,隨機變量 Y 取0或者1,通過監督學習方法學習模型參數。二項邏輯迴歸的條件概率分佈如下

P(Y=1|x)=e(ω1x+ω0)1+e(ω1x+ω0)2.21

P(Y=0|x)=11+e(ω1x+ω0)2.22

這裏 xRnY{0,1}ω1Rn 稱爲權向量, ω0R 稱爲偏置, ω1x 稱爲 ω1x 的內積。

分類時只要計算天健概率P(Y=1|x)P(Y=0|x) 哪個條件概率大,樣本 x 就屬於哪一類。

2.3 參數估計

邏輯迴歸模型學習時,對於給定的訓練集合

{xi,yi}1iNxRnyi{0,1}
,可以用極大似然法估計模型的參數。按照極大似然估計的似然函數的定義,邏輯迴歸的似然函數爲

L=i=1NP(xi,yi)=i=1NP(yi|xi)P(xi)2.31

因爲 P(xi) 是已知的量,所以似然函數可以省略掉 P(xi) ,似然函數爲

L=i=1NP(xi,yi)=i=1NP(yi|xi)P(xi)i=1NP(yi|xi)2.32

P(yi|xi)=[P(Y=1|xi)]yi[1P(Y=1|xi)]1yi2.33

對數似然函數爲

log(L)logi=1N[P(Y=1|xi)]yi[1P(Y=1|xi)]1yi=i=1Nyilog{P(Y=1|xi)}+(1yi)log{[1P(Y=1|xi)]}2.34

按照極大似然估計理論,只要極大化對數自然函數,就可以估計出模型參數,價於極小化負的對數似然函數,所以最優化方法最終的目標函數爲

L¯=i=1Nyilog{P(Y=1|xi)}+(1yi)log{[1P(Y=1|xi)]}2.35

式(2.3-5)的梯度爲

L¯=i=1N[P(Y=1|xi)yi]xi2.36

只要按照下式迭代計算參數ω ,當梯度L¯ 滿足一定的精度時,迭代結束,求得最終的最優參數ω

ω=ωλL¯2.37

其中,λ 爲學習率(步長)。

2.4 基函數

和迴歸中的類似,分類中也能夠引入基函數,在特徵空間上對特徵進行變換。只要將對數似然函數中的特徵變量 xi 加上基函數 ϕ(x)ϕn= ϕ(xn) ,式(2.3-5)和式(2.3-6)分別變爲

L¯=i=1Nyilog{P(Y=1|ϕ(xi))}+(1yi)log{[1P(Y=1|ϕ(xi))]}2.38

式(2.3-5)的梯度爲

L¯=i=1N[P(Y=1|ϕ(xi))yi]ϕ(xi)2.39

2.5 過擬合(正則化)

爲了解決過擬合問題,需要將式(2.3-8)加上一項罰項,變爲

L^=L¯+α2i=1Mω2i2.310

L^=i=1N[P(Y=1|ϕ(xi))yi]ϕ(xi)+αω2.311

ω=ωλ(L¯+αω)2.312

2.6 參數的矩陣表示

省略推導過程,給出帶有基函數和正則項情況下的參數 ω 的矩陣表示

ω=(ΦTΦ+αI)1ΦTy2.313

其中

Φ=111ϕ(x1)ϕ(x2)ϕ(xN)

ΦN×(M+1) 維的矩陣

2.7 代碼實現

此節代碼全部在softmax.py中,鑑於代碼較多就不在文檔中體現了。Softmax算法是邏輯迴歸的推廣,即可以實現多分類的邏輯迴歸,詳細的理論見http://deeplearning.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

Softmax.py中的類Softmax類有如下初始化參數:

算法的學習率: alfa(double)
算法的罰參數: lamda(double)
訓練數據中的特徵個數:feature_num(int)
訓練數據中的類別數目:label_mum(int)
是否使用核函數: kernel (bool)
訓練模型時的運行次數:run_times = 500
訓練模型時的收斂閾值: col = 1e-6

其中的train方法,接受兩個參數,第一個爲訓練數據的特徵,第二個參數爲訓練數據對應的標籤

Predict方法接受一個參數爲預測數據的特徵,返回的結果爲每個樣本的分類結果。

圖2.7.1中,(a)所示的數據是不可分的,(b)中顯示了誤分類的情況,(c)中展示了對圖(a)中引入了基函數x2 後的結果,顯然圖(c)中的數據是可分的了,分類結果見圖(d)。


這裏寫圖片描述
(a)原始的兩類數據
這裏寫圖片描述
(b)沒用核函數的二分類結果
這裏寫圖片描述
(c)加入基函數變換後的數據
這裏寫圖片描述
(d)加入基函數後的分類結果
圖2.7.1 二分類邏輯迴歸問題

圖2.7.2是softmax對多分類的結果


這裏寫圖片描述
圖2.7.2 softmax多分類結果

3 貝葉斯分類器

貝葉斯分類器,是最常用也是性能不錯的分類器。其可以分爲:基於高斯分佈的貝葉斯分類器,主要對連續變量進行分類;多項式貝葉斯分類器,主要處理離散變量,如對文本的分類就是這種;貝努力貝葉斯分類器,主要處理二元樣本。

3.1 貝葉斯公式

概率論裏的貝葉斯公式如下

p(y|x)=p(x|y)p(y)p(x)3.11

如果把 y 當成類別,把 x 當成樣本,則式(5.1-1)可寫爲

p()=p()p()p()3.12

p() 表示樣本屬於類別的概率。貝葉斯分類器的思想是,將樣本屬於每個類別的概率 p() 分別算出來,那個最大,樣本就被分爲哪個類別
假設此時有三個類別,則可以算出三個值分別爲 p(1)=0.2p(2)=0.3p(3)=0.5 ,由於 p(3|) 最大,所以樣本就屬於 3 .

重新研究式(5.1-2)發現對於同一個樣本來說,比較 p() 時可以不考慮 p() ,因爲對於同一個樣本 p() 是一樣的,所以式(5.1-2)又可以簡化爲

p()p()p()3.13

式(5.1-3)是實際應用中所使用的分類準則,下面將敘述如何計算連續樣本和離散樣本時的貝葉斯分類器。

3.2 高斯貝葉斯分類器

3.2.1 理論簡介

假設有訓練樣本集合

{xi,yi}1iNNxiRnyi[C1,C2,,CK]
按照3.2節中的介紹要想對一個未知的樣本進行分類需要計算式(3.1.3)

即計算 p()p()

p()=p(Cj)=(yi=Cj)N3.14

p(|)=p(x|y)=i=1np(xi|y)3.15

p(xi|y) 採用高斯分佈形式,如下

p(xi|y)=12πσ2yexp(xiμy)22πσ2y3.15

μy,σy 爲類別 y 所對應的所有樣本元素 xi 的均值和方差, y[C1,C2,,CK] ,將 xi,yi 展開寫成如下形式

X=x11x21x31x41xN1x12x22x32x42xN2x1nx2nx3nx4nxNn,Y=C1C1C3C1C13.16

假設此時式(3.1-5)中的 y 此時取 C1i 取爲1,則此時將式(3.1-6)中X中的第一列中與 C1 所對應的項全部取出來,假設爲 xC1=[xC11,xC12,xC13,]

則此時

μy=mean(xC1)σy=std(xC1)3.16

其它元素的計算方法與之類似。

3.2.2 代碼實現

第一步:生成訓練樣本和測試樣本

def samples(n_samples, n_features = 10, classes = 5, rat = 0.2):
    見gaussian_nb.py

第二步:用訓練數據訓練模型

def train(self, x, y):
    見gaussian_nb.py

第三步:預測方法

def predict(self, x):
        見gaussian_nb.py

下圖是樸素的高斯貝葉斯分類結果

這裏寫圖片描述
圖5.2.2.1 高斯貝葉斯分類結果

3.3 多項式貝葉斯分類器

多項式貝葉斯分類器主要用來處理特徵是離散的情況,例如其很善於對文本進行分類,線面將以實際的例子介紹多項式貝葉斯分類器在文本分類中的應用。

3.3.1、構造數據集信息

假設存在如下五篇文檔,並可以分成兩大類good和bad

(1)’Nobody owns the water.’,’good’

(2)’the quick rabbit jumps fences’,’good’

(3)’the quick brown fox jumps’,’good’

(4)’buy pharmaceuticals now’,’bad’

(5)’make quick money at the online casino’,’bad’

需要統計的信息如下

a、構造詞語-類別矩陣

從每篇文章中解析出所有不重複的詞語,把這些詞語在每個類別中出現的次數記錄下來形成表1的詞語-類別矩陣

表1 詞語-類別矩陣

類別 詞語 good bad
Nobody Num11(1) Num12(0)
owns Num21(1) Num22(0)
quick Num31(2) Num32(1)

表1表示在屬於good類別的所有文章中,Nobody只出現在文章(1)中則Num11的值爲1,在bad類別的所有文章中沒有Nobody則Num12爲0;而quick出現在文章(2)和(3)中所以Num31爲2,同時quick出現在類別bad的文章(5)中一次,文章(4)中沒有出現,所以Num32爲1,其它的詞語以此類推。

b、每種類別的個數

此處的文檔共5篇,分爲good和bad類,可以得到如表2的類別數統計信息

表2 類別信息

類別 數量
good N1(3)
bad N2(2)

3.3.2、計算特徵(單詞)概率

有了1中的信息就可以計算概率了,表示在給定B的條件下A的概率。我們需要求的是,例如要計算,則計算方法如下
p(quick|good)=Num31/N2=2/3=0.6666 ,quick出現在good中兩次,而屬於good的文章爲3篇,所以最終的結果爲2/3。

更一般的p()=/=1/2=Num(i,j)/N(j)

如果詞語在表1中位於第i行,類別在表一中位於j列,則對應的類別在表2中位於j行,則

Num(i,j) 表示表1中ij列對應的元素值,N(j) 表示表2中對應的j行元素值。

這種計算概率的方法,在計算初期,信息量較小時可能會出現個小的問題,如單詞money只出現在文檔(5)中,
並且這是一篇不好的文章,由於money只在一篇bad的文章中出現,而在任何good的文章中都沒有出現,
所以最後計算money在good文章中出現的概率爲0。顯然這樣做有些偏激,因爲money完全可能是一箇中性詞,
只是其恰好出現在一篇bad的文章中而已。更合理的情況是隨着單詞越來越多地出現在一個分類文檔中,
對應的概率也會趨近於某一個數值。爲了解決這種缺點,引入加權平均方法,假設任意一個詞語出現的概率爲=0.5
(也可以根據先驗知識設置該值),其還需要一個權重,此處設爲=1(也可以根據先驗知識設置該值),
同時爲 p() 也取一個權值 Wp=totals (某一詞語出現在所有分類中的次數
(即,表1中某一行的元素相加,因爲某一行對應於某一特徵(詞語)出現在goodbad類別中出現的次數)),
最終加權平均的概率表達爲

p()=Ptwt+totalsp()wt+totals

3.3.3、計算整篇文檔的頻率

樸素的貝葉斯分類器假設每個特徵(詞語)的概率都是彼此獨立的,所以計算某篇文檔屬於某一類別的概率,只需要將該篇文章中的所有不重複的特徵屬於某一類別的概率相乘,表達形式如下

p(|)=Ni=1p(|)

其中N 爲某篇文章中所有特徵(單詞)的總數。

3.3.4、貝葉斯公式

我們真正需要的是,貝葉斯公式是一種對條件概率進行調換求解的方法,其通常寫作

P(A|B)=P(B|A)P(A)P(B)

在此處,可寫爲
P(|)=P(|)P()P()

P(|) 在3中已經計算出來,P() 爲屬於某一類別的
文章總數除以全部文章的數量,在用貝葉斯進行計算分類時,
需要把文章屬於各個分類的概率都計算出來,然後比較,
對於各個分類P() 都是相同的所以不用計算P() ,所以最終的表達式爲

P(|)P(|)P()

**注意:由於貝葉斯分類器需要將概率連乘,如果詞項過多將可能導致計算機計算時溢出,
所以可以將式 P(|)=P(|)P() 兩端取對數,如下

P(|)log2(P(|)P())

因爲對數是單調增函數,所以經過對數變換
後就變成相加了,可以避免溢出。

3.3.5、選擇分類

在實際的應用中,爲了保準分類的準確性,
對於一篇將要被劃分爲某個分類的新文章而言,
其概率與其它所有分類的概率相比,必須大於某個指定的數值,
這個數值稱爲閾值,以垃圾郵件的分類爲例,
如果要把一份郵件過濾到bad分類中,
設該郵件屬於bad分類的概率爲Pbad ,屬於good的概率爲Pgood ,只
有滿足Pbad>nPgood 時才能把這封郵件劃分到bad分類中,
否則就認爲這封郵件是good分類。

3.3.6、費舍爾方法

1、針對詞語的分類概率

貝葉斯方法,將P(|) 的計算結果組合起來(連乘)的得
到了整篇文檔的概率,然後再對其進行調換求解,
費舍爾方法將直接計算當一篇文檔中出現某個特徵時,
該文檔屬於某個分類的可能性,也就是計算P(|) ,計算P(|) 的方法如下

P(|)==Num(i,1)Num(i,2)Num(i,1)+Num(i,2)

不過這種方法也會存在前文遇到的問題—算法接觸到的詞的次數太少,
所以可能會對概率估計的不準,因此要像前文那樣進行加權平均

P(|)=Ptwt+totalsP(|)wt+totals

2、將各概率值組合起來

費舍爾方法的計算過程是將所有的概率相乘起來,然後取自然對數,然後再將結果乘以-2

P(|)=2×ln(Ni=1P(|i))

N爲詞語個數,ln 是自然對數。

3、對內容分類

與貝葉斯分類器相似,爲了使分類結果準確,要爲每個分類指定個下限,而後分類器會返回指定範圍內的最大值,例如,在垃圾過濾器中可以將bad的閾值設置很高爲0.6,將good分類的閾值設置的較低爲0.2,這樣做就可以將正常郵件被分到bad分類中的可能降到最低,同時也允許少量垃圾郵件進入到收件箱中,如果有的郵件good分類的分值低於0.2,good分類的分值低於0.6,都被劃分到未知分類中。

3.3.7、增量式訓練

在真實世界中所有的訓練和分類都不可能一次性的完成,那麼就需要將用戶在訓練期間所產生的與訓練相關的數據保存起來,在下次訓練的時候就不要重複訓練了,這種支持分次訓練的方式稱之爲增量式訓練,在該算法中,每次訓練時只要更新表1和表2的消息,並將之保存即可。

在分類時直接使用保存下來的表1和表2的消息就可以分類了。

4 總結

除了以上介紹的分類器外,還有神經網絡、決策樹、隨機森林、Adaboost,支持向量機等,這裏不做過多介紹。
分類算法屬於有監督學習範疇,其需要先驗的某些數據集對模型進行訓練,用訓練好的某些對未知數據進行分類,主要的流程如下:
1 將數據集(帶標籤的數據)按照一定的比例分成訓練集和測試集,例如可以將80%的數據作爲訓練集,20%的數據作爲測試集。
2 用訓練集訓練分類模型
3 用測試集測試模型的性能,如查看分類器的準確率召回率等評價指標,以確認模型的精度是否滿足要求
4 用模型對未知類別的數據進行分類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章