機器學習實戰-基本算法總結3

機器學習基本算法總結

☞無監督學習

代碼在這,基於python3(原書代碼是python2)

這裏只是一個總結,原書已經講解很清楚了,不清楚的直接看代碼

目錄

==========================

一、預測數值型數據:迴歸

1.1 K-means算法的相關描述

———————————————————————————————————- 
優點:容易實現。
缺點:可能收斂到局部最小值,在大規模數據集上收斂較慢。
適用數據類型:數值型數據。
———————————————————————————————————- 
———————————————————————————————————- 
訓練算法:不適用於無監督學習,即無監督學習沒有訓練過程。
測試算法:應用聚類算法、觀察結果。可以使用量化的誤差指標如誤差平方和來評價算法的結果。
使用算法:可以用於所希望的任何應用。通常情況下,簇質心可以代表整個簇的數據來做出決策。
———————————————————————————————————- 

  聚類是一種無監督的學習,它將相似的對象歸到同一簇中。聚類的方法幾乎可以應用所有對象,簇內的對象越相似,聚類的效果就越好。K-means算法中的k表示的是聚類爲k個簇,means代表取每一個聚類中數據值的均值作爲該簇的中心,或者稱爲質心,即用每一個的類的質心對該簇進行描述。
  聚類和分類最大的不同在於,分類的目標是事先已知的,而聚類則不一樣,聚類事先不知道目標變量是什麼,類別沒有像分類那樣被預先定義出來,所以,聚類有時也叫無監督學習。
  聚類分析試圖將相似的對象歸入同一簇,將不相似的對象歸爲不同簇,那麼,顯然需要一種合適的相似度計算方法,我們已知的有很多相似度的計算方法,比如歐氏距離,餘弦距離,漢明距離等。事實上,我們應該根據具體的應用來選取合適的相似度計算方法。
  首先,隨機確定k個初始點的質心;然後將數據集中的每一個點分配到一個簇中,即爲每一個點找到距其最近的質心,並將其分配給該質心所對應的簇;該步完成後,每一個簇的質心更新爲該簇所有點的平均值。僞代碼如下:
創建女個點作爲起始質心(經常是隨機選擇)
當任意一個點的簇分配結果發生改變時
 對養據集中的每個數據點
  對每個質心
   計算質心與數據點之間的距離
  將數據點分配到距其最近的簇
 對每一個簇,計算簇中所有點的均值並將均值作爲質心

需要說明的是,在算法中,相似度的計算方法默認的是歐氏距離計算,當然也可以使用其他相似度計算函數,比如餘弦距離;算法中,k個類的初始化方式爲隨機初始化,並且初始化的質心必須在整個數據集的邊界之內,這可以通過找到數據集每一維的最大值和最小值;然後最小值+取值範圍*0到1的隨機數,來確保隨機點在數據邊界之內。
計算質心-分配-重新計算質心的方式反覆迭代。算法停止的條件是,當然數據集所有的點分配的距其最近的簇不在發生變化時,就停止分配,更新所有簇的質心後,返回k個類的質心(一般是向量的形式)組成的質心列表,以及存儲各個數據點的分類結果和誤差距離的平方的二維矩陣。

2.後處理

  有時候當我們觀察聚類的結果圖時,發現聚類的效果沒有那麼好,顯然,這種情況的原因是,算法收斂到了局部最小值,而並不是全局最小值,局部最小值顯然沒有全局最小值的結果好。那麼,既然知道了算法已經陷入了局部最小值,如何才能夠進一步提升K-means算法的效果呢?
  一種用於度量聚類效果的指標是SSE,即誤差平方和, 爲所有簇中的全部數據點到簇中心的誤差距離的平方累加和。SSE的值如果越小,表示數據點越接近於它們的簇中心,即質心,聚類效果也越好。因爲,對誤差取平方後,就會更加重視那些遠離中心的數據點
  顯然,我們知道了一種改善聚類效果的做法就是降低SSE,那麼如何在保持簇數目不變的情況下提高簇的質量呢?

方法一:  

  我們可以將具有最大SSE值得簇劃分爲兩個簇(因爲,SSE最大的簇一般情況下,意味着簇內的數據點距離簇中心較遠),具體地,可以將最大簇包含的點過濾出來並在這些點上運行K-means算法,其中k設爲2 ( 2個簇 ) 。
  同時,當把最大的簇(上圖中的下半部分)分爲兩個簇之後,爲了保證簇的數目是不變的,我們可以再合併兩個簇。具體地:
  一方面我們可以合併兩個最近的質心所對應的簇,即計算所有質心之間的距離,合併質心距離最近的兩個質心所對應的簇。
  另一方面,我們可以合併兩個使得SSE增幅最小的簇,顯然,合併兩個簇之後SSE的值會有所上升,那麼爲了最好的聚類效果,應該儘可能使總的SSE值小,所以就選擇合併兩個簇後SSE漲幅最小的簇。具體地,就是計算合併任意兩個簇之後的總得SSE,選取合併後最小的SSE對應的兩個簇進行合併。這樣,就可以滿足簇的數目不變。
  上面,是對已經聚類完成的結果進行改善的方法,在不改變k值的情況下,上述方法能夠起到一定的作用,會使得聚類效果得到一定的改善。那麼,下面要講到的是一種克服算法收斂於局部最小值問題的K-means算法。即二分k-均值算法。

