DBSCAN 聚类

本贴最后更新于 1144 天前,其中的信息可能已经斗转星移

DBSCAN

Density-Based Spatial Clustering of Applications with Noise

  1. 一种基于密度,对噪声鲁棒的空间聚类算法。
  2. DBSCAN 算法可以找到样本点的全部密集区域,并把这些密集区域当做一 个一个的聚类簇
  3. 通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性, 并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
  4. DBSCAN 算法基于一组“领域”参数(ε,MinPts)来刻画样本分布的紧密程度。ε:领域半径;MinPts:密度阈值
    关于 DBSCAN 的通俗描述:

对于 DBSCAN 算法最为重要的就是核心点。什么是核心点呢?简单来说就是当在以一个点为圆心半径为 ε 的区域内存在不少于 MinPts 个其他点时,此点即为核心点, 暂称核心点为“大哥”,核心点的邻域点为“小弟”,当大哥的小弟作为大哥时,又会存在一批小弟,当第二批小弟又作为大哥,又会找出第三批小弟,如此循环直至找不到小弟, 那么这些由第一代大哥衍生出来的小弟也好大哥也好与它们的邻域构成一个簇,也就是一类。后来的点按照以上的操作往复循环就能找到一个一个的簇,直到所有的点被找过。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets #加载数据集
X=datasets.make_circles(n_samples=1000, factor=0.2, noise=0.1)[0] #生成环形数据
def distance(X):      #计算个点之间的距离(矩阵,同pdist2)
    n=len(X)
    D=np.zeros((n,n))
    for i in range(n):
        for j in range(0,i):
            D[i][j]=np.linalg.norm(X[i]-X[j],ord=2)
            D[j][i]=D[i][j]
    return D
def dbscan(X,epsilon,MinPts):
    C=0  #以点在源数据中的位置标记类别
    n=len(X)
    idx=[0 for i in range(n)]  #类别信息存储
    visited=[0 for i in range(n)] #巡查判断
    D=distance(X)  #距离矩阵
    def RegionQuery(i):       #列出一个点周围ε内存在的点的下标
        Neighbors=np.where(D[i,:]<=epsilon)
        return list(Neighbors)[0].tolist()  #以列表形式返回
    def ExpandCluster(i,Neighbors,C):  #将邻域点能够成为核心点的点归类
        idx[i]=C  #将点赋给类别
        k=1
        while k<=len(Neighbors):
            j=Neighbors[k]
            if visited[j]==0:
                visited[j]=1
                Neighbors2=RegionQuery(j)
                if len(Neighbors2)>=MinPts:
                    Neighbors.extend(Neighbors2)
            if idx[j]==0:
                idx[j]=C  #将没有分类的点分类
            k=k+1
            if k>len(Neighbors)-1:
                break
    for i in range(n):  #寻找核心点
        if visited[i]==0:
            visited[i]=1
            Neighbors=RegionQuery(i)
            if len(Neighbors)>=MinPts:
                C=C+1   #类别标志加一
                ExpandCluster(i,Neighbors,C)

    return idx
def plot(a,X):  #绘画板块
    m=max(a)
    for j in range(m):
        index=[i for i,v in enumerate(a) if v==j+1]
        x=[]
        y=[]
        for k in index:
            x.append(X[k][0])
            y.append(X[k][1])
        plt.scatter(x,y)
    x=[]
    y=[]
    for i in range(len(a)): #噪点绘制
        if a[i]==0:
            x.append(X[i][0])
            y.append(X[i][1])
    plt.scatter(x,y,marker='x')
    plt.show()
if __name__=="__main__":  #设置ε为0.2,MinPts为3 进行测
    a=dbscan(X,0.2,3)
    plot(a,X)

Figure1.png

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • danl
    62 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 447 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 294 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 605 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 65 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 151 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 166 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 494 关注
  • OnlyOffice
    4 引用 • 24 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 18 关注
  • 倾城之链
    23 引用 • 66 回帖 • 101 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    60 引用 • 287 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 193 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    173 引用 • 990 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 117 关注