經典聚類演算法及在網際網路的應用
此處並不會列舉每一種聚類(Clustering)演算法,因為學術界Clustering演算法如果真要細分,還真有很多變種。此處只會介紹幾種在我近幾年網際網路工作生涯中實際碰到的具體問題, 以及如何使用Clustering演算法解決這些問題。
一般來說,我們可以將Clustering認為是將出現的資料進行Data Segmentation,也就是經常說的哲理: 物以類聚。 從機器學習的觀點來看, Clustering算是Unsupervised Learning,或者叫做Learning by Observation,根據觀察到的情況進行Clustering。 因為形成簇的資料都被聚到一起,所以Clustering 方法也可以用來發現噪音或是異常點。
Clustering 演算法大致可以分為以下幾類(參見Data Mining Concepts and Techniques):
- Partitioning Methods:這是一類經典的,最簡單的聚類方式,就是直接按照類內的點距離最近,類間距離足夠遠的原則進行資料Clustering。該類方法比較經典的方法有K-Means 和K-Medoids。下文中會以廣告分段問題來具體介紹K-Means的實現(K-Medoids類似)
- Hierachical Methods:層次Clustering演算法,又大致分為bottom-up和top-down兩種思路,bottom-up為自底向上,逐漸合併離得比較近的類以形成更大的類,top-down為一種divisive的思路,逐漸對離得比較遠的類進行分裂。下文中會以如何合併搜尋引擎中的同意,近義詞詞形成簇的的方式具體介紹bottom-up hierachical methods。
- Density-based Methods:以上兩種方法基本上都是在高維空間中將資料聚成球形的多個類的方法,卻不能處理非球形的聚類,Density-based Methods就是解決非球形資料的聚類方法。
- Model-based Methods:對資料進行建模,之後使用觀察到的資料預估模型引數,比較經典的使用EM方法,先假設資料服從某種分佈(例如k個高斯分佈),並且這k個高斯分佈由一系列隱隨機變數決定。之後在E步預估這些隱隨機變數,而在M步固定這些隱隨機變數後,使用最大似然估計迭代得到最優引數。
文章以下內容將介紹3種聚類方法解決3個問題:
- 使用K-Means方法對廣告受眾網民進行Data Segmentation。
- 使用Bottom Up Hierachical Clustering方法對搜尋引擎query進行聚類以進行流量推薦。
- 使用EM方式尋找資料中的隱藏主體。
使用K-Means方法對廣告受眾網民進行Data Segmentation
K-Means是一種球形的聚類,在二維空間中,類別會被聚成以圓心為中心的圓,三維空間中則會被聚成以球心為中心的球狀簇(當然,這與選擇的相似度度量有關,例如使用cosine計算歸一化後的兩個向量長度,就會變成計算二向量的夾角)
在K-Means演算法執行前,有兩個因素比較重要: 資料預處理和距離度量方法。具體距離度量參見博文相似度度量 ,資料預處理則包括資料歸一化, 去除噪音等操作。
因為K-Means演算法本身較為簡單,此處直接給出Andrew Ng機器學習公開課教案中的虛擬碼:
其中uj為第j個簇的中心點,ci為第i條資料的簇類別。基本步驟就是遍歷資料,每一輪迭代,先計算當前資料與哪個類中心最近,該條資料屬於距離最近的簇,之後根據新計算出來的每條資料的類別,更新類中心。下圖給出在指定資料上給出2個類的4輪迭代情況:
使用distortion function度量分類的好壞情況, distortion 越小越好,當然,一般distortion大小需要和類別 k 的數量間進行權衡。
應用: 雖然k-means堪稱最簡單的演算法,但之前在實習時,在前東家還是用了一把,應用場景是使用MSN使用者的註冊資訊(年齡,喜好,性別),以及MSN使用者在 msn.com上經常訪問的導航類別,搜尋關鍵詞等資料,使用決策樹選出區分度較大的特徵構成特徵向量,使用L1-Norm進行歸一化後,對特徵向量進行Clustering。之後按Clustering向廣告主售賣這些使用者的pv。 該模式的優勢是具有一定的興趣定向作用。
右側即為MSN展示廣告。當然,該方法已經是2007年所使用的方法,現在相信MS已經使用更精準的方法了 。
該過程中嘗試較多的是如何選擇合適的類別數量k值,以及如何初始化初始類中心。當時迫於專案進度,k值最後根據經驗並進行了粗略的搜尋選擇,初始類中心則使用在相同k值得情況下進行多次隨機初始化Clustering
使用Bottom Up Hierachical Clustering方法對搜尋引擎query進行聚類以進行流量推薦
例如在搜尋引擎中, 很多網民的query意圖的比較類似的,對這些query進行聚類,一方面可以使用類內部的詞進行關鍵詞推薦; 另一方面, 如果聚類過程實現自動化, 則也有助於新話題的發現;同時還有助於減少儲存空間等。
例如:
訓龍記國語 訓龍記2 尋龍記 訓龍記博克島的騎手 馴龍記電影
罵人大全 罵人不帶髒字的順口溜 罵人帶髒字越毒越好 罵人髒字的狠話
要設計層次聚類,就需要考慮一下幾個因素及環節:
- 使用何種聚類演算法: top-down 還是bottom-up 還是其他
- clusting的合併策略
- 使用哪些特徵
- 如何度量距離
- 使用何種評估標準對效果進行評估
確定以上5個因素後,聚類演算法也就確定了。
聚類演算法:考慮到實現的複雜度, 一開始我們就確定使用bottom-up的方式作為聚類策略;後續也就沒有嘗試top-down的方式。
clusting的合併策略:
一般有兩類合併策略: 選取最相近的兩個clustering進行合併;求連通分量。 因為尋找相近cluster的方式, 時間複雜度會達到O(n^2), 所以最後決定使用連通分量。
特徵: 我們使用字面特徵及query在session中的共現特徵; 例如, 對字面進行切詞後的term(做適當過濾降維:idf太小則過濾)
距離函式, 嘗試過cosine和jaccard後, 最終使用jaccard作為距離度量。
也可關注微博: weibo.com
或是直接訪問: http://semocean.com