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 strip()函数 介绍
May 24 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
pandas 时间格式转换的实现
Jul 06 Python
Python进程池Pool应用实例分析
Nov 27 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
Python with标签使用方法解析
Jan 17 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
python实现MD5进行文件去重的示例代码
Jul 09 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP面向对象详解(三)
2015/12/07 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
python 写一个文件分发小程序
2020/12/05 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
HTML5标签大全
2016/11/23 HTML / CSS
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
秋季校运动会广播稿
2014/02/23 职场文书
协议书的格式
2014/04/23 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
入股合作协议书
2014/10/12 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript