DBSCAN-密度聚类

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)<minpts:
            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])<eps]
                if len(sub)>=minpts:
                    for t in sub:
                        if t not in subdataset:
                            subdataset.append(t)
        print(clusters)
        return clusters
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值