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 30 Python
Python文件读写保存操作的示例代码
Sep 14 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
浅谈Python协程
Jun 17 Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
python基于opencv实现人脸识别
Jan 04 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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 反射机制实现动态代理的代码
2008/10/22 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python操作csv文件实例详解
2017/07/31 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
python自定义函数def的应用详解
2020/06/03 Python
python文件编写好后如何实践
2020/07/07 Python
Python自动登录QQ的实现示例
2020/08/28 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
采购主管的岗位职责
2013/12/17 职场文书
机关会计岗位职责
2014/04/08 职场文书
财务检查整改报告
2014/11/06 职场文书
2014年教育工作总结
2014/11/26 职场文书
工作简报怎么写
2015/07/21 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS