Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】


Posted in Python onDecember 26, 2018

本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算。分享给大家供大家参考,具体如下:

算法思想

基于密度的聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇得到最终结果。

几个必要概念:

ε-邻域:对于样本集中的xj, 它的ε-邻域为样本集中与它距离小于ε的样本所构成的集合。
核心对象:若xj的ε-邻域中至少包含MinPts个样本,则xj为一个核心对象。
密度直达:若xj位于xi的ε-邻域中,且xi为核心对象,则xj由xi密度直达。
密度可达:若样本序列p1, p2, ……, pn。pi+1由pi密度直达,则p1由pn密度可达。

大致思想如下:

1. 初始化核心对象集合T为空,遍历一遍样本集D中所有的样本,计算每个样本点的ε-邻域中包含样本的个数,如果个数大于等于MinPts,则将该样本点加入到核心对象集合中。初始化聚类簇数k = 0, 初始化未访问样本集和为P = D。

2. 当T集合中存在样本时执行如下步骤:

  • 2.1记录当前未访问集合P_old = P
  • 2.2从T中随机选一个核心对象o,初始化一个队列Q = [o]
  • 2.3P = P-o(从T中删除o)
  • 2.4当Q中存在样本时执行:
  • 2.4.1取出队列中的首个样本q
  • 2.4.2计算q的ε-邻域中包含样本的个数,如果大于等于MinPts,则令S为q的ε-邻域与P的交集,

    Q = Q+S, P = P-S

  • 2.5 k = k + 1,生成聚类簇为Ck = P_old - P
  • 2.6 T = T - Ck

3. 划分为C= {C1, C2, ……, Ck}

Python代码实现

#-*- coding:utf-8 -*-
import math
import numpy as np
import pylab as pl
 #数据集:每三个是一组分别是西瓜的编号,密度,含糖量
data = """
1,0.697,0.46,2,0.774,0.376,3,0.634,0.264,4,0.608,0.318,5,0.556,0.215,
6,0.403,0.237,7,0.481,0.149,8,0.437,0.211,9,0.666,0.091,10,0.243,0.267,
11,0.245,0.057,12,0.343,0.099,13,0.639,0.161,14,0.657,0.198,15,0.36,0.37,
16,0.593,0.042,17,0.719,0.103,18,0.359,0.188,19,0.339,0.241,20,0.282,0.257,
21,0.748,0.232,22,0.714,0.346,23,0.483,0.312,24,0.478,0.437,25,0.525,0.369,
26,0.751,0.489,27,0.532,0.472,28,0.473,0.376,29,0.725,0.445,30,0.446,0.459"""
#数据处理 dataset是30个样本(密度,含糖量)的列表
a = data.split(',')
dataset = [(float(a[i]), float(a[i+1])) for i in range(1, len(a)-1, 3)]
#计算欧几里得距离,a,b分别为两个元组
def dist(a, b):
  return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))
#算法模型
def DBSCAN(D, e, Minpts):
  #初始化核心对象集合T,聚类个数k,聚类集合C, 未访问集合P,
  T = set(); k = 0; C = []; P = set(D)
  for d in D:
    if len([ i for i in D if dist(d, i) <= e]) >= Minpts:
      T.add(d)
  #开始聚类
  while len(T):
    P_old = P
    o = list(T)[np.random.randint(0, len(T))]
    P = P - set(o)
    Q = []; Q.append(o)
    while len(Q):
      q = Q[0]
      Nq = [i for i in D if dist(q, i) <= e]
      if len(Nq) >= Minpts:
        S = P & set(Nq)
        Q += (list(S))
        P = P - S
      Q.remove(q)
    k += 1
    Ck = list(P_old - P)
    T = T - set(Ck)
    C.append(Ck)
  return C
#画图
def draw(C):
  colValue = ['r', 'y', 'g', 'b', 'c', 'k', 'm']
  for i in range(len(C)):
    coo_X = []  #x坐标列表
    coo_Y = []  #y坐标列表
    for j in range(len(C[i])):
      coo_X.append(C[i][j][0])
      coo_Y.append(C[i][j][1])
    pl.scatter(coo_X, coo_Y, marker='x', color=colValue[i%len(colValue)], label=i)
  pl.legend(loc='upper right')
  pl.show()
C = DBSCAN(dataset, 0.11, 5)
draw(C)

本机测试运行结果图:

Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python编程中对super函数的正确理解和用法解析
Jul 02 Python
Python生成密码库功能示例
May 23 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
详谈python在windows中的文件路径问题
Apr 28 Python
Python做智能家居温湿度报警系统
Sep 25 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
在python中实现强制关闭线程的示例
Jan 22 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
python 实现视频 图像帧提取
Dec 10 Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
python使用knn实现特征向量分类
Dec 26 #Python
python调用staf自动化框架的方法
Dec 26 #Python
Django unittest 设置跳过某些case的方法
Dec 26 #Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 #Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 #Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 #Python
Python使用requests提交HTTP表单的方法
Dec 26 #Python
You might like
精通php的十大要点(上)
2009/02/04 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
推荐dojo学习笔记
2007/03/24 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
详解Django中的过滤器
2015/07/16 Python
python动态加载包的方法小结
2016/04/18 Python
python 性能优化方法小结
2017/03/31 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
Python如何急速下载第三方库详解
2020/11/02 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
革命英雄事迹演讲稿
2014/09/13 职场文书
房屋转让协议书
2014/10/18 职场文书
培训师岗位职责
2015/02/14 职场文书
学生检讨书范文
2019/06/24 职场文书
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS