作為無監督領域(unsupervised)乙個太過famous的演算法了,聚類(clustering)就是對大量未知標註的資料集,按照資料的內在相似性將資料集劃分為多個類別,使類別內的資料相似度較大而類別間的資料相似度較小. 然而,裡面仍然有很多需要注意的地方,對於聚類本身,目前也有很多改進版本了,所以還是需要總結一下的。
各種相似度的度量方式及其相關性見我的這篇部落格。
這個演算法大家都熟,跟knn是兄弟,簡單實用易操作,它也是其他一些聚類演算法的鼻祖。
具體的步驟為:
對於輸入樣本d=
x1,x
2,x3
,...
,xm :
選擇初始的k個class center μ1
,μ2,
...,μk;
對於每個樣本xi
,將其標記為距離類別中心最近的類別,即: yi
=arg
min1
≤j≤k
||xi
−μj|
| ;
將每個類別中心更新為隸屬該類別的所有樣本的均值: μj
=1|c
j|∑i
∈cjx
i ;
4.重複上述兩步,直至演算法收斂。
收斂條件為:迭代次數/簇中心變化率/最小平方誤差mse(minimum squared error) e=
∑ki=
1∑x∈
ci||
x−μi
||22
根據先驗經驗:如果我們事先已經知道類的類的個數,直接設定即可。
增加交叉驗證;
k-means對初始值敏感,有可能會陷入區域性最優解,可以優化如下:
1. 先隨機給定1個點,然後計算所有點到這個樣本點的距離,距離越大的樣本被選中做第二個中心點的概率大,距離越小的樣本被選中的概率小;
2. 這樣便有了2個簇類中心點。然後計算所有樣本到這兩個中心點的距離,選擇其他樣本點到這兩個樣本點中較近的距離作為衡量標準。距離越大被選中的概率越大;
3. 這樣便有了3個簇類中心點。做法依然同上,知道選出k個簇類中心。
(這樣做並不能完全使所有所有的中心店剛好取在不同的簇類中,但是可以一定程度上避免很多樣本點取自同乙個簇。而在實踐中,為了計算方便,可以直接按照距離來計算 —— 隨機選擇乙個點,然後選其他中心點時如果選中的點距離該樣本點的距離小於某個閾值,則放棄。)
k-means是乙個解決聚類問題的經典演算法,簡單有效,但不太適合於發現非凸形狀的簇或者大小差別很大的簇,對雜訊和孤立點比較敏感。層次聚類是對給定資料集進行層次的分解,直到滿足一定的條件。
聚類過程如圖所示:
,給出以下概念:
演算法流程:
1. 如果乙個點p的
ϵ -鄰域包含多於m個物件,則建立乙個p作為核心物件的新簇;
2. 尋找並合併核心物件直接密度可達的物件;
3. 沒有新點可以更新簇時,演算法結束。
譜聚類是一種基於圖論的聚類方法,通過對樣本資料的拉普拉斯矩陣的特徵向量進行聚類從而達到對樣本資料聚類的目的。
假設給定一組資料x1
,x2,
...,
xn,記任意兩點之間的相似度為si
j=,x
j>
,形成相似度圖(similarity graph):
g=e>
,如果si
j 大於一定的閾值,則兩點是相連的,無向圖中這兩點之間的權值記作si
j ;
下面用相似度圖來解決樣本資料的聚類問題:找到乙個圖的劃分,形成若干個組,使得不同組之間有較低的權值,組內有較高的權值。
頂點的度di形成度矩陣d(是乙個對角陣):di
=∑nj
=1wi
j
未正則的拉普拉斯矩陣:l = d - w
正則的拉普拉斯矩陣:
輸入:n個點pi
,簇的數
目為k
1. 計算n * n的相似度矩陣w和度矩陣d;
2. 計算拉普拉斯矩陣l = d - w;
3. 計算l的前k個特徵向量u1
,u2,
...,
uk;
4. 將k個列向量u1
,u2,
...,
uk組成矩陣u,
u∈rn
∗k;
5. 對於i=
1,2,
...,
n ,令yi
∈rk 是u的第i行的向量;
6. 使用k-meas演算法將點(y
i)i=
1,2,
..,n
聚類成簇c1
,c2,
...,
ck;
7. 輸出簇a1
,a2,
...,
ak,其中,ai
= 譜聚類演算法有點像降維演算法哦。
可以使用正則化的拉普拉斯矩陣代替演算法中未正則過的。
聚類演算法 近鄰聚類演算法
time is always too short for those who need it,but for those who love,it lasts forever.dracula untold 近鄰聚類法同樣是一種基於距離閾值的聚類演算法。coding utf 8 近鄰聚類演算法的pyth...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...
聚類演算法 什麼是聚類
聚類分析或聚類演算法就是通過一些方法或手段使資料集集聚成不同的類別,或者叫 簇。簇內部每乙個單位都是相似的。簇與簇之間都是不相似的。但是聚類其實是一種思想,它不是一種具體的方法。這裡千萬不要搞混。但是可以實現聚類的演算法有很多種。我們通常就使用這些演算法來實現聚類的。比如 k means就是最為經典...