摘要:前文數據挖掘與機器學習技術入門實戰與你們分享了分類算法,在本文中將爲你們介紹聚類算法和關聯分析問題。分類算法與聚類到底有何區別?聚類方法應在怎樣的場景下使用?如何使用關聯分析算法解決個性化推薦問題?本文就爲你們揭曉答案。git
本次直播視頻精彩回顧,戳這裏!github
演講嘉賓簡介:
韋瑋,企業家,資深IT領域專家/講師/做家,暢銷書《精通Python網絡爬蟲》做者,阿里雲社區技術專家。算法
如下內容根據演講嘉賓視頻分享以及PPT整理而成。網絡
本文將圍繞一下幾個方面進行介紹:less
聚類問題主要用於解決沒有明確分類映射關係的物品歸類問題,即無監督學習。分類算法必須須要訓練數據,訓練數據包含物品的特徵和類別(label, 也能夠被稱做標籤),這至關於對這些數據創建了映射規則,這種映射規則能夠經過機器學習相應的算法來創建,當須要對新的數據進行分類時,就能夠直接調用模型,對數據進行相應的處理來實現分類。那麼當沒有歷史數據的時候要對現存的物品進行歸類,就須要使用聚類算法解決。好比,聚類算法能夠實現公司客戶價值自動劃分,網頁自動歸類等。機器學習
K-Means算法是一種經典的聚類算法,也稱做K均值聚類算法,先爲你們介紹K-Means算法的原理。
假設創建一個座標系,這個座標系的橫座標是價格,縱座標是評論。而後根據每一個物品的這兩項特徵將物品放置在該座標系中,那麼如何將這些物品劃分爲k類,此處k爲自定義。例如,能夠定義k爲2,即將全部物品劃分爲兩類。首先,隨機選擇兩類的中心點AB,這兩個點稱爲聚類中心。初始的聚類中心是隨機選擇,很大機率上並非真正的類中心,所以這兩點會在後續的聚類過程當中不斷調整,直至趨於真正的聚類中心。其次,分別計算各個物品距兩個聚類中心AB的距離,將其劃分至距離較近的聚類中心點一類。例如,點1距A的距離小於點1距B的距離,所以將點1劃分至A類。如此,初步將全部點劃分爲兩類,接着須要對每類的聚類中心進行調整。這個階段,須要對每一類計算重心位置,將這類的聚類中心移動到該重心位置,獲得兩類的新聚類中心A’ B’。而後再一次計算各個物品距兩個新的聚類中心A’ B’的距離,進行距離比較,獲得新的聚類結果。按照這樣的方法不斷迭代,不斷的向正確結果靠攏,最終聚類過程會收斂,獲得的聚類中心再也不變化,便已經獲得最終的聚類結果,也就是將物品分紅了兩類。
按照上述過程,K-Means的步驟大體以下:1. 初始化聚類中心(隨機選擇);2. 計算樣本點到各聚類中心的距離;3. 將樣本點歸爲距離較近的聚類中心一類;4. 移動聚類中心到類別的重心位置,調整聚類中心; 5. 重複234步驟,直到聚類中心再也不改變。 ide
那麼K-Means算法如何實現?在Python中實現K-Means算法實際上是相對容易的,首先須要導入K-Means模型,導入模型後能夠設置聚類的個數,而後直接使用fit_predict來實現聚類過程,具體代碼以下:性能
from sklearn.cluster import KMeans kms=KMeans(n_clusters=3) y=kms.fit_predict(x)
接下來就使用K-Means算法來解決公司客戶價值自動劃分的問題。學習
開始聚類時,公司的客戶只是具備某些特徵,沒有具體的分類標準。那麼能夠直接根據特徵進行聚類,得出聚類結果後再分析研究這些類別的真實含義。
假設初始時存在部分客戶的數據以下,包含客戶年齡,平均每次消費金額,平均消費週期等數據。阿里雲
現須要對上述客戶進行聚類,以幫助公司快速區別出普通客戶,VIP客戶和超級VIP客戶。在有其餘歷史數據的狀況下,能夠將這些用戶的特徵和客戶類型創建起映射關係,經過機器學習訓練即可以獲得未知的客戶類型。但在沒有歷史數據的狀況下,這就是典型的聚類問題。具體代碼以下:
#經過聚類分析客戶價值 import pandas as pda import numpy as npy import matplotlib.pylab as pyl fname="D:\\個人教學\\Python\\阿里雲系列直播\\第4次直播代碼\\company.csv" dataf=pda.read_csv(fname,encoding="gbk") x=dataf.as_matrix() from sklearn.cluster import KMeans kms=KMeans(n_clusters=3) y=kms.fit_predict(x) print(y) #年齡-消費金額圖,消費時間-消費金額圖,年齡-消費時間圖 for i in range(0,len(y)): if(y[i]==0): print(str(i)+"大衆客戶") pyl.subplot(2,3,1) #年齡-消費金額圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"*r") pyl.subplot(2,3,2) #消費時間-消費金額圖 pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"*r") pyl.subplot(2,3,3) #年齡-消費時間圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"*r") elif(y[i]==1): print(str(i)+"超級VIP客戶") pyl.subplot(2,3,1) #年齡-消費金額圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"sy") pyl.subplot(2,3,2) #消費時間-消費金額圖 pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"sy") pyl.subplot(2,3,3) #年齡-消費時間圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"sy") elif(y[i]==2): print(str(i)+"VIP客戶") pyl.subplot(2,3,1) #年齡-消費金額圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"pb") pyl.subplot(2,3,2) #消費時間-消費金額圖 pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"pb") pyl.subplot(2,3,3) #年齡-消費時間圖 pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"pb") pyl.show()
首先加載客戶數據文件 company.csv,從中讀取客戶數據,而後導入K-Means模型,這裏設置聚類成3類,而後將聚類結果經過圖像來分析,但當聚類有多個特徵值時,繪圖分析會有必定的難度。例如在本例中有3個特徵值,在做圖時就須要將特徵值兩兩組合,對年齡-消費金額圖、消費週期-消費金額圖、年齡-消費週期分別進行分析。在做圖以前,能夠將毫無關聯的特徵值組合刪除,例如這裏能夠將年齡-消費週期圖剔除。若沒法判斷,也能夠所有繪製再根據圖像分析。在繪圖時,將預測出的類別做爲客戶分類標準,例如若是某兩個客戶被分到標籤爲0這一類,此時並不瞭解預測出的標籤0類有何實際意義,但能夠認爲這兩個客戶是一類。接下來在每一個類別中分別繪製上述三種圖像,這裏將同一類別中的圖像採用一種顏色以做區分。作出圖像結果以下:
得出圖像後,由於分佈雜亂的圖像代表這兩個特徵值之間是沒有實際關聯的,能夠將其篩去,留下井井有條的圖像分析。觀察圖像能夠發現年齡-消費週期圖很是雜亂,和上述猜測相同,能夠刪去。而年齡-消費金額圖中,藍色點客戶顯示年齡相對較小,消費金額也較少,偏向於普通用戶,紅色點客戶年齡不定,但消費金額廣泛較高,偏向於VIP客戶,而綠色點客戶年齡較大,消費很是高,屬於超級VIP客戶。若是圖一中的類別分析可靠,那麼能夠將這些類別應用於圖二中繼續驗證。在圖二消費週期-消費金額圖中,藍色點客戶消費週期不定,消費金額不高,符合普通客戶的特徵,紅色點客戶消費週期偏短,消費金額中等,屬於VIP客戶,而綠色點客戶消費週期短,消費金額高,符合超級VIP客戶的特徵。分析得出用戶類別後,即可以對全部公司客戶進行自動劃分,基於劃分的結果,能夠爲超級VIP客戶提供一些福利,如生日祝福等,增強營銷的粘性。
關聯分析是一種用於分析物體之間關聯程度的一種方式,關聯分析常見的應用場景有:分析物品之間的關聯程度、個性化推薦、超市貨品擺放調整等。例如在超市貨品擺放時,能夠根據用戶購買商品時的記錄,計算商品之間的關聯程度,將關聯程度高的商品擺放在一塊兒。接下來爲你們介紹兩種關聯分析算法。
Apriori算法是一種基礎的關聯分析算法,但效率較低,不建議用於商業場景。Apriori算法的原理以下:
假設現在有一批商品的購買記錄,ABCDE分別表明不一樣的商品,每一行表明某一用戶的商品購買記錄。首先對各商品進行依次掃描,例如商品A在全部4條商品記錄中出現3次,那麼商品A的支持度即爲3/4,計算出的支持度代表了該產品在全部購買記錄中出現的機率大小,顯然機率越大,支持度越高。同理,計算出BCDE的支持度分別爲3/四、3/四、3/四、1/4。接下來須要設置閾值來篩選出關聯度較高的商品數據,這裏假設取1/2,那麼就先將E篩除,留下商品ABCD,此時便產生頻繁一項集{{A},{B},{C},{D}}。而後將頻繁一項集中的集合兩兩組合,獲得候選項集{{AB},{AC},{AD},{BC},{BD},{CD}},計算每一個項集的支持度。例如項集AB在全部4條商品記錄中出現2次,那麼AB的支持度即爲2/4。同理得出AC,AD,BC,BD,CD的支持度分別爲3/4,2/4,2/4,2/4,3/4,2/4。在閾值爲1/2的狀況下只留下AC和BD。如此即可以繼續生成候選集ABCD,支持度爲2/4,能夠篩去。獲得AC和BD的關聯程度最高,這意味着,若是某一客戶購買了商品A,那麼給該客戶推薦商品C成功率更大,相似的,若是客戶購買了商品B,那麼商品D可能也更受該用戶青睞。
Apriori算法爲何效率較低呢?從上述過程能夠看到每一次計算候選集的支持度時都須要返回至歷史記錄中進行掃描,所以處理複雜,耗時嚴重。
相比Apriori算法,FP-Growth算法是一種效率比較高的關聯分析算法,更適用於商業應用。下面爲你們介紹FP-Growth算法的原理。
假設仍然取上述例子,ABCDE分別表明不一樣的商品,如今有如圖所示的產品購買歷史記錄,每一行表明某一用戶的商品購買記錄,如今來分析各商品間的關聯關係。
首先仍然須要進行第一次掃描,獲得商品ABCDE出現的次數,也就是支持度,分別爲5,3,5,7,2。而後篩除支持度較小的商品,這裏篩除商品E。接下來按次數大小進行排序建立項頭表(此處項頭表中的順序也能夠爲DCAB),爲建立FP樹作準備。在FP樹中,公用元素要儘可能多,以加快後續查找時的檢索速度。FP樹的根節點能夠設置爲null,將項頭表中的數據按照順序添加至FP樹中。
接下來只須要再遍歷一次購買記錄,將全部記錄插入到初始的FP樹中便可。但在插入以前,須要將每一條記錄按照項頭表中的大小順序進行重排。例如第一條記錄ABCD,改成DACB或者DCAB(根據初始的項頭表而定),第四條記錄BCD,改成DCB。歷史記錄排序完成後,將每一條記錄從根節點開始插入至樹中。例如,第一條記錄DACB,與初始FP樹公用,所以不用插入。第二條記錄AC,一樣從根節點開始,第一個節點和初始根節點不共用,所以創建新的節點,插入記錄AC,且出現次數都爲1。第三條記錄DCB,第一個節點D是能夠公用的,後續節點CB不共用,所以在節點D下創建新節點CB,此時CB的次數也都爲1。第七條記錄DC插入時,已經有公用的節點了,就直接將除初始節點以外的其餘節點支持度加1便可,這裏D的支持度不變,C的支持度從1變成2。那麼這裏只須要進行一次掃描,就能夠將全部歷史記錄插入到創建的FP樹中。FP樹創建完成後即可以進行頻繁項集的挖掘。
在頻繁項集挖掘時,要按照項頭表中支持度從小到大的順序進行,如此越向後挖掘,公用節點越多。所以首先對B點進行挖掘,找出全部以B節點結尾的分支,將這些分支組成的樹取出,找出其中的父節點D,A,C,刪除支持度較小的C,獲得B的條件模式基D:3和A:2。將B與條件模式基中的節點進行組合,獲得頻繁項集{DB},{AB},{DAB},取每一個項集中支持度較小的條件模式基支持度做爲該項集的支持度,如DB的支持度取D的支持度3,AB的支持度取A的支持度2,,DAB的支持度取A的支持度2。
同理,對C進行挖掘,取出含節點C的部分樹,獲得C的條件模式基爲D:4和A:2。以及頻繁項集爲{DC}4,{AC}2,{DAC}2。
以及對A進行挖掘獲得的條件模式基爲D:4,頻繁項集爲{DA}4。支持度最高的D點不須要進行挖掘。
最後將全部頻繁項集合並,獲得最終各點的頻繁項集{DC}4, {DA}4, {DB}3, {AC}2, {DAC}2, {AB}2, {DAB}2。如此即可判斷出D與C和A的關聯度最高,和B關聯度也較高。若用戶購買了商品D,能夠向其推薦商品C和A,或者商品B。
在FP-Growth算法中,只須要進行兩次掃描即可完成關聯度分析,因此相比Apriori算法性能更佳。
先用Apriori算法來解決一個課程的個性化推薦問題。假設如今有以下所示相關數據,每一行表明每一位客戶購買的書籍信息,須要分析出課程之間的關聯性,將關聯度較高的課程推薦給相關的用戶使購買轉化率最高。
首先使用Apriori算法來解決這個推薦問題。在實現過程當中,值得注意的是須要將輸入數據進行轉化,將課程記錄轉化爲矩陣形式,以下圖所示,具體應用代碼以下:
from apriori import * import pandas as pda filename="D:/Python35/data/lesson_buy.xls" dframe=pda.read_excel(filename,header=None) change=lambda x:pda.Series(1,index=x[pda.notnull(x)]) mapok=map(change,dframe.as_matrix()) data=pda.DataFrame(list(mapok)).fillna(0) #設置置信度閾值和支持度閾值 surpport=0.2 cfd=0.3 print(find_rule(data,surpport,cfd))
獲得關聯結果以下,其中support爲支持度,confidence爲置信度。在本例中,若客戶購買機器學習,那麼便有較大的機率會購買Python爬蟲,這具備必定的實際意義。Apriori算法的實現代碼在網上有開源資源,如有須要可自行閱讀。
如今使用FP-Growth算法解決超市貨品的推薦問題。假設如今有以下所示相關二維列表數據,分析這些商品間的關聯度。
具體實現代碼來源於github,此處也附上:
import FP_Grow_tree sample=[ ['milk','eggs','bread','chips'], ['eggs','popcorn','chips','beer'], ['eggs','bread','chips'], ['milk','eggs','bread','popcorn','chips','beer'], ['milk','bread','beer'], ['eggs','bread','beer'], ['milk','bread','chips'], ['milk','eggs','bread','butter','chips'], ['milk','eggs','butter','chips'] ] sample1=[ [u'牛奶',u'雞蛋',u'麪包',u'薯片'], [u'雞蛋',u'爆米花',u'薯片',u'啤酒'], [u'雞蛋',u'麪包',u'薯片'], [u'牛奶',u'雞蛋',u'麪包',u'爆米花',u'薯片',u'啤酒'], [u'牛奶',u'麪包',u'啤酒'], [u'雞蛋',u'麪包',u'啤酒'], [u'牛奶',u'麪包',u'薯片'], [u'牛奶',u'雞蛋',u'麪包',u'黃油',u'薯片'], [u'牛奶',u'雞蛋',u'黃油',u'薯片'] ] #print(sample1) ##參數說明 sample爲事務數據集 []爲遞歸過程當中的基,support爲最小支持度 support=3 ff=FP_Grow_tree.FP_Grow_tree(sample1,[],support) ##打印頻繁集 ff.printfrequent()
關聯結果以下所示。相似的,這種關聯度分析可使用於超市商品的貨架擺放等問題,增長用戶的購買轉化率。
八. 做業練習:使用關聯分析算法解決超市商品貨品擺放調整問題
假若有一個超市的商品購買記錄數據集,須要分析各商品之間的關聯程度以調整貨品擺放。數據集格式以下所示,ListNoPosIDCashierID爲不一樣用戶的購買記錄ID,各商品下F表示未購買,T表示購買。請分別使用Apriori算法和FP-Growth算法實現關聯分析,並比較兩種算法的耗時。這裏也提供一份一位同窗所寫的優秀做業代碼供你們參考,具體數據集和參考代碼點擊閱讀原文下載。
詳情請閱讀原文