

























DBSCAN(Density-Based Spatial Clustering of Applications with Noise),有噪声的基于密度聚类算法。
关于DBSCAN的一些定义:
DBSCAN目的是找到密度相连对象的最大集合。
伪代码
REPEAT:
选取未处理的一个点P进行处理
IF P是核心点
THEN 找出P的所有密度相连的点,形成簇
ELSE P是非核心点
标记P为噪声
CONTINUE
UNTIL所有点都被处理Python代码实现
import numpy as np
def dist2D(p1, p2):
d = np.sqrt(sum([np.power(p1[i] - p2[i], 2) for i in range(len(p1))]))
return d
def dbscan(D, Eps, MinPts, dist):
c = 0 # 初始化簇的个数为0
n = len(D) # 点的个数
visited = np.zeros(n, dtype=int) # 访问列表
C = np.zeros(n, dtype=int) # 簇号列表
while 0 in visited: # 当还有点未被访问到
p = np.random.choice(np.where(visited == 0)[0].tolist()) # 随机选取未被访问到的点
visited[p] = 1 # 标记该点被访问
N = np.empty(0, dtype=int) # 邻域点集
for i in range(n):
if dist(D[p], D[i]) <= Eps:
N = np.append(N, i) # 计算E邻域的点
if len(N) < MinPts:
C[p] = -1 # 如果E邻域的点数小于MinPts,则为非核心点(噪声)
else: # 否则,为核心店
c += 1 # 新建簇号
'''找到所有该点的密度相连的点,标记簇号'''
C[p] = c
while 0 in visited[N]:
_p = np.random.choice(np.intersect1d(N, np.where(visited == 0)[0]))
visited[_p] = 1
_N = np.empty(0, dtype=int)
for i in range(n):
if dist(D[_p], D[i]) <= Eps:
_N = np.append(_N, i)
if len(_N) >= MinPts:
N = np.append(N, _N)
if C[_p] == 0:
C[_p] = c
return C'''
导入dbscan算法
'''
import matplotlib.pyplot as plt
data = np.loadtxt("788points.txt", dtype="float32", delimiter=",")
data_c = dbscan(data, 2, 14, dist2D)
plt.scatter([a[0] for a in data], [a[1] for a in data], c=data_c)

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。