方法二:二分K-means算法

  二分K-means算法首先將所有點作爲一個簇,然後將簇一分爲二。之後選擇其中一個簇繼續進行劃分,選擇哪一個簇取決於對其進行劃分是否能夠最大程度的降低SSE的值。上述劃分過程不斷重複,直至劃分的簇的數目達到用戶指定的值爲止。
僞代碼:
將所有點看成一個簇
當簇數目小於k時
  對於每一個簇
    計算總誤差
    在給定的簇上面進行k-均值聚類(k=2)
    計算將該簇一分爲二之後的總誤差
  選擇使得總誤差最小的簇進行劃分

  當然,也可以選擇SSE最大的簇進行劃分,知道簇數目達到用戶指定的數目爲止。
  在上述算法中,直到簇的數目達到k值,算法纔會停止。在算法中通過將所有的簇進行劃分,然後分別計算劃分後所有簇的誤差。選擇使得總誤差最小的那個簇進行劃分。劃分完成後,要更新簇的質心列表,數據點的分類結果及誤差平方。具體地,假設劃分的簇爲mm<k 個簇中的第i 個簇,那麼這個簇分成的兩個簇後,其中一個取代該被劃分的簇,成爲第i個簇,並計算該簇的質心;此外,將劃分得到的另外一個簇,作爲一個新的簇,成爲第m+1個簇,並計算該簇的質心。此外,算法中還存儲了各個數據點的劃分結果和誤差平方,此時也應更新相應的存儲信息。這樣,重複該過程,直至簇個數達到k。

小結

  1 聚類是一種無監督的學習方法。聚類區別於分類,即事先不知道要尋找的內容,沒有預先設定好的目標變量。
  2 聚類將數據點歸到多個簇中,其中相似的數據點歸爲同一簇,而不相似的點歸爲不同的簇。相似度的計算方法有很多,具體的應用選擇合適的相似度計算方法
  3 K-means聚類算法,是一種廣泛使用的聚類算法,其中k是需要指定的參數,即需要創建的簇的數目,K-means算法中的k個簇的質心可以通過隨機的方式獲得,但是這些點需要位於數據範圍內。在算法中,計算每個點到質心得距離,選擇距離最小的質心對應的簇作爲該數據點的劃分,然後再基於該分配過程後更新簇的質心。重複上述過程,直至各個簇的質心不再變化爲止。
  4 K-means算法雖然有效,但是容易受到初始簇質心的情況而影響,有可能陷入局部最優解。爲了解決這個問題,可以使用另外一種稱爲二分K-means的聚類算法。二分K-means算法首先將所有數據點分爲一個簇;然後使用K-means(k=2)對其進行劃分;下一次迭代時,選擇使得SSE下降程度最大的簇進行劃分;重複該過程,直至簇的個數達到指定的數目爲止。實驗表明,二分K-means算法的聚類效果要好於普通的K-means聚類算法。

===============================================================

二、基於apriori算法進行關聯分析

1 關聯分析

———————————————————————————————————- 
優點:易編碼實現。’
缺點:在大數據集上可能較慢。
適用數據類型:數值型或者標稱型數據。
———————————————————————————————————- 
———————————————————————————————————- 
訓練算法:使用apriori算法來找到頻繁項集。
測試算法:不需要測試過程。
使用算法:用於發現頻繁項集以及物品之間的關聯規則。
———————————————————————————————————- 

  從大規模數據集中尋找物品間的隱含關係被稱作關聯分析或者關聯規則學習;
關聯分析是一種在大規模數據集中尋找有趣關係的任務。這些關係可以有兩種形式:頻繁項 集或者關聯規則。頻繁項集(frequent item sets)是經常出現在一塊的物品的集合,關聯規則(association rules)暗示兩種物品之間可能存在很強的關係。
  當尋找頻繁項集時,頻繁(frequent)的定義是什麼? 有許多概念可以解答上述問題,不過其中最重要的是支持度和可信度
  支持度是指:數據集中包含某個項集的記錄所佔的比例。持度是針對項集來說的,因此可以定義一個最小支持度,而只保留滿足最小支持度的項集。
  可信度或置信度是針對一條諸如{尿布} ➞ {葡萄酒}的關聯規則來定義的。這
