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 &