聚類分析之密度划分(DBSCAN、MeanShift)


      將密度足夠大的相鄰區域連接,能有效處理異常數據,主要用於對空間數據的聚類。只要靠近區域的密度超過某個閥值,就繼續聚類。將密度足夠大的相鄰區域連接起來。在一個給定范圍的區域內必須至少包含某個數目的點。該類方法將每個簇看作是數據空間中被低密度區域分割開的高密度對象區域,也就是將簇看作是密度相連的點最大集合。具有較大的優越性和靈活性,有效地克服噪聲的影響,並且只需要對數據進行一次掃描。代表算法DBSCAN、DENCLUE和OPTICS等。

setp1:輸入數據集合s,隨機找出一個點,並找出這個點所有密度相連點

setp2:遍歷所有epslon領域內的點,並尋找這些點相連的點

setp3:掃描數據集,尋找沒有被聚類的核心點。返回setp2

setp4:輸出划分的類,並輸出異常值點(不和其他點密度相連)

優點:應用最為廣泛;收斂速度快;能擴展以用於大規模的數據集,與K-means方法相比,DBSCAN不需要事先知道要形成的簇類的數量。 與K-means方法相比,DBSCAN可以發現任意形狀的簇類。同時,DBSCAN能夠識別出噪聲點。

 缺點:傾向於識別凸形分布、大小相近、密度相近的聚類;中心選擇和噪聲聚類對結果影響大。 DBSCAN不能很好反映高維數據, DBSCAN不能很好反映數據集以變化的密度。

    DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一個基於高密度連接區域的密度聚類方法。DBSCAN通過檢查數據庫中每個點的ε-鄰域來尋找聚類。如果一個點p的ε-鄰域包含多於MinPts個點,則創建一個以p作為核心對象的新簇。然后,DBSCAN反復地尋找從這些核心對象直接密度可達的對象,這個過程可能涉及一些密度可達簇的合並[9]。當沒有新的點可以被添加到任何簇時,該過程結束。

python代碼如下:

from sklearn.cluster import DBSCAN
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=DBSCAN()
predicted=clf.fit_predict(X)
#設置區間
print(predicted)
k2y = np.array([0,1,2])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

我們可以看出聚類精度0.687

MeanShift

from sklearn.cluster import MeanShift
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=MeanShift()
predicted=clf.fit_predict(X)
#設置區間
print(predicted)
k2y = np.array([1,0])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

聚類精度0.66


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM