1 線性分類器-感知器
1.1 感知器
有如圖1.1所示的兩類數據希望找到,如果想把他們分開,最簡單的方法就是用圖中的綠線將它們分開。顯然綠線的方程爲
假設紅色點爲
所以只要能求出式(1-1)並按照式(1-2)的規則就能將兩類數據分開,將以上的想法表示成如下形式,可以稱之爲感知器
圖1. 1
假設樣本集合爲
1.2 感知器的學習策略
和迴歸模型一樣,感知器也要進行學習,才能獲取感知器的參數
圖1.1中的直線稱爲分類線,如果數據是高維的,則線就會變成超平面了。在這裏爲了找到這條分類線,這條線需要滿足這樣的準則(損失函數):即線兩邊的點被誤分的總數要最少,圖1.1中所示的情況下,誤分的總數爲0。這樣的損失函數不是參數
對於誤分類來說,有
這是因爲,
其中的
1.3 優化損失函數
根據第二部分介紹的梯度下降法,需要求解損失函數的偏導數,式(1.2-3)可以直接求出偏導數而不用數值導數的求法
(1.3-1)
則
(1.3-2)
這裏給出另一種類似梯度下降法的優化方法:隨機梯度下降法(《Pattern Recognition And Machine Learning》M.
Bishop一書中感知機一節中的解釋),隨機梯度下降法不對整個樣本集合求導數,而對單個樣本就導數,所以式(1.3-2)變成
最終的優化流程如下:
假設訓練樣本爲
(1)選取初值
(2)在訓練集
(3)如果
(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)
(b)
圖1.4.1 不同參數時的分類線
圖1.4.1說明感知器對參數的初始值比較敏感,不同的初值得到不同的分類線。這也是感知器的缺點
2 線性分類器-邏輯迴歸
2.1 邏輯迴歸分佈
定義:設
其中,
下圖是不用
圖 2.1.1 不同參數
2.2 二項邏輯迴歸
二項邏輯迴歸模型是一種分類模型,由條件概率
這裏
分類時只要計算天健概率
2.3 參數估計
邏輯迴歸模型學習時,對於給定的訓練集合
因爲
對數似然函數爲
按照極大似然估計理論,只要極大化對數自然函數,就可以估計出模型參數,等價於極小化負的對數似然函數,所以最優化方法最終的目標函數爲
式(2.3-5)的梯度爲
只要按照下式迭代計算參數
其中,
2.4 基函數
和迴歸中的類似,分類中也能夠引入基函數,在特徵空間上對特徵進行變換。只要將對數似然函數中的特徵變量
式(2.3-5)的梯度爲
2.5 過擬合(正則化)
爲了解決過擬合問題,需要將式(2.3-8)加上一項罰項,變爲
2.6 參數的矩陣表示
省略推導過程,給出帶有基函數和正則項情況下的參數
其中
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)中引入了基函數
(a)原始的兩類數據
(b)沒用核函數的二分類結果
(c)加入基函數變換後的數據
(d)加入基函數後的分類結果
圖2.7.1 二分類邏輯迴歸問題
圖2.7.2是softmax對多分類的結果
圖2.7.2 softmax多分類結果
3 貝葉斯分類器
貝葉斯分類器,是最常用也是性能不錯的分類器。其可以分爲:基於高斯分佈的貝葉斯分類器,主要對連續變量進行分類;多項式貝葉斯分類器,主要處理離散變量,如對文本的分類就是這種;貝努力貝葉斯分類器,主要處理二元樣本。
3.1 貝葉斯公式
概率論裏的貝葉斯公式如下
如果把
假設此時有三個類別,則可以算出三個值分別爲
重新研究式(5.1-2)發現對於同一個樣本來說,比較
式(5.1-3)是實際應用中所使用的分類準則,下面將敘述如何計算連續樣本和離散樣本時的貝葉斯分類器。
3.2 高斯貝葉斯分類器
3.2.1 理論簡介
假設有訓練樣本集合
即計算
假設此時式(3.1-5)中的
則此時
其它元素的計算方法與之類似。
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的概率。我們需要求的是,例如要計算,則計算方法如下
更一般的
如果詞語在表1中位於第i行,類別在表一中位於j列,則對應的類別在表2中位於j行,則
這種計算概率的方法,在計算初期,信息量較小時可能會出現個小的問題,如單詞money只出現在文檔(5)中,
並且這是一篇不好的文章,由於money只在一篇bad的文章中出現,而在任何good的文章中都沒有出現,
所以最後計算money在good文章中出現的概率爲0。顯然這樣做有些偏激,因爲money完全可能是一箇中性詞,
只是其恰好出現在一篇bad的文章中而已。更合理的情況是隨着單詞越來越多地出現在一個分類文檔中,
對應的概率也會趨近於某一個數值。爲了解決這種缺點,引入加權平均方法,假設任意一個詞語出現的概率爲=0.5
(也可以根據先驗知識設置該值),其還需要一個權重,此處設爲=1(也可以根據先驗知識設置該值),
同時爲
(即,表1中某一行的元素相加,因爲某一行對應於某一特徵(詞語)出現在good和bad類別中出現的次數)),
最終加權平均的概率表達爲
3.3.3、計算整篇文檔的頻率
樸素的貝葉斯分類器假設每個特徵(詞語)的概率都是彼此獨立的,所以計算某篇文檔屬於某一類別的概率,只需要將該篇文章中的所有不重複的特徵屬於某一類別的概率相乘,表達形式如下
其中
3.3.4、貝葉斯公式
我們真正需要的是,貝葉斯公式是一種對條件概率進行調換求解的方法,其通常寫作
在此處,可寫爲
文章總數除以全部文章的數量,在用貝葉斯進行計算分類時,
需要把文章屬於各個分類的概率都計算出來,然後比較,
對於各個分類
**注意:由於貝葉斯分類器需要將概率連乘,如果詞項過多將可能導致計算機計算時溢出,
所以可以將式
因爲對數是單調增函數,所以經過對數變換
後就變成相加了,可以避免溢出。
3.3.5、選擇分類
在實際的應用中,爲了保準分類的準確性,
對於一篇將要被劃分爲某個分類的新文章而言,
其概率與其它所有分類的概率相比,必須大於某個指定的數值,
這個數值稱爲閾值,以垃圾郵件的分類爲例,
如果要把一份郵件過濾到bad分類中,
設該郵件屬於bad分類的概率爲
有滿足
否則就認爲這封郵件是good分類。
3.3.6、費舍爾方法
1、針對詞語的分類概率
貝葉斯方法,將
到了整篇文檔的概率,然後再對其進行調換求解,
費舍爾方法將直接計算當一篇文檔中出現某個特徵時,
該文檔屬於某個分類的可能性,也就是計算
不過這種方法也會存在前文遇到的問題—算法接觸到的詞的次數太少,
所以可能會對概率估計的不準,因此要像前文那樣進行加權平均
2、將各概率值組合起來
費舍爾方法的計算過程是將所有的概率相乘起來,然後取自然對數,然後再將結果乘以-2
N爲詞語個數,
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 用模型對未知類別的數據進行分類