DNSCAN有几个点需要理解清楚:
核心点:
在半径eps邻域内含有超过minpts数目的点,则为核心点,这些点都在簇内。
边界点
在半径eps邻域内含有小于minpts数目的点,则为边界点,这些点都在核心的邻居。
噪声点
不是核心点和边界点的点
核心对象
如果对象的Eps邻域至少包含最小数目MinPts的对象,则称该对象为核心对象。
eps邻域
给定对象半径Eps内的邻域称为该对象的Eps邻域,我们用 表示点p的Eps-半径内的点的集合,即:
N ( p) = {q | q在数据集 D中,distance(p , q) Eps}
直接密度可达:
给定一个对象集合D,如果p在q的Eps邻域内,而q是一个核心对象,则称对象p 从对象q出发时是直接密度可达的(directlydensity-reachable)。
密度可达:
如果存在一个对象链 ,对于pi属于集合D,pi+1是从pi关于Eps和MinPts直接密度可达的,则对象p是从对象q关于Eps和MinPts密度可达的(density-reachable)。
密度相连:
如果存在对象O∈D,使对象p和q都是从O关于Eps和MinPts密度可达的,那么对象p到q是关于Eps和MinPts密度相连的(densityconnected)。
直接密度可达一定密度可达,密度相连一定密度可达
原理:
1,DBSCAN通过检查数据集中每个样本点的eps邻域来搜索簇,如果点p的我平时邻域包含的点多余minpts,则创建一个以p为核心对象的簇
2,DBSCAN迭代的聚集从这些核心点对象直接密度可达的对象,这个过程可能涉及一些密度可达的合并
3,当没有新的点添加到任何簇时,过程结束。
伪代码:
import numpy as np
import matplotlib.pyplot as plt
import math
import random
from sklearn import datasets
#距离公式
def distance(x,y):
return np.sqrt(np.sum((x-y)**2))
def dbscan(dataset,minpts,eps):
n,m = dataset.shape
clusters = np.full(n,-1)
#簇的类别
k = 1
for i in range(n):
if clusters[i]!=-1:
continue
#获取领域中的所有样本点
subdataset = [j for j in range(n) if distance(dataset[j],dataset[i])<=eps]
print(subdataset)
if len(subdataset)
continue
#建立簇的标记
k+=1
clusters[i] = k
for j in subdataset:
clusters[j] = k
if j>i:
sub = [item for item in range(n) if distance(dataset[j],dataset[item])
if len(sub)>=minpts:
for t in sub:
if t not in subdataset:
subdataset.append(t)
print(clusters)
return clusters