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 23 Python
Python重新引入被覆盖的自带function
Jul 16 Python
深入浅出分析Python装饰器用法
Jul 28 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
python实现多进程代码示例
Oct 31 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Python实战之制作天气查询软件
May 14 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
python 统计文件中的字符串数目示例
Dec 24 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
PyQt5通过信号实现MVC的示例
Feb 06 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 COOKIE设置为浏览器进程
2009/06/21 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
img标签中onerror用法
2009/08/13 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
init进程的作用
2015/08/20 面试题
护理专业的自荐信
2013/10/22 职场文书
运动会通讯稿100字
2014/01/31 职场文书
2014年党务工作总结
2014/11/25 职场文书
2019求职信大礼包
2019/05/15 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers