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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
Python Requests 基础入门
Apr 07 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python探索之Metaclass初步了解
Oct 28 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
python psutil库安装教程
Mar 19 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
使用Pytorch搭建模型的步骤
Nov 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
967 个函式
2006/10/09 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python实现CET查分的方法
2015/03/10 Python
python实现朴素贝叶斯算法
2018/11/19 Python
详解python tkinter模块安装过程
2020/01/06 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
遗产继承公证书
2014/04/09 职场文书
个人安全生产承诺书
2014/05/22 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
工程承包协议书
2014/10/20 职场文书
信访工作汇报材料
2014/10/27 职场文书
高温慰问简报
2015/07/21 职场文书
离婚财产分割协议书
2015/08/11 职场文书
高中生物教学反思
2016/02/20 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技