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 yield机制的异步操作同步化编程模型
Mar 18 Python
python中实现精确的浮点数运算详解
Nov 02 Python
图解Python变量与赋值
Apr 03 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
java中的控制结构(if,循环)详解
Jun 26 Python
python实现简单俄罗斯方块
Mar 13 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
Python分类测试代码实例汇总
Jul 23 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
基于注解实现 SpringBoot 接口防刷的方法
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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php中adodbzip类实例
2014/12/08 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
小程序如何支持使用 async/await详解
2019/09/12 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
教大家使用Python SqlAlchemy
2016/02/12 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
Python装饰器用法实例总结
2018/05/26 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
python实现数字炸弹游戏程序
2020/07/17 Python
详解python tcp编程
2020/08/24 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
redis 限制内存使用大小的实现
2021/05/08 Redis
python 爬取吉首大学网站成绩单
2021/06/02 Python