一、聚類算法簡介
聚類是無監督學習的典型算法,不需要標記結果。試圖探索和發現一定的模式,用於發現共同的群體,按照內在相似性將數據划分為多個類別使得內內相似性大,內間相似性小。有時候作為監督學習中稀疏特征的預處理(類似於降維,變成K類后,假設有6類,則每一行都可以表示為類似於000100、010000)。有時候可以作為異常值檢測(反欺詐中有用)。
應用場景:新聞聚類、用戶購買模式(交叉銷售)、圖像與基因技術
相似度與距離:這個概念是聚類算法中必須明白的,簡單來說就是聚類就是將相似的樣本聚到一起,而相似度用距離來定義,聚類是希望組內的樣本相似度高,組間的樣本相似度低,這樣樣本就能聚成類了。
1.Minkovski距離,當p=2時,就是歐式距離: 相似性就被定義為了d的倒數,1/d ;當P=1時就說城市距離(曼哈頓距離):下圖中直角的距離,直接同維度相減后加總
2.余弦距離 夾角的距離cosθ = (at* b)/(|a|*|b|) 余弦距離比較難收斂,優勢是不受原來樣本線性變換影響
3. 皮爾斯相關系數 從概率論角度得到的距離 當x和y的均值為0時,皮爾森相關系數就等於余弦距離
4. KL散度(交叉熵) 衡量兩個分布之間的差異,不是傳統意義上的距離,其中p(x)是真實樣本分布,Q(x)是數據的理論分布,或者說是一種更簡單的分布。有時候p(x)的分布很難寫出,可以通過求KL散度最小而求出Q(X)。
http://www.cnblogs.com/charlotte77/p/5392052.html
聚類算法分類:基於位置的聚類(kmeans\kmodes\kmedians)層次聚類(agglomerative\birch)基於密度的聚類(DBSCAN)基於模型的聚類(GMM\基於神經網絡的算法)
二、Kmeans算法
1.確定聚類個數K
2.選定K個D維向量作為初始類中心
3.對每個樣本計算與聚類中心的距離,選擇最近的作為該樣本所屬的類
4.在同一類內部,重新計算聚類中心(幾何重心) 不斷迭代,直到收斂:
(損失函數為此就是Kmeans算法(其實是默認了我們樣布服從均值為μ,方差為某固定值的K個高斯分布,混合高斯分布),如果(x-μ)不是平方,而只是絕對值那就是Kmedian算法,混合拉普拉斯分布)每個樣本到聚類中心的距離之和或平方和不再有很大變化。對損失函數求導,
,可以看到其實我們更新聚類中心的時候,就是按照梯度的方向更新的。由於損失函數有局部極小值點,所以它是初值敏感的,取不同的初值可能落在不同的極小值點。
輪廓系數(silhouetee)可以對聚類結果有效性進行驗證。python中有該方法,metrics.silhouetee_score。越接近1聚的越好,越接近-1聚的越不好。適用於球形聚類的情況。
缺點:1.對初始聚類中心敏感,緩解方案是多初始化幾遍,選取損失函數小的。2.必須提前指定K值(指定的不好可能得到局部最優解),緩解方法,多選取幾個K值,grid search選取幾個指標評價效果情況3.屬於硬聚類,每個樣本點只能屬於一類 4.對異常值免疫能力差,可以通過一些調整(不取均值點,取均值最近的樣本點)5.對團狀數據點區分度好,對於帶狀不好(譜聚類或特征映射)。盡管它有這么多缺點,但是它仍然應用廣泛,因為它速度快,並且可以並行化處理。
優點:速度快,適合發現球形聚類,可發現離群點
缺失值問題:離散的特征:將缺失的作為單獨一類,90%缺失去掉。連續的特征:其他變量對這個變量回歸,做填補;樣本平均值填補;中位數填補。
對於初始點選擇的問題,有升級的算法Kmeans++,每次選取新的中心點時,有權重的選取(權重為距離上個中心店的距離),
cls = KMeans(n_clusters=4, init='k-means++',random_state=0)不給出隨機種子 每次聚類結果會不一樣
另外,想要收斂速度進一步加快,可以使用Mini-BatchKmeans,也就是求梯度的時候用的是隨機梯度下降的方法,而不是批量梯度下降。sklearn.cluster.
MiniBatchKMeans
三、層次聚類算法
也稱為凝聚的聚類算法,最后可以生成一個聚類的圖,但Python中不容易生成這種圖,一般直接在界面軟件中生成。其實更像是一種策略算法,畫出來有點類似於樹模型的感覺。
有自頂而下和自底向上兩種,只是相反的過程而已,下面講自頂而下的思路。
1.計算所有個體和個體之間的距離,找到離得最近的兩個樣本聚成一類。
2.將上面的小群體看做一個新的個體,再與剩下的個體,計算所有個體與個體之間距離,找離得最近的兩個個體聚成一類,依次類推。
3.直到最終聚成一類。
群體間的距離怎么計算呢?(下圖用的是重心法,還有ward法)
優點:不需要確定K值,可根據你的主觀划分,決定分成幾類。
缺點:雖然解決了層次聚類中Kmeans的問題,但計算量特別大。與Kmeans相比兩者的區別,除了計算速度,還有kmeans只產出一個聚類結果和層次聚類可根據你的聚類程度不同有不同的結果。
層次聚類中還有一種是brich算法,brich算法第一步是通過掃描數據,建立CF樹(CF樹中包含簇類中點的個數n,n個點的線性組合LS=,數據點的平方和SS;而簇里面最開始只有一個數據點,然后不斷往里面加,直到超過閾值);第二步是采用某個算法對CF樹的葉節點進行聚類。優點就是一次掃描就行進行比較好的聚類。缺點是也要求是球形聚類,因為CF樹存儲的都是半徑類的數據,都是球形才適合。
四、DBSCAN
Dbscan是基於密度的算法,之前的一些算法都是考慮距離,而DBscan是考慮的密度,只要樣本點的密度大於某閾值,則將該樣本添加到最近的簇中(密度可達的簇)
核心點:在半徑eps內含有超過Minpts數目的點,則該點為核心點。邊界點:在半徑eps內含有小於Minpts數目的點但是在核心點的鄰居。 核心點1連接邊界點2,邊界點2又連接核心點2,則核心點1和邊界點2密度可達。
噪音點:任何不是核心點或是邊際點的點。密度:在半徑eps內點的數目。
DBscan過程:
簇:密度相連點的最大集合
算法的關鍵要素:距離的度量有歐幾里德距離,切比雪夫距離等,最近鄰搜索算法有Kd_tree, ball_tree
Python中可調的參數:eps和m, eps為半徑,m為要求的半徑內點的個數即密度,m越大聚出的類越多,因為即要求成某個類的密度要比較高,一旦中間比較稀疏的就不算一個類了;eps越大,類的個數越少。
優點:相對抗噪音(可發現離群點),可以發現任意形狀的樣本。
缺點:但計算密度單元的計算復雜度大,但計算密度單元的計算復雜度;不能很好反應高維數據,高維數據不好定義密度
五、GMM(混合高斯模型)
屬於軟聚類(每個樣本可以屬於多個類,有概率分布)GMM認為隱含的類別標簽z(i),服從多項分布,並且認為給定z(i)后,樣本x(i)滿足多值高斯分布,
,由此可以得到聯合分布
。
GMM是個雞生蛋、蛋生雞的過程,與KMEANS特別像,其估計應用EM算法。
1.首先假設知道GMM參數,均值、協方差矩陣、混合系數,基於這些參數算出樣本屬於某一類的概率(后驗概率)wji:
2.然后根據該概率,重新計算GMM的各參數。此參數求解利用了最大似然估計。
3.一直迭代,直到參數穩定。
EM(Expectation Maximization)算法是,假設我們想估計知道A和B兩個參數,在開始狀態下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反過來知道了B也就得到了A。可以考慮首先賦予A某種初值,以此得到B的估計值,然后從B的當前值出發,重新估計A的取值,這個過程一直持續到收斂為止。
混合高斯模型,實質上就是一個類別一個模型。先從k個類別中按多項式分布抽取一個z(i),然后根據z(i)所對應的k個多值高斯分布中的一個生成樣本x(i),整個過程稱作混合高斯模型。
GMM優點:可理解、速度快
劣勢:初始化敏感、需要手工指定k(高斯分布)的個數、不適合非凸分布數據集(基於密度的聚類和核方法可以處理)
Kmeans可以看做混合高斯聚類在混合成分方差相等、且每個樣本派給一個混合成分時的特例。
六、譜聚類
首先什么是譜呢?比如矩陣A,它的所有特征值的全體就統稱為A的譜,AU=λU,λ1...λn。如果下次看到跟譜相關的算法,多半就是跟特征值相關的算法了。什么是譜半徑呢?就是最大的那個特征值。
譜聚類就是基於圖論的聚類方法,通過對樣本數據的拉普拉斯矩陣的特征向量進行聚類,從而達到對樣本數據的聚類。
1. 第i個樣本和第j個樣本度量相似 高斯相似度,其中delta是超參數,svm里面也用到過這個核函數
2. 形成相似度矩陣W=(Sij)n*n,對稱矩陣,其中sii本來應該等於1,但為了方便計算都寫成0,所以相似度矩陣就變長了主對角線上都為0的對稱陣。
3. 計算第i個樣本到其他所有樣本的相似度的和di = si1+Si2+....Sin(這里關於Si的相加,有些比如要聚成K類的就只會使用前K個si相加,或者設定一個閾值,小於閾值的si都舍去),在圖論中,di叫做度,可以理解為連接邊的權值。將所有點的度di,構成度矩陣D(對角陣)
4. 形成拉普拉斯矩陣L=D-W,L是對稱半正定矩陣,最小特征值是0,相應的特征向量是全1向量。把L的特征值從小到大排列,λ1...λn,對應特征向量u1 u2...un,如果我們要求聚成K類,我們就取前K個特征值對應的特征向量,形成矩陣Un*k,這樣我們認為對應第一個樣本的特征就是u11,u12..u1k,第二個樣本的特征就是u21,u22...u2k,第n個樣本的特征就是un1,un2...unn,對這n個樣本做K均值,最后對這n個樣本的聚類結果是什么,我們原始的聚類結果就是什么。
優點:可以發現非球形的樣本
缺點:也要事先給定K值
七、部分應用經驗
可以先對樣本進行基於其分布的抽樣,然后在小樣本范圍內進行層次聚類,然后用層次聚類得出的K值,應用於整個樣本進行Kmeans聚類。
聚類分析結果評價:
當知道實際分類時:Homogeneity(均一性), completeness(完整性) and V-measure(同時考慮均一性和完整性)
不知道實際分類時:輪廓系數(求出每個樣本的Si,再取平均值就是整體的輪廓系數),Calinski-Harabaz Index
http://blog.csdn.net/sinat_26917383/article/details/70577710
建模步驟:1.變量預處理:缺失值、異常值(用p1或P99替代)、分類變量變成數值型、分類變量轉為啞變量、分類變量過多 這里涉及一系列recoding的過程。2.變量標准化:變量的量綱不一樣會引起計算距離的差距。3.變量的篩選:商業意義、多個維度、變量間相關性。4.確定分類個數:區分性足夠好,又不能太細
在聚類之前往往先做主成分分析,或者變量的聚類。
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
八、無監督深度學習
用AE的輸出或 VAE的中間狀態作為Kmeans的輸入,結合起來可以提高Kmeans的聚類效果。因為數據壓縮后距離質心可能就更近了,這樣就更加容易分類了。
GAN。VAE沒有GAN的對抗的。依賴於先驗知識。
AE(autoencoder)