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使用urllib2获取网络资源实例讲解
Dec 02 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
Python 必须了解的5种高级特征
Sep 10 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 Python
python库sklearn常用操作
Aug 23 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&amp;&amp;mysql)三
2006/10/09 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
Python中除法使用的注意事项
2014/08/21 Python
跟老齐学Python之变量和参数
2014/10/10 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python中随机函数random用法实例
2015/04/30 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python中max函数用法实例分析
2015/07/17 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
animation和transition的区别
2020/10/12 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
销售总监工作职责
2013/11/21 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
小学生节水倡议书
2015/04/29 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL