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实现斐波那契数列的方法示例
Jan 12 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
Python的argparse库使用详解
Oct 09 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
python根据文本生成词云图代码实例
Nov 15 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
python中实现词云图的示例
Dec 19 Python
python绘制汉诺塔
Mar 01 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删除左端与右端空格的方法
2014/11/29 PHP
YII框架关联查询操作示例
2019/04/29 PHP
JavaScript高级程序设计
2006/12/29 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
python实现web方式logview的方法
2015/08/10 Python
python实现linux下抓包并存库功能
2018/07/18 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
社区工作者先进事迹
2014/01/18 职场文书
影视广告专业求职信
2014/09/02 职场文书
邀请书格式范文
2015/02/02 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
教导处教学工作总结
2015/08/12 职场文书
详解Django的MVT设计模式
2021/04/29 Python
python 制作一个gui界面的翻译工具
2021/05/14 Python
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android