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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
Python 不同对象比较大小示例探讨
Aug 21 Python
Python中变量交换的例子
Aug 25 Python
pygame学习笔记(4):声音控制
Apr 15 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python如何生成树形图案
Jan 03 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
Python实现我的世界小游戏源代码
Mar 02 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实现LOL数据远程获取
2014/06/10 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
Python实现把数字转换成中文
2015/06/29 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
毕业生文员求职信
2013/11/03 职场文书
活动志愿者自荐信
2014/01/27 职场文书
装修设计师求职信
2014/02/26 职场文书
霸王洗发水广告词
2014/03/14 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
股东授权委托书
2014/10/15 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
小学教师自我评价
2015/03/04 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书