dbscan原理是基於距離定義密度
,使用時使用者需要自定義距離範圍eps
和最小點數minpt
。dnscan的演算法流程如下:
初始化核心點集,輸入距離範圍和最小核心點數
遍歷資料點,在給定距離和最小核心點數的情況下,得到核心點集合並儲存下每個點的鄰接點
從核心點集中隨機選出點,開始分簇。將其鄰域點加入至簇成員集合中,鄰域中的核心點儲存下來再進行迴圈,直至簇核心點為空則簇劃分完畢,再執行第3步。
詳細的演算法流程可檢視劉建平pinard部落格
python**如下:
# using utf-8
import numpy as np
def dbscan(x, minpt, esp, norm=1):
x = np.array(x)
n, d = x.shape
core_points = set() # 存放核心點
neighborhood = {} # 存放各個點的領域,用字典的形式
unexplore = set(np.arange(n)) # 為探索集合
cluster_result = # 儲存分類結果
if norm==1:
for i in range(n):
distance = abs(x - x[i, :]).sum(axis=1) # 計算到該點的距離
neighborhood_index = np.where(distance<=esp)[0] # 取出鄰域,得到的是ndarray
neighborhood_index = list(set(neighborhood_index) - )
neighborhood[str(i)] = neighborhood_index # 儲存領域
if len(neighborhood_index) >= minpt:
core_points.add(i)
else:
continue
elif norm==2:
for i in range(n):
distance = ((x - x[i, :]) ** 2).sum(axis=1) # 計算各節點的距離
neighborhood_index = np.where(distance<=esp)[0] # 取出鄰域
neighborhood[str(i)] = list(set(neighborhood_index) - ) # 儲存鄰域
if len(neighborhood_index) >= minpt:
core_points.add(i)
else:
continue
else:
print("請輸入支援的範數形式:1或2")
return none
print(neighborhood)
while len(core_points):
print("當前核心數量為", len(core_points))
cluster_core = set()
cluster_core.add(core_points.pop()) # 取出第乙個元素,core_points已被更改
print(cluster_core)
cluster_member = cluster_core.copy() # 深度拷貝,可以通過id(cluster_member)檢視記憶體位置
while len(cluster_core):
current_core = cluster_core.pop() # 當前核心
adding_cluster_core = core_points.intersection(set(neighborhood[str(current_core)])) # 簇核心新增
cluster_core.update(adding_cluster_core) # 新增簇核心
adding_member = unexplore.intersection(set(neighborhood[str(current_core)])) # 簇成員新增
cluster_member.update(adding_member) # 新增成員
unexplore.difference_update(cluster_member) # 更新unexplore
core_points.difference_update(cluster_core) # 更新core_points
return cluster_result
if __name__ == "__main__":
x = np.array([[1, 2],
[2, 1],
[2, 4],
[4, 3],
[5, 8],
[6, 7],
[6, 9],
[7, 9],
[9, 5],
[1, 12],
[3, 12],
[5, 12],
[3, 3]])
cluster_result = dbscan(x, minpt=3, esp=3, norm=1)
print(cluster_result)
Python實現DBSCAN演算法
python實現dascan聚類。周志華老師的 機器學習 一書中詳細說明了演算法的過程,這裡就不再贅述,密度聚類的好壞與引數設定有很大的關係。coding utf 8 import numpy as np import random import math import copy import sc...
DBSCAN聚類演算法Python實現
dbscan是一種基於密度的聚類演算法,這類密度聚類演算法一般假定類別可以通過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠處一定有同類別的樣本存在。通過將緊密相連的樣本劃為一類,這樣就得到了乙個聚類類別。通過將所有各組緊密相連的樣本劃為各個不同的類...
DBSCAN演算法隨記
以質點為圓心,以半徑r畫圓,圓圈中的點個數有木有達到設定的閾值,半徑r需要自己指定。與k means不同,不用設定k值但其他的引數 r,minpts 設定依然是乙個問題。直接密度可達是指 以q為圓心,在半徑為r的圓內點p,叫直接密度可達。密度可達是指 以q0為圓心,在半徑為r的圓內點q1。再以q1為...