1. 程式人生 > >數據挖掘中的 10 大算法

數據挖掘中的 10 大算法

orange explain mach scl 大小 類信息 計數 cnn 這就是

1.C4.5算法

2. k 均值聚類算法

3.支持向量機

4. Apriori 關聯算法

5.EM 最大期望算法 Expectation Maximization

6、PageRank 算法

7、AdaBoost 叠代算法

8、kNN 算法

9、樸素貝葉斯算法

10、CART 分類算法。

1.C4.5算法

C4.5是做什麽的?C4.5 以決策樹的形式構建了一個分類器。為了做到這一點,需要給定 C4.5 表達內容已分類的數據集合。

等下,什麽是分類器呢? 分類器是進行數據挖掘的一個工具,它處理大量需要進行分類的數據,並嘗試預測新數據所屬的類別。

舉個例子吧,假定一個包含很多病人信息的數據集。我們知道每個病人的各種信息,比如年齡、脈搏、血壓、最大攝氧量、家族病史等。這些叫做數據屬性。

現在:

給定這些屬性,我們想預測下病人是否會患癌癥。病人可能會進入下面兩個分類:會患癌癥或者不會患癌癥。 C4.5 算法會告訴我們每個病人的分類。

做法是這樣的:

用一個病人的數據屬性集和對應病人的反饋類型,C4.5 構建了一個基於新病人屬性預測他們類型的決策樹。

這點很棒,那麽什麽是決策樹呢?決策樹學習是創建一種類似與流程圖的東西對新數據進行分類。使用同樣的病人例子,一個特定的流程圖路徑可以是這樣的:

  • 病人有癌癥的病史
  • 病人有和癌癥病人高度相似的基因表達
  • 病人有腫瘤
  • 病人的腫瘤大小超過了5cm

基本原則是:

流程圖的每個環節都是一個關於屬性值的問題,並根據這些數值,病人就被分類了。你可以找到很多決策樹的例子。

算法是監督學習還是無監督學習呢?這是一個監督學習算法,因為訓練數據是已經分好類的。使用分好類的病人數據,C4.5算法不需要自己學習病人是否會患癌癥。

那 C4.5 算法和決策樹系統有什麽區別呢?

首先,C4.5 算法在生成信息樹的時候使用了信息增益。

其次,盡管其他系統也包含剪枝,C4.5使用了一個單向的剪枝過程來緩解過渡擬合。剪枝給結果帶來了很多改進。

再次,C4.5算法既可以處理連續數據也可以處理離散數據。我的理解是,算法通過對連續的數據指定範圍或者閾值,從而把連續數據轉化為離散的數據。

最後,不完全的數據用算法自有的方式進行了處理。

為什麽使用 C4.5算法呢?可以這麽說,決策樹最好的賣點是他們方便於翻譯和解釋。他們速度也很快,是種比較流行的算法。輸出的結果簡單易懂。

哪裏可以使用它呢? 在 OpenTox 上可以找到一個很流行的開源 Java實現方法。Orange 是一個用於數據挖掘的開源數據可視化和分析工具,它的決策樹分類器是用 C4.5實現的。

分類器是很棒的東西,但也請看看下一個聚類算法….

2. k 均值聚類算法

它是做什麽的呢?K-聚類算法從一個目標集中創建多個組,每個組的成員都是比較相似的。這是個想要探索一個數據集時比較流行的聚類分析技術。

等下,什麽是聚類分析呢?聚類分析屬於設計構建組群的算法,這裏的組成員相對於非組成員有更多的相似性。在聚類分析的世界裏,類和組是相同的意思。

舉個例子,假設我們定義一個病人的數據集。在聚類分析裏,這些病人可以叫做觀察對象。我們知道每個病人的各類信息,比如年齡、血壓、血型、最大含氧量和膽固醇含量等。這是一個表達病人特性的向量。

請看:

你可以基本認為一個向量代表了我們所知道的病人情況的一列數據。這列數據也可以理解為多維空間的坐標。脈搏是一維坐標,血型是其他維度的坐標等等。

你可能會有疑問:

給定這個向量集合,我們怎麽把具有相似年齡、脈搏和血壓等數據的病人聚類呢?

想知道最棒的部分是什麽嗎?

你告訴 k-means 算法你想要多少種類。K-means 算法會處理後面的部分。

那它是怎麽處理的呢?k-means 算法有很多優化特定數據類型的變量。

Kmeans算法更深層次的這樣處理問題:

  1. k-means 算法在多維空間中挑選一些點代表每一個 k 類。他們叫做中心點。
  2. 每個病人會在這 k 個中心點中找到離自己最近的一個。我們希望病人最靠近的點不要是同一個中心點,所以他們在靠近他們最近的中心點周圍形成一個類。
  3. 我們現在有 k 個類,並且現在每個病人都是一個類中的一員。
  4. 之後k-means 算法根據它的類成員找到每個 k 聚類的中心(沒錯,用的就是病人信息向量)
  5. 這個中心成為類新的中心點。
  6. 因為現在中心點在不同的位置上了,病人可能現在靠近了其他的中心點。換句話說,他們可能會修改自己的類成員身份。
  7. 重復2-6步直到中心點不再改變,這樣類成員也就穩定了。這也叫做收斂性。

這算法是監督的還是非監督的呢?這要看情況了,但是大多數情況下 k-means 會被劃分為非監督學習的類型。並不是指定分類的個數,也沒有觀察對象該屬於那個類的任何信息,k-means算法自己“學習”如何聚類。k-means 可以是半監督的。

為什麽要使用 k-means 算法呢?我認為大多數人都同意這一點:

k-means 關鍵賣點是它的簡單。它的簡易型意味著它通常要比其他的算法更快更有效,尤其是要大量數據集的情況下更是如此。

他可以這樣改進:

k-means 可以對已經大量數據集進行預先聚類處理,然後在針對每個子類做成本更高點的聚類分析。k-means 也能用來快速的處理“K”和探索數據集中是否有被忽視的模式或關系。

但用k-means 算法也不是一帆風順的:

k means算法的兩個關鍵弱點分別是它對異常值的敏感性和它對初始中心點選擇的敏感性。最後一個需要記住的是, K-means 算法是設計來處理連續數據的。對於離散數據你需要使用一些小技巧後才能讓 K-means 算法奏效。

Kmeans 在哪裏使用過呢? 網上有很多可獲得的 kmeans 聚類算法的語言實現:

? Apache Mahout

? Julia

? R

? SciPy

? Weka

? MATLAB

? SAS

如果決策樹和聚類算法還沒有打動你,那麽你會喜歡下一個算法的。

3.支持向量機

它是做什麽的呢?支持向量機(SVM)獲取一個超平面將數據分成兩類。以高水準要求來看,除了不會使用決策樹以外,SVM與 C4.5算法是執行相似的任務的。

咦?一個超..什麽? 超平面(hyperplane)是個函數,類似於解析一條線的方程。實際上,對於只有兩個屬性的簡單分類任務來說,超平面可以是一條線的。

其實事實證明:

SVM 可以使用一個小技巧,把你的數據提升到更高的維度去處理。一旦提升到更高的維度中,SVM算法會計算出把你的數據分離成兩類的最好的超平面。

有例子麽?當然,舉個最簡單的例子。我發現桌子上開始就有一堆紅球和藍球,如果這這些球沒有過分的混合在一起,不用移動這些球,你可以拿一根棍子把它們分離開。

你看,當在桌上加一個新球時,通過已經知道的棍字的哪一邊是哪個顏色的球,你就可以預測這個新球的顏色了。

最酷的部分是什麽呢?SVM 算法可以算出這個超平面的方程。

如果事情變得更復雜該怎麽辦?當然了,事情通常都很復雜。如果球是混合在一起的,一根直棍就不能解決問題了。

下面是解決方案:

快速提起桌子,把所有的球拋向空中,當所有的球以正確的方式拋在空中是,你使用一張很大的紙在空中分開這些球。

你可能會想這是不是犯規了。不,提起桌子就等同於把你的數據映射到了高維空間中。這個例子中,我們從桌子表面的二維空間過度到了球在空中的三維空間。

那麽 SVM該怎麽做呢?通過使用核函數(kernel),我們在高維空間也有很棒的操作方法。這張大紙依然叫做超平面,但是現在它對應的方程是描述一個平面而不是一條線了。根據 Yuval 的說法,一旦我們在三維空間處理問題,超平面肯定是一個面而不是線了。

關於 SVM的解釋思路,Reddit 的 ELI5 和 ML 兩個子版塊上也有兩個很棒的討論帖。

那麽在桌上或者空中的球怎麽用現實的數據解釋呢?桌上的每個球都有自己的位置,我們可以用坐標來表示。打個比方,一個球可能是距離桌子左邊緣20cm 距離底部邊緣 50 cm,另一種描述這個球的方式是使用坐標(x,y)或者(20,50)表達。x和 y 是代表球的兩個維度。

可以這樣理解:如果我們有個病人的數據集,每個病人可以用很多指標來描述,比如脈搏,膽固醇水平,血壓等。每個指標都代表一個維度。

基本上,SVM 把數據映射到一個更高維的空間然後找到一個能分類的超平面。

類間間隔(margin)經常會和 SVM 聯系起來,類間間隔是什麽呢?它是超平面和各自類中離超平面最近的數據點間的距離。在球和桌面的例子中,棍子和最近的紅球和藍球間的距離就是類間間隔(margin)。

SVM 的關鍵在於,它試圖最大化這個類間間隔,使分類的超平面遠離紅球和藍球。這樣就能降低誤分類的可能性。

那麽支持向量機的名字是哪裏來的?還是球和桌子的例子中,超平面到紅球和藍球的距離是相等的。這些球或者說數據點叫做支持向量,因為它們都是支持這個超平面的。

那這是監督算法還是非監督的呢?SVM 屬於監督學習。因為開始需要使用一個數據集讓 SVM學習這些數據中的類型。只有這樣之後 SVM 才有能力對新數據進行分類。

為什麽我們要用 SVM 呢? SVM 和 C4.5大體上都是優先嘗試的二類分類器。根據“沒有免費午餐原理”,沒有哪一種分類器在所有情況下都是最好的。此外,核函數的選擇和可解釋性是算法的弱點所在。

在哪裏使用 SVM?有什麽 SVM 的實現方法,比較流行的是用scikit-learn, MATLAB 和 libsvm實現的這幾種。

4. Apriori 關聯算法

它是做什麽的?Apriori算法學習數據的關聯規則(association rules),適用於包含大量事務(transcation)的數據庫。

什麽是關聯規則?關聯規則學習是學習數據庫中不同變量中的相互關系的一種數據挖掘技術。

舉個 Apriori 算法的例子:我們假設有一個充滿超市交易數據的數據庫,你可以把數據庫想象成一個巨大的電子數據表,表裏每一行是一個顧客的交易情況,每一列代表不用的貨物項。

技術分享圖片

精彩的部分來了:通過使用 Apriori 算法,我們就知道了同時被購買的貨物項,這也叫做關聯規則。它的強大之處在於,你能發現相比較其他貨物來說,有一些貨物更頻繁的被同時購買—終極目的是讓購物者買更多的東西。這些常被一起購買的貨物項被稱為項集(itemset)。

舉個例子,你大概能很快看到“薯條+蘸醬”和“薯條+蘇打水”的組合頻繁的一起出現。這些組合被稱為2-itemsets。在一個足夠大的數據集中,就會很難“看到”這些關系了,尤其當還要處理3-itemset 或者更多項集的時候。這正是 Apriori 可以幫忙的地方!

你可能會對 Apriori 算法如何工作有疑問,在進入算法本質和細節之前,得先明確3件事情:

  1. 第一是你的項集的大小,你想看到的模式是2-itemset或3-itemset 還是其他的?
  2. 第二是你支持的項集,或者是從事務的總數劃分出的事務包含的項集。一個滿足支持度的項集叫做頻繁項集。
  3. 第三是根據你已經統計的項集中某些數據項,計算其他某個數據項出現的信心水準或是條件概率。例如項集中出現的薯片的話,有67%的信心水準這個項集中也會出現蘇打水。

基本的 Apriori 算法有三步:

  1. 參與,掃描一遍整個數據庫,計算1-itemsets 出現的頻率。
  2. 剪枝,滿足支持度和可信度的這些1-itemsets移動到下一輪流程,再尋找出現的2-itemsets。
  3. 重復,對於每種水平的項集 一直重復計算,知道我們之前定義的項集大小為止。

這個算法是監督的還是非監督的?Apriori 一般被認為是一種非監督的學習方法,因為它經常用來挖掘和發現有趣的模式和關系。

但是,等下,還有呢…對Apriori 算法改造一下也能對已經標記好的數據進行分類。

為什麽使用Apriori 算法?它易於理解,應用簡單,還有很多的派生算法。

但另一方面…

當生成項集的時候,算法是很耗費內存、空間和時間。

大量的 Apriori 算法的語言實現可供使用。比較流行的是 ARtool, Weka, and Orange。

下一個算法對我來說是最難的,一起來看下吧。

5.EM 最大期望算法 Expectation Maximization

EM 算法是做什麽的?在數據挖掘領域,最大期望算法(Expectation-Maximization,EM) 一般作為聚類算法(類似 kmeans 算法)用來知識挖掘。

在統計學上,當估算帶有無法觀測隱藏變量的統計模型參數時,EM 算法不斷叠代和優化可以觀測數據的似然估計值。

好,稍等讓我解釋一下…

我不是一個統計學家,所以希望我的簡潔表達能正確並能幫助理解。

下面是一些概念,能幫我們更好的理解問題。

什麽事統計模型?我把模型看做是描述觀測數據是如何生成的。例如,一場考試的分數可能符合一種鐘形曲線,因此這種分數分布符合鐘形曲線(也稱正態分布)的假設就是模型。

等下,那什麽是分布?分布代表了對所有可測量結果的可能性。例如,一場考試的分數可能符合一個正態分布。這個正態分布代表了分數的所有可能性。換句話說,給定一個分數,你可以用這個分布來預計多少考試參與者可能會得到這個分數。

這很不錯,那模型的參數又是什麽呢?作為模型的一部分,分布屬性正是由參數來描述的。例如,一個鐘形曲線可以用它的均值和方差來描述。

還是使用考試的例子,一場考試的分數分布(可測量的結果)符合一個鐘形曲線(就是分布)。均值是85,方差是100.

那麽,你描述正態分布需要的所有東西就是這兩個參數:

  1. 平均值
  2. 方差

那麽,似然性呢?回到我們之前的鐘形曲線例子,假設我們已經拿到很多的分數數據,並被告知分數符合一個鐘形曲線。然而,我們並沒有給到所有的分數,只是拿到了一個樣本。

可以這樣做:

我們不知道所有分數的平均值或者方差,但是我們可以使用樣本計算它們。似然性就是用估計的方差和平均值得到的鐘形曲線在算出很多分數的概率。

換句話說,給定一系列可測定的結果,讓我們來估算參數。再使用這些估算出的參數,得到結果的這個假設概率就被稱為似然性。

記住,這是已存在分數的假設概率,並不是未來分數的概率。

你可能會疑問,那概率又是什麽?

還用鐘形曲線的例子解釋,假設我們知道均值和方差。然我們被告知分數符合鐘形曲線。我們觀察到的某些分數的可能性和他們多久一次的被觀測到就是概率。

更通俗的講,給定參數,讓我們來計算可以觀察到什麽結果。這就是概率為我們做的事情。

很好,現在,觀測到的數據和未觀測到的隱藏數據區別在哪裏?觀測到的數據就是你看到或者記錄的數據。未觀測的數據就是遺失的數據。數據丟失的原因有很多(沒有記錄,被忽視了,等等原因)。

算法的優勢是:對於數據挖掘和聚類,觀察到遺失的數據的這類數據點對我們來說很重要。我們不知道具體的類,因此這樣處理丟失數據對使用 EM 算法做聚類的任務來說是很關鍵的。

再說一次,當估算帶有無法觀測隱藏變量的統計模型參數時,EM 算法不斷叠代和優化可以觀測數據的似然估計值。 希望現在再說更容易理解了。

算法的精髓在於:

通過優化似然性,EM 生成了一個很棒的模型,這個模型可以對數據點指定類型標簽—聽起來像是聚類算法!

EM 算法是怎麽幫助實現聚類的呢?EM 算法以對模型參數的猜測開始。然後接下來它會進行一個循環的3步:

  1. E 過程:基於模型參數,它會針對每個數據點計算對聚類的分配概率。
  2. M 過程:基於 E 過程的聚類分配,更新模型參數。
  3. 重復知道模型參數和聚類分配工作穩定(也可以稱為收斂)。

EM 是監督算法還是非監督算法呢?因為我們不提供已經標好的分類信息,這是個非監督學習算法。

為什麽使用它?EM 算法的一個關鍵賣點就是它的實現簡單直接。另外,它不但可以優化模型參數,還可以反復的對丟失數據進行猜測。

這使算法在聚類和產生帶參數的模型上都表現出色。在得知聚類情況和模型參數的情況下,我們有可能解釋清楚有相同屬性的分類情況和新數據屬於哪個類之中。

不過EM 算法也不是沒有弱點…

第一,EM 算法在早期叠代中都運行速度很快,但是越後面的叠代速度越慢。

第二,EM 算法並不能總是尋到最優參數,很容易陷入局部最優而不是找到全局最優解。

EM 算法實現可以在 Weka中找到,mclust package裏面有 R 語言對算法的實現,scikit-learn的gmm module裏也有對它的實現。

6.PageRank算法

算法是做什麽的?PageRank是為了決定一些對象和同網絡中的其他對象之間的相對重要程度而設計的連接分析算法(link analysis algorithm)。

那麽什麽是連接分析算法呢?它是一類針對網絡的分析算法,探尋對象間的關系(也可成為連接)。

舉個例子:最流行的 PageRank 算法是 Google 的搜索引擎。盡管他們的搜索引擎不止是依靠它,但 PageRank依然是 Google 用來測算網頁重要度的手段之一。

解釋一下:

萬維網上的網頁都是互相鏈接的。如果 Rayli.net 鏈接到了 CNN 上的一個網頁,CNN 網頁就增加一個投票,表示 rayli.net 和 CNN 網頁是關聯的。

這還沒有結束:

反過來,來自rayli.net 網頁的投票重要性也要根據 rayli.net 網的重要性和關聯性來權衡。換句話說,任何給 rayli.net 投票的網頁也能提升 rayli.net 網頁的關聯性。

基本概括一下:

投票和關聯性就是 PageRank 的概念。rayli.net 給CNN 投票增加了 CNN 的 Pagerank,rayli.net 的 PageRank級別同時也影響著它為 CNN 投票多大程度影響了CNN 的 PageRank。

那麽 PageRank 的0,1,2,3級別是什麽意思? 盡管 Google 並沒有揭露PageRank 的精確含義,我們還是能了解它的大概意思。

我們能通過下面這些網站的PageRank得到些答案:

技術分享圖片

看到了麽?

這排名有點像一個網頁流行度的競爭。我們的頭腦中都有了一些這些網站的流行度和關聯度的信息。

PageRank只是一個特別講究的方式來定義了這些而已。

PageRank還有什麽其他應用呢? PageRank是專門為了萬維網設計的。

可以考慮一下,以核心功能的角度看,PageRank算法真的只是一個處理鏈接分析極度有效率的方法。處理的被鏈接的對象不止只是針對網頁。

下面是 PageRank3個創新的應用:

  1. 芝加哥大學的Dr Stefano Allesina,將 PageRank應用到了生態學中,測定哪個物種對可持續的生態系統至關重要。
  2. Twitter 研究出了一種叫 WTF(Who-to-Follow)算法,這是一種個性化的 PageRank推薦關註人的引擎。
  3. 香港理工大學的 Bin Jiang 使用一種變形的PageRank來預測基於倫敦地形指標的行人移動速率。

這算法是監督的還是非監督的?PageRank常用來發現一個網頁的重要度關聯度,通常被認為是一種非監督學習算法。

為什麽使用PageRank?可以說,PageRank的主要賣點是:由於得到新相關鏈接具有難度,算法依然具有良好的魯棒性。

更簡單一點說,如果你又一個圖或者網絡,並想理解其中元素的相對重要性,優先性,排名或者相關性,可以用PageRank試一試。

哪裏使用過它呢?Google 擁有PageRank 的商標。但是斯坦福大學取得了PageRank 算法的專利權。如果使用 PageRank,你可能會有疑問: 我不是律師,所以最好和一個真正的律師確認一下。但是只要和 Google 或斯坦福沒有涉及到商業競爭,應該都是可以使用這個算法的。

給出PageRank 的三個實現:

1 C++ OpenSource PageRank Implementation

2 Python PageRank Implementation

3 igraph – The network analysis package (R)

7.AdaBoost 叠代算法

AdaBoost 算法是做什麽的?AdaBoost 是個構建分類器的提升算法。

也許你還記得,分類器拿走大量數據,並試圖預測或者分類新數據元素的屬於的類別。

但是,提升(boost) 指的什麽?提升是個處理多個學習算法(比如決策樹)並將他們合並聯合起來的綜合的學習算法。目的是將弱學習算法綜合或形成一個組,把他們聯合起來創造一個新的強學習器。

強弱學習器之間有什麽區別呢?弱學習分類器的準確性僅僅比猜測高一點。一個比較流行的弱分類器的例子就是只有一層的決策樹。

另一個,強學習分類器有更高的準確率,一個通用的強學習器的例子就是 SVM。

舉個 AdaBoost 算法的例子:我們開始有3個弱學習器,我們將在一個包含病人數據的數據訓練集上對他們做10輪訓練。數據集裏包含了病人的醫療記錄各個細節。

問題來了,那我們怎麽預測某個病人是否會得癌癥呢?AdaBoost 是這樣給出答案的:

第一輪,AdaBoost 拿走一些訓練數據,然後測試每個學習器的準確率。最後的結果就是我們找到最好的那個學習器。另外,誤分類的樣本學習器給予一個比較高的權重,這樣他們在下輪就有很高的概率被選中了。

再補充一下,最好的那個學習器也要給根據它的準確率賦予一個權重,並將它加入到聯合學習器中(這樣現在就只有一個分類器了)

第二輪, AdaBoost 再次試圖尋找最好的學習器。

關鍵部分來了,病人數據樣本的訓練數據現在被有很高誤分配率的權重影響著。換句話說,之前誤分類的病人在這個樣本裏有很高的出現概率。

為什麽?

這就像是在電子遊戲中已經打到了第二級,但當你的角色死亡後卻不必從頭開始。而是你從第二級開始然後集中註意,盡力升到第三級。

同樣地,第一個學習者有可能對一些病人的分類是正確的,與其再度試圖對他們分類,不如集中註意盡力處理被誤分類的病人。

最好的學習器也被再次賦予權重並加入到聯合分類器中,誤分類的病人也被賦予權重,這樣他們就有比較大的可能性再次被選中,我們會進行過濾和重復。

在10輪結束的時候,我們剩下了一個帶著不同權重的已經訓練過的聯合學習分類器,之後重復訓練之前回合中被誤分類的數據。

這是個監督還是非監督算法?因為每一輪訓練帶有已經標記好數據集的弱訓練器,因此這是個監督學習。

為什麽使用 AdaBoost?AdaBoost算法簡單, 編程相對來說簡潔直白。

另外,它速度快!弱學習器 一般都比強學習器簡單,簡單意味著它們的運行速度可能更快。

還有件事:

因為每輪連續的Adaboost回合都重新定義了每個最好學習器的權重,因此這是個自動調整學習分類器的非常簡潔的算法,你所要做的所有事就是指定運行的回合數。

最後,算法靈活通用,AdaBoost 可以加入任何學習算法,並且它能處理多種數據。

AdaBoost 有很多程序實現和變體。給出一些:

? scikit-learn

? ICSIBoost

? gbm: Generalized Boosted Regression Models

如果你喜歡Mr.Rogers,你會喜歡下面的算法的…

8.kNN:k最近鄰算法

它是做什麽的?kNN,或 K 最近鄰(k-Nearest Neighbors), 詩歌分類算法。然而,它和我們之前描述的分類器不同,因為它是個懶散學習法。

什麽是懶散學習法呢?和存儲訓練數據的算法不同,懶散學習法在訓練過程中不需要做許多處理。只有當新的未被分類的數據輸入時,這類算法才會去做分類。

但在另一方面,積極學習法則會在訓練中建立一個分類模型,當新的未分類數據輸入時,這類學習器會把新數據也提供給這個分類模型。

那麽 C4.5,SVM 和 AdaBoost 屬於哪類呢?不像 kNN算法,他們都是積極學習算法。

給出原因:

1 C4.5 在訓練中建立了一個決策分類樹模型。

2 SVM在訓練中建立了一個超平面的分類模型。

3 AdaBoost在訓練中建立了一個聯合的分類模型。

那麽 kNN 做了什麽? kNN 沒有建立這樣的分類模型,相反,它只是儲存了一些分類好的訓練數據。那麽新的訓練數據進入時,kNN 執行兩個基本步驟:

1 首先,它觀察最近的已經分類的訓練數據點—也就是,k最臨近點(k-nearest neighbors)

2 第二部,kNN使用新數據最近的鄰近點的分類, 就對新數據分類得到了更好的結果了。

你可能會懷疑…kNN 是怎麽計算出最近的是什麽? 對於連續數據來說,kNN 使用一個像歐氏距離的距離測度,距離測度的選擇大多取決於數據類型。有的甚至會根據訓練數據學習出一種距離測度。關於 kNN 距離測度有更多的細節討論和論文描述。

對於離散數據,解決方法是可以把離散數據轉化為連續數據。給出兩個例子:

1 使用漢明距離(Hamming distance )作為兩個字符串緊密程度的測度。

2 把離散數據轉化為二進制表征。

這兩個來自Stack Overflow的思路也有一些關於處理離散數據的建議:

? KNN classification with categorical data

? Using k-NN in R with categorical values

當臨近的點是不同的類,kNN 怎麽給新數據分類呢?當臨近點都是同一類的時候,kNN 也就不費力氣了。我們用直覺考慮,如果附近點都一致,那麽新數據點就很可能落入這同一個類中了。

我打賭你能猜到事情是從哪裏開始變的麻煩的了…

當臨近點不是同一類時,kNN 怎麽決定分類情況的呢?

處理這種情況通常有兩種辦法:

1 通過這些臨近點做個簡單的多數投票法。哪個類有更多的票,新數據就屬於那個類。

2 還是做個類似的投票,但是不同的是,要給那些離的更近的臨近點更多的投票權重。這樣做的一個簡單方法是使用反距離(reciprocal distance). 比如,如果某個臨近點距離5個單位,那麽它的投票權重就是1/5.當臨近點越來越遠是,倒數距離就越來越小…這正是我們想要的。

這是個監督算法還是非監督的呢?因為 kNN 算法提供了已經被分類好的數據集,所以它是個監督學習算法。

為什麽我們會用 kNN?便於理解和實現是我們使用它的兩個關鍵原因。根據距離測度的方法,kNN 可能會非常精確。

但是這還只是故事的一部分,下面是我們需要註意的5點:

1 當試圖在一個大數據集上計算最臨近點時,kNN 算法可能會耗費高昂的計算成本。

2 噪聲數據(Noisy data)可能會影響到 kNN 的分類。

3 選擇大範圍的屬性篩選(feature)會比小範圍的篩選占有很多優勢,所以屬性篩選(feature)的規模非常重要。

4 由於數據處理會出現延遲,kNN 相比積極分類器,一般需要更強大的存儲需求。

5 選擇一個合適的距離測度對 kNN 的準確性來說至關重要。

哪裏用過這個方法?有很多現存的 kNN 實現手段:

? MATLAB k-nearest neighbor classification

? scikit-learn KNeighborsClassifier

? k-Nearest Neighbour Classification in R

是不是垃圾,先別管了。先讀讀下面的算法吧….

9. Naive Bayes 樸素貝葉斯算法

算法是做什麽的?樸素貝葉斯(Naive Bayes)並不只是一個算法,而是一系列分類算法,這些算法以一個共同的假設為前提:

被分類的數據的每個屬性與在這個類中它其他的屬性是獨立的。

獨立是什麽意思呢?當一個屬性值對另一個屬性值不產生任何影響時,就稱這兩個屬性是獨立的。

舉個例子:

比如說你有一個病人的數據集,包含了病人的脈搏,膽固醇水平,體重,身高和郵編這樣的屬性。如果這些屬性值互相不產生影響,那麽所有屬性都是獨立的。對於這個數據集來說,假定病人的身高和郵編相互獨立,這是合理的。因為病人的身高和他們的郵編沒有任何關系。但是我們不能停在這,其他的屬性間是獨立的麽?

很遺憾,答案是否定的。給出三個並不獨立的屬性關系:

? 如果身高增加,體重可能會增加。

? 如果膽固醇水平增加,體重可能增加。

? 如果膽固醇水平增加,脈搏也可能會增加。

以我的經驗來看,數據集的屬性一般都不是獨立的。

這樣就和下面的問題聯系起來了…

為什麽要把算法稱為樸素的(naive)呢?數據集中所有屬性都是獨立的這個假設正是我們稱為樸素(naive)的原因—— 通常下例子中的所有屬性並不是獨立的。

什麽是貝葉斯(Bayes)?Thomas Bayes 是一個英國統計學家,貝葉斯定理就是以他名字命名的。點擊這個鏈接可以知道更多貝葉斯定理的內容(Bayes’ Theorem)

總而言之,根據給定的一系列屬性信息,借用概率的知識,我們可以使用這個定理來預測分類情況。

分類的簡化等式看起來就像下面的這個式子:

技術分享圖片

我們在深入研究一下..

這個等式是什麽意思?在屬性1和屬性2的條件下,等式計算出了A 類的概率。換句話說,如果算出屬性1 和2,等式算出的數據屬於 A 類的概率大小。

等式這樣寫解釋為:在屬性1和屬性2條件下,分類 A 的概率是一個分數。

