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实现多线程的方式及多条命令并发执行
Jun 07 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Python异常处理操作实例详解
Aug 28 Python
学习python的前途 python挣钱
Feb 27 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
python自动从arxiv下载paper的示例代码
Dec 05 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
Laravel 类和接口注入相关的代码
2019/10/15 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
python中upper是做什么用的
2020/07/20 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
西班牙在线药店:DosFarma
2020/03/28 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
初婚初育证明范本
2014/11/24 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
网络舆情信息简报
2015/07/21 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python