密度聚類演算法DBScan

2021-08-11 10:41:52 字數 2672 閱讀 8951

利用密度聚類dbscan對樣本進行分類。

基本思路:

1、讀取兩組不同資料訓練

2、分別對兩組資料進行聚類

3、將聚類結果視作乙個多維空間的點,計算其到原點的歐氏距離

4、根據ans1和ans2的歐氏距離找到合適的閾值

幾個必要概念:

ε-鄰域:對於樣本集中的xj, 它的ε-鄰域為樣本集中與它距離小於ε的樣本所構成的集合。

核心物件:若xj的ε-鄰域中至少包含minpts個樣本,則xj為乙個核心物件。

密度直達:若xj位於xi的ε-鄰域中,且xi為核心物件,則xj由xi密度直達。

密度可達:若樣本序列p1, p2, ……, pn。pi+1由pi密度直達,則p1由pn密度可達。

dbscan思路:

初始化核心物件集合t為空,遍歷一遍樣本集d中所有的樣本,計算每個樣本點的ε-鄰域中包含樣本的個數,如果個數大於等於minpts,則將該樣本點加入到核心物件集合中。初始化聚類簇數k= 0, 初始化未訪問樣本集和為p = d。

當t集合中存在樣本時執行如下步驟:

2.1記錄當前未訪問集合p_old = p

2.2從t中隨機選乙個核心物件o,初始化乙個佇列q = [o]

2.3p = p-o(從t中刪除o)

2.4當q中存在樣本時執行:

2.4.1取出佇列中的首個樣本q

2.4.2計算q的ε-鄰域中包含樣本的個數,如果大於等於minpts,則令s為q的ε-鄰域與p的交集,

q = q+s, p = p-s

2.5 k = k + 1,生成聚類簇為ck = p_old - p

2.6 t = t - ck

劃分為c=

#計算距離,a,b分別為兩個元組

def dist(a, b):

return abs(a-b)

#演算法模型

def dbscan(d, e, minpts):

# d = data

# e = 1

# minpts = 10

#初始化核心物件集合t,聚類個數k,聚類集合c, 未訪問集合p,

t = set(); k = 0; c = ; p = set(d)

for d in d:

if len([ i for i in d if dist(d, i) <= e]) >= minpts:

t.add(d)

#開始聚類

while len(t):

p_old = p

o = list(t)[np.random.randint(0, len(t))]

o1 = #把元素變為列表

o = o1

p = p - set(o)

while len(q):

q = q[0]

nq = [i for i in d if dist(q, i) <= e]

if len(nq) >= minpts:

s = p & set(nq)

q += (list(s))

p = p - s

q.remove(q)

k += 1

ck = list(p_old - p)

t = t - set(ck)

return c

e = 1

minpts = 50

w = 1600

ans =

n = len(data1)/w

for i in range(n):

euclid = 0

data = data1[w*i:w*(i+1)]

c = dbscan(data, e, minpts)

for j in c:

euclid = euclid + math.pow(len(j),2)

print i

ans2 =

n = len(data2)/w

for i in range(n):

euclid = 0

data = data2[w*i:w*(i+1)]

c = dbscan(data, e, minpts)

for j in c:

euclid = euclid + math.pow(len(j),2)

print i

DBSCAN密度聚類演算法

dbscan是一種基於密度的聚類演算法,這類密度聚類演算法一般假定類別可以通過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠處一定有同類別的樣本存在。通過將緊密相連的樣本劃為一類,這樣就得到了乙個聚類類別。通過將所有各組緊密相連的樣本劃為各個不同的類...

DBSCAN 密度聚類

dbscan 密度聚類 dbscan演算法是一種基於密度的聚類演算法 聚類的時候不需要預先指定簇的個數 最終的簇的個數不定 dbscan演算法將資料點分為三類 核心點 在半徑eps內含有超過minpts數目的點 邊界點 在半徑eps內點的數量小於minpts,但是落在核心點的鄰域內 噪音點 既不是核...

DBSCAN密度聚類

dbscan是一種基於密度的聚類演算法,這類密度聚類演算法一般假定類別可以通過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠處一定有同類別的樣本存在。通過將緊密相連的樣本劃為一類,這樣就得到了乙個聚類類別。通過將所有各組緊密相連的樣本劃為各個不同的類...