首页 > 编程语言 >DBSCAN聚类算法

DBSCAN聚类算法

时间:2022-11-24 21:15:45浏览次数:35  
标签:DBSCAN label print 算法 plt 聚类 np

1. 基于密度的聚类算法

  基于密度的聚类算法主要思想是只要邻近区域的密度(对象的个数)超过某个阈值,就把它加入到与之相近的聚类中。基于密度的聚类算法代表有DBSCAN算法、OPTICS算法及DENCLUE算法等。

2. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

  DBSCAN是一个比较有代表性的基于密度,对噪声鲁棒的空间聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

3. DBSCAN中的参数和定义

 

  Ε邻域:给定对象半径为Ε内的区域(d维超球)称为该对象的Ε邻域;

 

  核心对象:如果给定对象Ε邻域内的样本点数大于等于MinPts(密度阈值),则称该对象为核心对象;

 

  边界点:若某个对象点不是核心对象点,但落在了某个核心点的E领域内,则称为边界点。

 

  直接密度可达:对于样本集合D,如果样本点q在p的Ε邻域内,并且p为核心对象,那么对象q从对象p直接密度可达。

 

  密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。

 

  密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。

  参数选择技巧:

  半径E,可以根据K距离来设定:找突变点

  K距离:给定数据集P={p(); i=0,1...n} ,计算点P(i)到集合D的子集S中所有点之间的距离,距离按照从小到大的顺序排序, d(k)就被称为k-距离。

  MinPts : k-距离中k的值, -般取的小一些,多次尝试

4. DBSCAN聚类过程

 

5. 优点与缺点

  优点:

  •   不需要指定簇的个数
  •   可以发现任意形状的簇
  •   擅长找到离群点(检测任务)
  •   两个参数就够了

  缺点:

  • 高维数据有些困难(可以做降维)
  • 参数难以选择(参数对结果的影响非常大)
  • Sklearn中效率很慢(数据削减策略)

6. 代码实现

from sklearn.cluster import DBSCAN
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

def readFile(path):
    df=pd.read_csv(path)
    return df


if __name__=='__main__':
    #读取数据
    df=readFile('data.csv')
    dataNd = df.values
    print(dataNd)
    print(type(dataNd))
    DBSCANCluster = DBSCAN(eps=2, min_samples=4,metric='euclidean').fit(dataNd)#距离度量默认为euclidean
    print(DBSCANCluster.labels_)
    # 绘制图形
    fig = plt.figure(1)
    colors = ['r', 'g', 'y', 'b', 'r', 'c', 'g', 'b', 'k', 'm']
    x = df.iloc[0:, 0].to_list()
    print(x)
    print(type(x))
    y = df.iloc[0:, 1].to_list()
    print(y)
    area = 20 * np.arange(1, 10)  # 设置点的面积大小 area 值
    plt.scatter(x, y, alpha=0.5, marker='o')
    plt.xlabel('X坐标')
    plt.ylabel('Y坐标')
    # 设置横轴的上下限值
    plt.xlim(-5, 20)
    # 设置纵轴的上下限值
    plt.ylim(-5, 20)
    # plt.savefig('test_xx.png', dpi=200, bbox_inches='tight', transparent=False)
    plt.show()

    # 绘制聚类后的图形
    # 获取标签
    label_DBSCAN = DBSCANCluster.labels_
    set_label_DBSCAN=set(label_DBSCAN)
    print(label_DBSCAN)
    print(len(set_label_DBSCAN))
    set_len=len(set_label_DBSCAN)#后面绘制图形时,不绘制离群数据点颜色
    if -1 in label_DBSCAN:
        set_len=set_len-1
    color=['red','orange','blue','green','purple','cyan']
    print(set_len)
    for i in range(0,set_len):
        print(i)
        x0,y0= np.array(x)[label_DBSCAN  == i], np.array(y)[label_DBSCAN == i]
        plt.scatter(x0, y0, c=color[i], marker='o')
    x0, y0 = np.array(x)[label_DBSCAN == -1], np.array(y)[label_DBSCAN == -1]
    plt.scatter(x0, y0,   alpha=0.5, marker='o')
    # 获取数据值所在的范围
    x_min, x_max = np.array(x).min() - 1, np.array(x).max() + 1
    y_min, y_max = np.array(y).min() - 1, np.array(y).max() + 1
    # 生成网格矩阵,半天未能运行出来,消耗较大内存
    # xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.05), np.arange(y_min, y_max, 0.05))
    # z = DBSCANCluster.fit_predict(np.c_[xx.ravel(), yy.ravel()])
    # z = z.reshape(xx.shape)
    # cs = plt.contourf(xx, yy, z)

    plt.xlabel('X坐标')
    # # 设置Y轴标签
    plt.ylabel('Y坐标')
    plt.xlim(-5, 20)
    # 设置纵轴的上下限值
    plt.ylim(-5, 20)
    plt.show()

                         

  上述参数选择的固定值,不一定得到的聚类效果最好,可以采取多组值,判断轮廓系数,选择好的一组,也可以考虑根据上文的参数选择方式选择半径与密度阈值。

 

  附上数据与代码: 

  链接:https://pan.baidu.com/s/1qC284ORBLw674DyRsKX9Hg
  提取码:7uu8

 

 

