機器學習:各算法小結(3)

將最近接觸的幾個機器學習算法小結一下,順便理理自己的思路。

近年來在機器學習的研究中,對算法的創新主要是在原有的基礎上,通過結合不同算法的優點,得到一種更有效的算法,如結合遺傳算法的決策樹、結合自助法boot-strap誕生的決策樹隨機森林等。我最近了解的主要是基礎算法,然後接觸了一些新的算法理念。主要了解了:監督學習的KNN,決策樹,支持向量機,神經網絡,非監督學習的系統聚類,k-means;以及一些輔助算法或分析如:EM思想,主成分分析、因子分析等。

 

一、

監督學習是在知道訓練數據X的目標Y下進行的。

KNN(k最近鄰)是最簡單的監督學習算法之一,他是惰性學習(lazy learning)的典型代表,一開始不訓練模型,只保存訓練數據樣本點,在需要對數據進行預測時,計算輸入數據與訓練數據各樣本點間的距離,選取其中最近的k個樣本點,根據樣本點所屬的分類來加權得到自己所屬的類別,權重一般爲距離的倒數。KNN的算法很簡單,而且分類準確性還挺高的。但是缺點也很明顯

①每次都需要計算跟所有樣本點的距離,所以當數據量過於龐大時,速度會非常慢,這是惰性學習的缺點。

②當樣本點存在範圍重疊時,分類效果會變得特別不好。

針對這2個缺點,改進的方法主要有剪輯近鄰法,將不同類別交界處的樣本進行適當篩選,去掉類別混雜的樣本,讓邊界更清晰。這樣做的話,既可以縮減樣本量,也可以讓分類準確性得到提高,步驟主要如下:

①數據分爲參照集(Reference)和訓練集(Train)

②利用參照集使用KNN算法對訓練集中的數據進行預測

③若預測的類別跟其原來所屬的類別不一樣(說明該樣本點很大可能處在兩類別的交界處),則將該樣本點從訓練集中剔除

④獲得最終剪輯後的訓練集,剪輯樣本集TE

 

KNN算法還有一個要點就是對於K值的選取,如下面這個經典的圖:


當K爲1,3,5時,中間的綠圓點所屬的類別都會有差別,所以究竟要選取多大的K值,決定了模型對實際樣本預測的準確度。一種最常用的方法是設立驗證數據,分別選用不同的k值,得到其對驗證數據的分類誤差率,綜合評價選取分類效果最好的K值,k值一般爲2~10或實例個數的平方根。

 

綜合來說,KNN不用建立模型,適用於小樣本,還有那些不能一次性獲得所有數據的情況,而且其對已分好類的數據是百分百正確的,沒有信息損失,其他諸如迴歸擬合,即使對於已知類別的訓練數據,仍然存在偏差,信息損失。

 

決策樹。決策樹的樹狀圖易於理解,應用範圍相當廣範,顧名思義經常用來輔助決策,已經不能簡單的稱作分類器了。對於決策樹的介紹可以看看我的這篇博文:http://blog.csdn.net/databatman/article/details/49406727。這裏就簡單說下大概,決策樹的話現在主要有ID3,C4.5,CART三種版本,其實都是一個東西,只是增加了些小功能,如支持對連續數據進行分類,採用信息增益率結合信息增益,加入了後期對樹枝的剪輯功能等,其實本質上都是決策樹,只是性能一代代更優而已。如下長這個樣子:


決策樹的分類原則是得到一顆儘量小的樹,這棵樹能滿足分類的需求,也就是我們所說的奧坎姆剃刀(最簡單的總是最好的),樹太寬或太深都不好,決策樹的做法是這樣的:通過選取信息增益大的爲節點來減少樹的深度,通過設定信息增益率的閾值來降低樹的寬度。

 

支持向量機(Suppirt VectorMachine,SVM).SVM是基於統計學習理論的一種分類算法,可以說是統計數學近年來的巔峯啊。有着堅實的數學推導作爲支持。SVM是一種二元分類器,可以通過多次分類來完成對多元的分類,對噪聲魯棒性很好。SVM的思路主要如下圖,在兩類數據間,其實是有無數條線能夠完成對數據的分類,就像感知器(perceptron)也只是找到一條局部最優解的分類線而已。而SVM找到的超平面(這裏是線),中間那條線,他處在兩條虛線的中間,離兩條虛線的距離一樣,而兩邊虛線則是通過支持向量(support vector)來構建的。


而當數據線性不可分的時候,SVM會將當前維度下線性不可分的數據映射到高維空間,完成分類。如下:


映射的函數叫核函數,有多項式核、高斯核等等。

綜合來說,SVM的分類精度特別高,在同類(監督學習算法)算法中,分類精度特別優良,對於SVM的具體推導感興趣的可以看v_JULY_v大大寫的博文【參考文獻1】,介紹的特別詳細。

 

神經網絡(artificialNeural Network)。神經網絡之前沉寂了一段時間,直到2006年由hinton等人提出深度學習框架,一夜之間又變得家喻戶曉,當然現在換了名字叫深度學習了。傳統的神經網絡主要是BP神經網絡。BP指Back Propagation反向傳播算法。

神經網絡是模擬的生物神經元之間傳遞得到的一種網狀模型如下:一般爲三層結構:輸入層、隱含層(可多層)和輸出層,通常3層網絡即可擬合相當複雜的函數關係。神經網絡只是一種結構,當他運用BP算法來進行擬合,就叫做BP神經網絡。BP算法的核心主要是數學中的梯度下降和鏈式法則,過程主要如圖:將訓練數據輸入,從輸出神經元獲得預測結果,比對預測結果和真實結果的值,得到誤差,通過誤差逐漸向上層調整權重,所以叫BP:誤差的反向傳播算法。


BP神經網絡能夠對非常複雜的目標函數f(x→y)進行擬合,尤其是在圖像識別、語音識別等有廣泛的應用,但是當隱含層過多或節點過多時,算法的計算速度特別慢,且初始可供調整的參數過多,有很多選取的trick,需要依賴過多的人工干預,而最終得到的精度還不是特別理想,因而前幾年熱度逐漸下降。

 

深度學習。最近稍微關注了下這個,就先淺淺的談談。深度學習實質是多層的神經網絡(隱含層一般超過十層),如果採用傳統的BP算法,需要極其驚人的運行時間,因此大牛們換了一種方法,他們是這麼來解決這個問題的:①逐層通過無監督學習來初始化②最後一層採用監督學習來調整。深度學習具有很優異的特徵學習能力,能夠自動提取數據中的特徵,這幾乎是科學家們一直以來奮鬥的目標,這才叫智能啊!!最近幾年在智能車和各種圖像識別上得到了廣泛的運行,百度還特地成立了一個深度學習的機構,實在火爆。

 

 

二、

非監督學習的聚類算法我最近也只瞭解了下系統聚類和k-means,因爲這兩比較簡單,運用的也特別多。

系統聚類又叫層次聚類。他首先把n個樣本點分成n類,然後計算兩兩之間的距離,將最近的2個樣本點聚成一類,之後再次計算各個類別之間的距離,再合併縮小類別,直到最後3類,2類,1類。分類結果形式如下:


左邊的文字代表了各個樣本,從右往左看,當你想分成2類時,如圖綠線,綠線所接觸到的兩條線便是所分的兩個類別,其下所屬的實例分屬這兩個類別,如倒數3個樣本是一類,上面的所有樣本是一類。當你想分幾類,就在相應的地方進行切割。

系統聚類的分類方法簡單直觀,核心是距離的度量,距離函數的選取決定了最後的分類精度,主要有最短距離法,最長距離法,重心法,平均值法等,多種距離函數的選取讓他具有較靈活的特性。

 

k-means算法。圍繞着k箇中心點聚成k個cluster。k-means算法步驟如下:

①首先隨機選取k個點作爲cluster(羣)的中心

②分別計算每個樣本點到k個點的距離,分別選取最近的點,聚成k個cluster

③重新計算各個cluster的中心(一般取每個cluster內所有樣本點的平均值)

④重複進行第二到第三步,直到cluster的中心不在變化或者滿足迭代次數。

 

k-means算法的難點主要在於k值的選取和cluster中心的初始化。對於k值,如果事先知道該分爲幾類,當然最好,不知道的情況下,有點難度,我最近看到的一種做法是《大數據-互聯網大規模數據挖掘與分佈式處理》這本書裏提到的【參考文獻2】,選取聚類指標來衡量。該思路認爲,當類簇的數目接近真實值的時候,指標會發生突變。原來可能上升的很慢,轉瞬間上升的很快,原來可能很慢,突然上升的很快。常用的指標有類簇的直徑和半徑、類簇平均質心的加權平均值等。

 

對於cluster中心的初始化,

①最常用的是隨機初始化,但是這樣的方法誤差大,聚類結果常常不一樣,輔助的辦法是多迭代幾次取平均值

②先用層次聚類得到結果,根據確定的k值,從每個簇中選取中心點。

③先隨機確定一個點,再確定第二個點:跟第一個點的距離最大,第三個點:距離前兩個點最近距離最大的點,以此類推。

後兩種準確度較高。

 

三、

EM(Expectationmaximization)思想。EM的核心是極大似然估計,他的基本理論是這樣的,我們在進行觀測的時候,如我們盯着廁所,看看接下來先出來的是女生還是男生。這時候先出來了一個女生,那我們就有理由相信,這是因爲女廁所裏面的女生數比較多,所以我們纔會優先觀測到女生。這就是極大似然估計。通過這個思想,我們能對參數進行估計,即能夠使得這種情況出現概率最大的參數的估計值,就是我們想要的最準確的參數的值了。根據這種思想,EM的步驟大概如下:(當需要估計兩個參數時)

1、E步:固定參數1,調整參數2直到最優
2、M步:固定參數2,調整參數1直到最優
3、反覆迭代1,2步直到似然函數L(Θ)最大

 

其實從這裏也可以看到,EM的思想是融合到許多算法裏的,如k-means,k-means當中隱含的思想就是EM,算法步驟中的第二步,固定了cluster的中心,選取了最短距離。第三步,固定了最短距離,選取了最優cluster中心。

 

降維思想。當數據所含的維度(變量)過多時,直接進行聚類或者分類,速度會特別緩慢,生成的模型過於複雜,而且往往容易造成過擬合,即“維度災難”。所以我們得對數據進行降維。

如m維空間中的數據集,包含N個樣本點Xi ,降維算法的目的就是獲得X的相應低維表達式,,其中d<m,存在一個轉換矩陣。以上思路是對於線性降維算法,非線性降維無法通過線性變換來得到。

 其實在做迴歸分析的時候,使用逐步迴歸或者方差分析剔除變量的時候,就涉及到了降維的思想。

①主成分分析。通過協方差矩陣進行降維。主成分的思路是對現有維度進行整合,得到各個變量的綜合指標。用例子解釋原理的話主要如下圖,一個二維的數據集,原維度爲橫軸和縱軸X1、X2,通過線性變換將座標軸轉換成如圖交叉垂直的兩條虛線軸,

Y1=aX1+bX2

Y2=cX1+dX2



我們看到數據基本都分佈在第一條虛線上,這個時候就可以將這個軸當做第一主成分(新軸)用來擬合數據。第二主成分上的偏差(f方差)較小,可以去掉這個維度。一般來說選取的主成分個數,只要對原維度解釋能達到80%以上就很好了。具體介紹看博文【參考文獻4】。


②因子分析。因子分析用的好像並沒有想象中的廣泛,所以我稍微瞭解了下,思路主要是探尋可觀測變量間存在的不可觀測的隱含變量即公共因子,如數學成績和語文成績,同時高或低,我們知道他其實一定程度上代表了智商,這裏智商就是公共因子。模型構造多個公共因子和一個特殊因子,用來解釋目標值。


主成分和因子分析都消除了相關性對數據的影響,雖然當模型只是用於預測時,變量間的相關性(或多重共線性)對結果影響不大。關於兩者之間的更深入比較可參考【參考文獻5】。目前較常採用的算法是主成分分析

 注:不能因爲PCA可以降維就濫用,使用PCA的目的主要是爲了避免信息重疊,如一個數學成績,多個語文成績變量,這個時候語文成績的佔比就會高很多,從而影響模型的準確性,通過PCA將語文成績降維,就能削減這種影響,並不是相關性高就要使用PCA,可以看出我們關注的實質是相關性後面的信息重疊。所以應當慎用PCA

 

最後,目前在機器學習的研究中,對算法的創新主要是在原有的基礎上,通過結合不同算法的優點,得到一種更有效的算法,如結合遺傳算法的決策樹、結合自助法boot-strap誕生的決策樹隨機森林等。




呼,總算整理完了,大腦要炸了。最後我自己總結一下,大致的流程差不多是這樣:

①到手數據進行清理,去除NA,scale標準化

②當變量過多時,主觀選取變量,或者採用PCA降維

③根據情況選用ML算法建模



 參考文獻:

[1] http://blog.csdn.net/v_july_v/article/details/7624837  支持向量機通俗導論(理解SVM的三層境界)

[2] http://www.tuicool.com/articles/RnIvIn 

[3] https://web.stanford.edu/~hastie/Papers/gap.pdf

[4]  http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html

[5]  http://www.douban.com/note/225942377/



以上圖片皆來自網絡,圖片侵刪。


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