? 分數的分子是在分類 A條件下屬性1的概率,乘以在分類 A 條件下屬性2的概率,再乘以分類 A 的概率

? 分數的分母是屬性1的概率乘以屬性2的概率。

舉個 Naive Bayes 的例子,下面是一個從 Stack Overflow thread (Ram’s answer)中找到的一個好例子。

事情是這樣的:

? 我們有個1000個水果的訓練數據集。

? 水果可能是香蕉,橘子或者其他(這些水果種類就是類)

? 水果可能是長形的、甜的、或者黃顏色的(這些是屬性).

技術分享圖片

在這個訓練集中你發現了什麽?

? 500個香蕉中,長的有400個、甜的有350個、黃色的450個

? 300個橘子中、沒有長的、甜的150個、黃色的300個

? 還剩下的200個水果中、長的100個、甜的150個、黃色的50個

如果我們根據長度、甜度和水果顏色,在不知道它們類別的情況下,我們現在可以計算水果是香蕉、橘子或者其他水果的概率了。

假設我們被告知這個未分類的水果是長的、甜的、黃色的。

下面我們以4個步驟來計算所有的概率:

第一步:想要計算水果是香蕉的概率,我們首先發現這個式子看起來很熟悉。這就是在屬性為長形、甜和黃色的條件下,水果是香蕉類的概率,這個表達更簡潔一些:

技術分享圖片

這確實就像我們之前討論的那個等式。

第二步:以分子開始,讓我們把公式的所有東西都加進去。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

像公式一樣,把所有的都乘起來,我們就得到了:

技術分享圖片

第三步:不用管分母了,因為計算別的分類時分子是一樣的。

第四步:計算其他類時也做類似的計算:

技術分享圖片

技術分享圖片

因為0.252大於0.01875,Naive Bayes 會把長形,甜的還是黃色水果分到香蕉的一類中。

這是個監督算法還是非監督算法呢? 為了得到頻數表,Naive Bayes 提供了已經分好類的訓練數據集,所以這是個監督學習算法。

為什麽使用 Naive Bayes?就像你在上面看到的例子一樣,Naive Bayes 只涉及到了簡單的數學知識。加起來只有計數、乘法和除法而已。

一旦計算好了頻數表(frequency tables),要分類一個未知的水果只涉及到計算下針對所有類的概率,然後選擇概率最大的即可。

盡管算法很簡單,但是 Naive Bayes 卻出人意料的十分精確。比如,人們發現它是垃圾郵件過濾的高效算法。

Naive Bayes 的實現可以從Orange, scikit-learn, Weka 和 R 裏面找到。

最後,看一下第十種算法吧。

10.CART 分類算法

算法是做什麽的? CART 代表分類和回歸樹(classification and regression trees)。它是個決策樹學習方法,同時輸出分類和回歸樹。 像 C4.5一樣,CART 是個分類器。

分類樹像決策樹一樣麽?分類樹是決策樹的一種。分類樹的輸出是一個類。

舉個例子,根據一個病人的數據集、你可能會試圖預測下病人是否會得癌癥。這個分類或者是“會的癌癥”或者是“不會得癌癥”。

那回歸樹是什麽呢?和分類樹預測分類不同,回歸樹預測一個數字或者連續數值,比如一個病人的住院時間或者一部智能手機的價格。

這麽記比較簡單:

分類樹輸出類、回歸樹輸出數字。

由於我們已經講過決策樹是如何分類數據的了,我們就直接跳過進入正題了…

CART和 C4.5對比如下:

技術分享圖片

技術分享圖片

這是個監督算法還是非監督的呢?為了構造分類和回歸樹模型,需要給它提供被分類好的訓練數據集,因此 CART 是個監督學習算法。

為什麽要使用 CART 呢?使用 C4.5的原因大部分也適用於 CART,因為它們都是決策樹學習的方法。便於說明和解釋這類的原因也適用於 CART。

和 C4.5一樣,它們的計算速度都很快,算法也都比較通用流行,並且輸出結果也具有可讀性。

scikit-learn 在他們的決策樹分類器部分實現了 CART 算法;R 語言的 tree package 也有 CART 的實現;Weka 和 MATLAB 也有CART的實現過程。

最後,基於斯坦福和加州大學伯克利分校的世界聞名的統計學家們的理論,只有 Salford系統有最原始的 CART 專利源碼的實現部分。

搜集於:http://blog.jobbole.com/89037/

數據挖掘中的 10 大算法