條規則的可信度被定義爲“支持度({尿布, 葡萄酒})/支持度({尿布})”。假設{尿布, 葡萄酒}的支持度爲3/5,尿布的支持度爲4/5,所以“尿布 ➞ 葡萄酒”的可信度爲3/4=0.75。
這意味着對於包含“尿布”的所有記錄,我們的規則對其中75%的記錄都適用。
  如果面對成千上萬的數據,如生成一個物品所有可能組合的清單,然後對每一種組合統計它出現的頻繁程度,但當物品成千上萬時,上述做法非常非常慢。這裏就需要引入Apriori原理來減少計算量。

2. 關聯分析

  Apriori原理可以幫我們減少可能感興趣的項集。Apriori原理是說如果某個項集是頻繁的,那麼它的所有子集也是頻繁的。這個原理直觀上並沒有什麼幫助,但是如果反過來看就有用了,也就是說如果一個項集是非頻繁集,那麼它的所有超集也是非頻繁的。
  這裏寫圖片描述

  這也就是說,一旦計算出了{2,3}的支持度,知道它是非頻繁的之後,就不需要再計算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因爲我們知道這些集合不會滿足我們的要求。使用該原理就可以避免項集數目的指數增長,從而在合理時間內算出頻繁項集。
  Apriori算法是發現頻繁項集的一種方法。 Apriori算法的兩個輸入參數分別是最小支持度和數據集該算法首先會生成所有單個物品的項集列表。接着掃描交易記錄來查看哪些項集滿足最小支持度要求,那些不滿足最小支持度的集合會被去掉。然後,對剩下來的集合進行組合以生成包含兩個元素的項集接下來,再重新掃描交易記錄,去掉不滿足最小支持度的項集。該過程重複進行直到所有項集都被去掉。
1.數據集僞代碼如下:
對數據集中的每條交易記錄tran
對每個候選項集can:
  檢查一下can是否是tran的子集:
  如果是,則增加can的計數值  
對每個候選項集:
如果其支持度不低於最小值,則保留該項集
返回所有頻繁項集列表

2.整個Apriori算法的僞代碼如下:
當集合中項的個數大於0時
  構建一個k個項組成的候選項集的列表
  檢查數據以確認每個項集都是頻繁的
  保留頻繁項集並構建奸1項組成的候選項集的列表

這裏寫圖片描述  

3. 從頻繁項集中挖掘關聯規則

  人們最常尋找的兩個目標是頻繁項集與關聯規則。上一節介紹如何使用Apriori算法來發現頻繁項集,現在需要解決的問題是如何找出關聯規則。
  對於關聯規則,我們也有類似的量化方法,這種量化指標稱爲可信度。一條規則P ➞ H的可信度定義爲 :support(P |H)/support(P) 。記住,在Python中,操作符 | 表示集合的並操作。P | H 是指所有出現在集合 P 或者集合 H 中的元素。
這裏寫圖片描述
  可以觀察到,如果某條規則並不滿足最小可信度要求,那麼該規則的所有子集也不會滿足最小可信度要求。以上圖爲例,假設規則{0,1,2 ➞ 3}不滿足最小可信度要求,那麼就知道任何左部爲{0,1,2}子集的規則也不會滿足最小可信度要求。 可以利用關聯規則的上述性質屬性來減少需要測試的規則數目。
  可以利用關聯規則的上述性質屬性來減少需要測試的規則數目。首先從一個頻繁項集開始,接着創建一個規則列表,其中規則右部只包含一個元素,然後對這些規則進行測試。接下來合併所有剩餘規則來創建一個新的規則列表,其中規則右部包含兩個元素。這種方法也被稱作分級法,如上圖所示。

4.總結

  (1)關聯分析是用於發現大數據集中元素間有趣關係的一個工具集,可以採用兩種方式來量化這些有趣的關係。
  第一種方式是使用頻繁項集,它會給出經常在一起出現的元素項。
  第二種方式是關聯規則,每條關聯規則意味着元素項之間的“如果……那麼”關係。
  
  (2)Apriori的方法簡化了計算量,在合理的時間範圍內找到頻繁項集:
  Apriori原理是說如果一個元素項是不頻繁的,那麼那些包含該元素的超集也是不頻繁的。

  (3)每次增加頻繁項集的大小,Apriori算法都會重新掃描整個數據集。當數據集很大時,這會顯著降低頻繁項集發現的速度。下一章會介紹FP-growth算法 ,和Apriori算法相比,該算法只需要對數據庫進行兩次遍歷,能夠顯著加快發現繁項集的速度。

===============================================================