若存在不足之处,欢迎指正与评论,若觉得有帮助,请点赞!  

 

标签:DBSCAN,label,print,算法,plt,聚类,np
From: https://www.cnblogs.com/wancy/p/16923220.html

相关文章

  • 排序算法
    零、总览(一)术语说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成......
  • 【算法】一些有用的知识
    前言本篇文章收录那些一般不会考裸题,但是常用于算法优化等处的算法们。预计会有以下几种板块:数学字符串其他一、数学1.快速幂快速幂intqpow(intx,inty){ i......
  • 优维科技CTO访谈实录:“大场景+小算法”构建AiOps运维技术哲学
    智能运维、自动化运维发展到现在,已经有将近7成的IT管理者学会利用大数据、人工智能产品及解决方案赋能团队,在生产效率、适应性和决策能力等层面实现了切实有效的正向转型。......
  • 一维数组的排序算法
    一维数组的排序算法冒泡排序气泡在水中向上涌数据在数组中不断的向前移动冒泡排序的过程代码运行publicclassarry7{publicstaticvoidmain(String[]args){......
  • 设计师如何通过算法提升产品转化率
    小结:1、强化学习奖惩逻辑2、为了使得累加之后不会正负抵消,我们会把得出来的距离数值做一个平方,这个方法叫做最小二乘法模型:一元线性回归模型算法:最小二乘法损失函......
  • Dijkstra算法求带权图的单源最短路径
    Dijkstra算法:给出一个带权无向图,要求指定顶点到图中每一个点的最短路径。首先我们定义一个邻接矩阵c,c[i][j]用来表示从顶点i到顶点j的权重,用一个一维数组prev[]来记录指定......
  • java工具类-jwt-RSA256算法加密
    加密数据(用户信息)packagetestJWT;/***@authorZRY*@version1.0*/publicclassUser{//用户idprivateintid;//用户名称private......
  • 数据结构与算法java实现
    什么是数组?(1)数组是计算机中最基本的数据结构之一,我们会用一些名为索引的数字来标识每项数据在数组中的位置。(2)大多数编程语言中索引是从0开始的。(3)数组在内存中是存在......
  • matlab误差传播和算法稳定性
    算法描述:    方案二:递推公式结果:y(1)=0.212647           y(2)=0.071838           y(3)=0.065374           y(4)=0.046157   ......
  • 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明:​​​​​1. 循环分页或者循环进行部分读取处理数据的时候,使用session.clear(); 2.  对应1+N(N+......