1. 程式人生 > >聚類算法學習-kmeans,kmedoids,GMM

聚類算法學習-kmeans,kmedoids,GMM

org 文本分類 文本 sof cnblogs 還會在 targe soft zip

GMM參考這篇文章:Link

簡單地說,k-means 的結果是每個數據點被 assign 到其中某一個 cluster 了,而 GMM 則給出這些數據點被 assign 到每個 cluster 的概率,又稱作 soft assignment

通常單個點的概率都很小,許多很小的數字相乘起來在計算機裏很容易造成浮點數下溢,因此我們通常會對其取對數,把乘積變成加和 技術分享,得到 log-likelihood function 。

因此也有和 K-means 同樣的問題──並不能保證總是能取到全局最優,如果運氣比較差,取到不好的初始值,就有可能得到很差的結果。

對於 K-means 的情況,我們通常是重復一定次數然後取最好的結果

,不過 GMM 每一次叠代的計算量比 K-means 要大許多,一個更流行的做法是先用 K-means (已經重復並取最優值了)得到一個粗略的結果,然後將其作為初值(只要將 K-means 所得的 centroids 傳入 gmm 函數即可),再用 GMM 進行細致叠代。

K-medoids參考這篇文章:Link

k-means 和 k-medoids 之間的差異就類似於一個數據樣本的均值 (mean) 和中位數 (median) 之間的差異:前者的取值範圍可以是連續空間中的任意值,而後者只能在給樣本給定的那些點裏面選。

一個最直接的理由就是 k-means 對數據的要求太高了,它使用歐氏距離描述數據點之間的差異 (dissimilarity) ,從而可以直接通過求均值來計算中心點。這要求數據點處在一個歐氏空間之中。

然而並不是所有的數據都能滿足這樣的要求,對於數值類型的特征,比如身高,可以很自然地用這樣的方式來處理,但是類別 (categorical) 類型的特征就不行了。舉一個簡單的例子,如果我現在要對犬進行聚類,並且希望直接在所有犬組成的空間中進行,k-means 就無能為力了,因為歐氏距離 技術分享 在這裏不能用了:一只 Samoyed 減去一只 Rough Collie 然後在平方一下?天知道那是什麽!再加上一只 German Shepherd Dog 然後求一下平均值?根本沒法算,k-means 在這裏寸步難行!

最常見的方式是構造一個 dissimilarity matrix 技術分享 來代表 技術分享,其中的元素 技術分享

表示第 技術分享 只狗和第 技術分享 只狗之間的差異程度,例如,兩只 Samoyed 之間的差異可以設為 0 ,一只 German Shepherd Dog 和一只 Rough Collie 之間的差異是 0.7,和一只 Miniature Schnauzer 之間的差異是 1 ,等等。

除此之外,由於中心點是在已有的數據點裏面選取的,因此相對於 k-means 來說,不容易受到那些由於誤差之類的原因產生的 Outlier 的影響,更加 robust 一些。

就會發現,從 k-means 變到 k-medoids ,時間復雜度陡然增加了許多:在 k-means 中只要求一個平均值 技術分享 即可,而在 k-medoids 中則需要枚舉每個點,並求出它到所有其他點的距離之和,復雜度為 技術分享

同樣也可能陷入局部最優:

技術分享

然後作者用了一個文本分類來結束文章。裏面還提到了一個 N-Gram:

在 N-gram-based text categorization 這篇 paper 中描述了一種計算由不同語言寫成的文檔的相似度的方法。一個(以字符為單位的) N-gram 就相當於長度為 N 的一系列連續子串。例如,由 hello 產生的 3-gram 為:hel、ell 和 llo ,有時候還會在劃分 N-gram 之前在開頭和末尾加上空格(這裏用下劃線表示):_he、hel、ell、llo、lo_ 和 o__ 。按照 Zipf’s law :

The nth most common word in a human language text occurs with a frequency inversely proportional to n.

這裏我們用 N-gram 來代替 word 。這樣,我們從一個文檔中可以得到一個 N-gram 的頻率分布,按照頻率排序一下,只保留頻率最高的前 k 個(比如,300)N-gram,我們把叫做一個“Profile”。正常情況下,某一種語言(至少是西方國家的那些類英語的語言)寫成的文檔,不論主題或長短,通常得出來的 Profile 都差不多,亦即按照出現的頻率排序所得到的各個 N-gram 的序號不會變化太大。這是非常好的一個性質:通常我們只要各個語言選取一篇(比較正常的,也不需要很長)文檔構建出一個 Profile ,在拿到一篇未知文檔的時候,只要和各個 Profile 比較一下,差異最小的那個 Profile 所對應的語言就可以認定是這篇未知文檔的語言了——準確率很高,更可貴的是,所需要的訓練數據非常少而且容易獲得,訓練出來的模型也是非常小的。

聚類算法學習-kmeans,kmedoids,GMM