三、使用FP-growth算法來高效發現頻繁項集

1. 相關描述

———————————————————————————————————- 
優點:一般要快於Apriori。
缺點:實現比較困難,在某些數據集上性能會下降。
適用數據類型:標稱型數據。
———————————————————————————————————- 
———————————————————————————————————- 
訓練算法:構建一個FP樹,並對樹進行挖據。
測試算法:沒有測試過程。
使用算法: 可用於識別經常出現的元素項,從而用於制定決策、推薦元素或進行預測等應用中。
———————————————————————————————————- 

  本章會在上一章討論話題的基礎上進行擴展,將給出一個非常好的頻繁項集發現算法。該算法稱作FP-growth,它比上一章討論的Apriori算法要快。它基於Apriori構建,但在完成相同任務時採用了一些不同的技術。這裏的任務是將數據集存儲在一個特定的稱作FP樹的結構之後發現頻繁項集或者頻繁項對,即常在一塊出現的元素項的集合FP樹。FP-growth算法只需要對數據庫進行兩次掃描,而Apriori算法對於每個潛在的頻繁項集都會掃描數據集判定給定模式是否頻繁,因此FP-growth算法的速度要比Apriori算法快。
它發現頻繁項集的基本過程如下:
(1) 構建FP樹
(2) 從FP樹中挖掘頻繁項集

FP-growth算法的工作流程如下。首先構建FP樹,然後利用它來挖掘頻繁項集。爲構建FP樹,需要對原始數據集掃描兩遍。1.第一遍對所有元素項的出現次數進行計數。記住第11章中給出的Apriori原理,即如果某元素是不頻繁的,那麼包含該元素的超集也是不頻繁的,所以就不需要考慮這些超集。2.數據庫的第一遍掃描用來統計出現的頻率,而第二遍掃描中只考慮那些頻繁元素

2.創建並構建FP樹

  FP-growth算法將數據存儲在一種稱爲FP樹的緊湊數據結構中。FP代表頻繁模式。一棵FP樹看上去與計算機科學中的其他樹結構類似,但是它通過鏈接(link)來連接相似元素,被連起來的元素項可以看成一個鏈表。
  在創建真正的頻繁集FP樹之前,需要對數據進行過濾(不符合頻繁要求)和排序(按照頻繁度排序)。利用頭指針表,可以快速訪問FP樹中一個給定類型的所有元素。
  這裏寫圖片描述

  這裏使用一個字典作爲數據結構,來保存頭指針表。除了存放指針外,頭指針表還可以用來保存FP樹中每類元素的總數。
  1.第一次遍歷數據集會獲得每個元素項的出現頻率。接下來,去掉不滿足最小支持度的元素項。2.再下一步構建FP樹。在構建時,讀入每個項集並將其添加到一條已經存在的路徑中。如果該路徑不存在,則創建一條新路徑。每個事務就是一個無序集合。假設有集合{z,x,y}和{y,z,r} ,那麼在FP 樹中 , 相同項會只表示一次。爲了解決此問題,在將集合添加到樹之前,需要對每個集合進行排序。排序基於元素項的絕對出現頻率來進行。使用圖12-2中的頭指針節點值,對錶12-1中數據進行過濾、重排序。過濾、排序後的事務依次添加到樹中,如果樹中巳存在現有元素,則增加現有元素的值;如果現有元素不存在,則向樹添加一個分枝。

3. 從一棵 FP 樹中挖掘頻繁項集

從FP樹中抽取頻繁項集的三個基本步驟如下:
(1) 從FP樹中獲得條件模式基;
(2) 利用條件模式基,構建一個條件FP樹
(3) 迭代重複步驟(1)步驟(2),直到樹包含一個元素項爲止。

條件模式基是以所查找元素項爲結尾的路徑集合。
每一條路徑其實都是一條前綴路徑(prefix path)。簡而言之,一條前綴路徑是介於所查找元素項與樹根節點之間的所有內容。
對於每一個頻繁項都要創建一棵條件FP樹,使用條件模式基作爲輸入數據,用相同的建樹代碼構建條件樹,之後遞歸地發現頻繁項、發現條件模式基,並且繼續構造條件樹,直到條件樹中沒有元素。

4.總結

Apriori算法產生候選項集,然後掃描數據集來檢查它們是否頻繁。由於只對數據集掃描兩次,因此FP-growth算法執行更快。
在FP-growth算法中,數據集存儲在一個稱爲FP樹的結構中。FP樹構建完成後,可以通過查找元素項的條件基及構建條件FP樹來發現頻繁項集。該過程不斷以更多元素作爲條件重複進行,直到FP樹只包含一個元素爲止。
可以使用FP-growth算法在多種文本文檔中查找頻繁單詞。

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