1. 程式人生 > >關於機器學習中的一些常用方法的補充

關於機器學習中的一些常用方法的補充

機器學習 k近鄰 apriori pagerank

前言

機器學習相關算法數量龐大,很難一一窮盡,網上有好事之人也評選了相關所謂十大算法(可能排名不分先後),它們分別是:

1. 決策樹

2. 隨機森林算法

3. 邏輯回歸

4. 支持向量機

5. 樸素貝葉斯

6. K最近鄰算法

7. C均值算法

8. Adaboost 算法

9. 神經網絡

10. 馬爾可夫

當然不同的評價標準會產生完全不同的結果,但上述10個算法在筆者看來可能還是比較靠譜的,因為至少它們具有一定的代表性。

Spark的機器學習工具中(MLLIB),它將機器學習相關方法分為了四類:回歸、聚類、分類及協同過濾,這種分類方法也比較合理;對於我們而言可能最為常見的就是回歸、聚類及分類相關算法;例如最小二乘法、線性回歸(包括嶺回歸及

LASSO回歸)、C均值聚類、混合高斯聚類、球面聚類、決策樹及隨機森林、樸素貝葉斯、二分類或多分類的支持向量機等,在筆者的文章中或多或少都有涉及,但目前未知對於神經網絡還未進行更多的討論,當然神經網絡除了具有分類作用(無論是有監督、無監督還是半監督的方式,它還可以被用作編碼或壓縮(受限玻爾茲曼機,即RBM),這種應用就可能無法歸類到上述任何四種方法中,類似的包括各類對數據降維(主成分分析或奇異值分解)或升維(最主要的是核方法)的算法,一般而言,它們不會被單獨應用,而總是和其它方法一起使用。

在本文中,將會給出一些其它的、常見的機器學習相關方法,這主要包括用於分類的K近鄰方法、用於規則挖掘的

Apriori方法以及比較流行的出於GooglePageRank方法;其實還有一大類用於文本相關數據挖掘的方法,如TFIDFLDA以及文本向量化方法Word2Vec等也是非常重要的機器學習方法,但筆者打算單獨行文進行論述,因為它們還是有非常不同的特質。

K近鄰分類

從本質而言,K近鄰方法是一種分類算法,它可以不通過訓練而達到對目標數據分類的效果;而它進行分類的依據實際上是還是根據空間的距離,至於是采用什麽樣的距離度量函數,則可以進行選擇,但一般而言,還是使用歐氏空間下的歐氏距離,當然也可以使用曼哈頓距離或切比雪夫距離。

以下定義數據x和其近鄰:

技術分享

對於上述定而言,分母部分是一個常數K,就是對於數據x到底取幾個近鄰樣本數據,而分子部分則表示,對於K個近鄰而言,類別是i的個數;那麽確定數據x到底屬於哪個類別則就是通過類似投票的方式來確定,即在這些K的數據中,哪種類別數量多,則x就是相應的類別,形式化的表示如下:

技術分享


具體算法流程如下:

算法K近鄰算法

輸入:訓練數據集(這些數據包含類標)及其測試對象

輸出:測試對象所述類別(假設共c個類別)

  1. 1. 根據給定的距離測度函數,在訓練集中找到與測試對象最近鄰的K個對象,對K個近鄰分別統計它們所述類別數量;

  2. 2. 將測試對象歸入數量最多的那個類。

當訓練樣本最夠多時,最近鄰算法能夠取得較好的效果,而對於其錯誤率,相關人士也給出了判斷。

N個樣本下最近鄰的平均錯誤率為技術分享,樣本x的最近鄰為x‘,平均錯誤率則定義如下:

技術分享


在公式4中的累加部分就是測試數據被正確分類的概率,而用1減去這個概率則顯然就是分類錯誤了;對於公式3而言,只不過是一個貝葉斯公式而已,具體推導如下:

對於誤差exx‘的聯合分布,針對xx求取邊緣分布並用貝葉斯公式展開(因為聯合分布無法獲得,而條件分布易於得到):

技術分享


當樣本數量趨向於無窮時,這個平均錯誤率將十分接近貝葉斯錯誤率。

以上就是經典的K近鄰算法,而在這種算法中每個近鄰對最終分類的決策都是等同的,但在一些場合下這個並不總是一定的,那麽就可以考慮一種所謂加權的K近鄰算法,當然這時如果K等於1就沒有什麽意義,一般情況下我們考慮根據距離進行加權,即距離查詢點(就是之前的測試點)越近權值越大,而反之則離查詢點越遠權值越小,於是基於距離加權的K近鄰分類方法表示如下:

技術分享


從上面的分析可以看出,無論是經典的K近鄰算法或者是距離加權K近鄰算法,對於一個查詢點而言,都需要遍歷整個訓練集,而且如果訓練集及查詢點的維度較高,則運算量會變得非常巨大,那麽就有必要采取一些加速的方法,這裏主要有幾種:

其一,對於高維情況,可以采用特征的一個子集來計算數據之間的距離,而且可以優先選擇方差較大的特征屬性,顯而易見,這樣可以較為明顯地減少計算量從而達到較快地進行分類的目的;

其二,直接將對分類毫無幫助的樣本點刪除,以達到縮減訓練集的目的,從而減少運算量,也就是可以考慮刪除被同類樣本點包裹的那些數據;

其三,利用所謂kd樹對訓練數據進行預處理,其做法主要是不斷地尋找各個屬性的中位數所對應的樣本,然後將其作為根節點,對數據進行兩兩分離,最後形成一個二叉搜索樹,在查詢時可以比原方法獲得快得多的計算性能。

Apriori關聯規則挖掘

就關聯規則挖掘本身而言,可能無法歸類於回歸、聚類或分類這些範疇中,而可能和協同過濾倒是有些淵源(協同過濾中可能最為著名的應用便是推薦),Apriori也是筆者較早聽說的數據挖掘的算法之一(主要是拜韓家煒教授的《數據挖掘》一書所賜),而另一個非常著名的算法可能就是KMeans(又被稱作C均值)。

因為關聯規則的挖掘似乎天生就和購物籃有關系?這裏經常有個被已經玩壞的例子,就是“買啤酒時同時會買尿不濕”。關聯規則的挖掘從本質上而言也是一類無監督的算法。

Apriori關聯規則挖掘正是為了發現數據中可能存在的相關關系而提出的無監督方法(另外一類著名的無監督算法主要指數據聚類,受限玻爾茲曼機也是無監督的)。以下較為形式化地定義下這個關聯規則挖掘問題。

I={i1, i2, ... , im}m個待研究的項(Item)構成的有限集合,現給定事務(Transaction)集合T={T1, T2, ..., Tn},其中對於事務集合中的每個元素而言,有Ti={ i1, i2, ... , ik},它是I的子集,被成為k-項集。如果對於I的子集X,存在事物T包含X,則成該事務T包含X。一條關聯規則的形式如技術分享,其中XY都是I的子集,而且XY交集為空。

其實從上述較為形式化的定義可以直觀地感受到,關聯規則就是發現哪些事情會同時發生的!比如在超市購物時,哪些物品會被同時購買(就是上述那個爛大街的例子),但事情同時發生時到底是必然還是偶然呢?這可能只能從發生概率來解釋了,以下就是關於關聯規則的支持度和可信度定義。

關聯規則的支持度定義為XY同時出現在一次事務中的可能性,由X項和Y項在樣本數據集合中同時出現的事務數占總事務數的比例來定義,如下:

技術分享


對於關聯規則而言,只有同時滿足一定的支持度和可信度閾值要求,方能作為正式的關聯規則。

Apriori關聯規則算法包含兩個主要部分,其一是在給定的最小支持度閾值和數據下,在數據中尋找頻度大於最小支持度的項集,超過最小支持度而且由k個項構成的集合稱為k-大項集或大項集,使用符號Lk來記錄之,Lk的項集又被成為頻繁項集,而且一個k-項集的支持度超過最小支持度的必要條件是k-項集的全部子集都在k-大項集之中;算法第二部分是找出可信度超過閾值的項集。算法的核心主要在第一部分。

為了直觀起見,以下先舉個例子,以說明算法是如何工作的,此例子來源於王星等編著的《大數據分析:方法和應用》一書。

下表是一個購物籃數據,有5次購買記錄。

購物籃序號

A

B

C

T1

1

0

0

T2

0

1

0

T3

1

1

1

T4

1

1

0

T5

0

1

1

在上表中,Ti表示第i筆交易,如A=1則表示購買了物品A,否則沒有購買。那麽也可以使用下表來表示項集。

事務序號

項集

T1

A

T2

B

T3

ABC

T4

AB

T5

BC

先假定支持度和可信度分別為0.40.6,則算法執行過程如下所示:

  1. 先搜索1-項集,找出頻繁1-項集L1={A,B,C}

  2. 在頻繁1-項集中生成2-項集,如{AB,BC,AC},然後在其上找出頻繁2-項集:L2={AB,BC}

  3. 在頻繁2-項集的基礎上生成3-項集{ABC},然後在其上找出頻繁3-項集,但是由於其已經低於設定的支持度閾值(支持度為0.2),故算法結束。

以下是算法的第二步,就是在頻繁集的基礎上找出關聯規則,如下:

規則1:支持度0.4,可信度0.67技術分享

規則2:支持度0.4,可信度0.5技術分享

規則3:支持度0.4,可信度1技術分享(這裏可信度為1就是因為只要出現項C就會出現項B

對於第一部分頻繁集的發現,比較形式化的算法描述如下(Ck為候選k-項集;這個算法步驟來源於較為原始的文檔):

算法Apriori頻繁集發現

輸入:交易數據,支持度閾值、可信度閾值

輸出:頻繁集

L1={頻繁項集};

for(k=1; Lk is not null; k++) {

Ck+1 = Lk擴張生成;

for 每增加一個事務T do

對所有Ck+1中的項集,如果也包含T,則頻數加1;

Lk+1 = Ck+1如果滿足支持度大於等於最小支持度;

}

return 技術分享

當然,關聯規則挖掘的算法遠不止一個Apriori,還有如GRICarma等算法,而且上述算法還不是最優形式。

PageRank

顧名思義,PageRank主要就是用於給網頁排名之用的,它是Google創始人拉裏佩奇和謝爾蓋布林於1997年構建早期的搜索系統原型時提出的鏈接分析算法;該算法是一個對網頁好壞的一個評估,其級別從010,一般一個網頁有4分就不錯了;其基本原理非常簡單,就是某一頁Pi的排名是根據其它鏈接它的頁面Pj排名之和而得到的。

不過說起來較為簡單,但實際上還不是那麽容易,因為如果引用頁面Pj同時又引用了其它頁面則需要將排名得分其除以引用的頁面數量,形式化的定義如下:

技術分享

這裏PR表示頁面的排名,而L表示獲取頁面的鏈接數函數;顯然對於一個頁面組成的集合,可以定義一個矩陣來表示頁面之間的鏈接情況,當被考察的頁面相當之多時,這個矩陣就趨向於稀疏。

由於在實際情況中,存在一些頁面不鏈接其它任何頁面(即出度為零),而只被其它頁面所鏈接,這樣造成這個矩陣中存在相當多的零,則我們將公式修改為如下形式:


技術分享

不過無論這個頁面排名是什麽樣的形式,可以看出其解是一個向量,而對這個向量的求解過程就是PageRank的核心所在。

在求解之初,不失一般性的,我們先把解向量全部賦值成1,然後我們可以把頁面之間的鏈接關系矩陣改寫成一個概率轉移矩陣(轉移到幾個頁面,相應地其概率就是幾分之幾;如有三個需要評分的頁面,其中A可以鏈接到BC,而B可以鏈接到C,而C能鏈接到A,則A的跳轉幾率就是1/21/2,如此類推)。

現令矩陣:


技術分享

在上式中P就是概率轉移陣,而e則是全1的列向量(那麽技術分享就變為全1的矩陣,註意不是技術分享否則結果就是一個實數),而令我們求解的網頁排名向量為R,則R

技術分享

可以證明公式15,當n趨向於無窮時,X無限接近於R;其中道理在於:由於矩陣A是一個非常返的、不可約的(就是網頁連通圖中均是連通的,不存在孤立的圖節點)近似馬爾科夫概率轉移陣,其定理保證了收斂性(一般關於隨機過程論的著作上均有相關解釋,這個應該也不用佩奇來證明吧,可能有些文獻上講到這個部分時有一定錯誤),而且這個方法保證了算法的魯棒性,即無論X的初值取何初值,算法總會在若幹步後收斂。

具體算法流程如下(以下使用冪法進行求解):

算法:求解PageRank

輸入:網頁及其鏈接關系

輸出:網頁排名

X的初值全部設成1

R=AX;

while(true) {

if(||X-R||1 <ε){

return R;

} else {

X=R;

R=AX;

}

}

算法中||X-R||1<ε是用於判斷算法是否收斂的條件,它可以使用向量的1範數(即各元素絕對值相加)。

當然,算法的難點並不在於其復雜性(其實好像算法本身一點也不復雜)或者其數學道理(這個類似馬爾科夫轉移陣的方法也沒有多少深奧的道理),而在於當面對浩如煙海的頁面時,這個矩陣就會變得異常稀疏,這對存儲和計算都是巨大的挑戰,故需要使用一些分布式計算方法進行處理;另外,在後來的實踐中好像又添加了一些限制性的參數以防垃圾連接的存在。







關於機器學習中的一些常用方法的補充