聚類: 數據對象的集合
- 同一簇中的對象彼此相似
- 不同簇中的對象彼此相異
聚類分析: 將數據對象(觀測)的集合劃分成子集過程
聚類是無監督的分類: 沒有預先定 義的類編號
基於劃分方法-k-means
k均值聚類算法
輸入:簇的數目k和包含n個對象的數據庫。
輸出:k個簇,使平方誤差準則最小。
算法步驟:
1.爲每個聚類確定一個初始聚類中心,這樣就有K 個初始聚類中心。
2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類
3.使用每個聚類中的樣本均值作爲新的聚類中心。
4.重複步驟2.3直到聚類中心不再變化。
5.結束,得到K個聚類
僞代碼
創建k個點作爲起始質心(經常隨機選擇)
當任意一個點的簇分配結果發生改變時
對於數據集中的每個數據點
對每個質心
計算質心於數據點之間的距離
將數據點分配到距其最近的簇
對於每個簇,計算簇中所有點的均值並將均值作爲質心
- 優點:容易實現
- 缺點:
K 是事先給定的,這個 K 值的選定是非常難以估計,常採用遺傳算法(GA)進行初始化來改進
存在噪點時,可能收斂到局部最小值
在大規模的數據集上收斂較慢
適用數據類型:數值型數據
k中心點聚類
當存在噪聲和離羣點時
——k-中心點
當n和k的值較大時
——k-均值算法效率要高的多
基於層次方法
輸入:包含n個對象的數據集
輸出:簇的分層結構
算法步驟:
計算鄰近度矩陣
每個點作爲一個簇
Repeat
合併最接近的兩個簇
更新鄰近度矩陣
Until 僅剩下一個簇
- 如果兩個類被合併,那麼將不能被恢復
- 不同的聚類模式都有以下一個或多個問題:
1.對噪音和異常點敏感
2.處理不同大小的簇和凸起的形狀的簇比較困難
3.分割大的類
基於密度方法
DBSCAN
基於密度定義,我們將點分爲:
- 稠密區域內部的點(核心點)
- 稠密區域邊緣上的點(邊界點)
- 稀疏區域中的點(噪聲或背景點).
DBSCAN算法的本質就是隨大流,邊界點緊緊圍繞着核心點,他們抱團,不帶噪點玩兒
小團體多了,聯繫比較密切的小團體之間聚成了同個類
比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的一個類
一開始就被孤立的噪點吧,自然有自己的傲骨,接着孤芳自賞
算法原理
DBSCAN通過檢查數據集中每點的Eps鄰域來搜索簇,如果點p的Eps鄰域包含的點多於MinPts個,則創建一個以p爲核心對象的簇。
然後,DBSCAN迭代地聚集從這些核心對象直接密度可達的對象,這個過程可能涉及一些密度可達簇的合併。
當沒有新的點添加到任何簇時,該過程結束.
DBSCAN(D, eps, MinPts) {
C = 0
for each point P in dataset D {
if P is visited
continue next point
mark P as visited
NeighborPts = regionQuery(P, eps)
if sizeof(NeighborPts) < MinPts
mark P as NOISE
else {
C = next cluster
expandCluster(P, NeighborPts, C, eps, MinPts)
}
}
}
expandCluster(P, NeighborPts, C, eps, MinPts) {
add P to cluster C
for each point P' in NeighborPts {
if P' is not visited {
mark P' as visited
NeighborPts' = regionQuery(P', eps)
if sizeof(NeighborPts') >= MinPts
NeighborPts = NeighborPts joined with NeighborPts'
}
if P' is not yet member of any cluster
add P' to cluster C
}
}
regionQuery(P, eps)
return all points within P's eps-neighborhood (including P)