Python聚类算法之DBSACN实例分析


Posted in Python onNovember 20, 2015

本文实例讲述了Python聚类算法之DBSACN。分享给大家供大家参考,具体如下:

DBSCAN:是一种简单的,基于密度的聚类算法。本次实现中,DBSCAN使用了基于中心的方法。在基于中心的方法中,每个数据点的密度通过对以该点为中心以边长为2*EPs的网格(邻域)内的其他数据点的个数来度量。根据数据点的密度分为三类点:

核心点:该点在邻域内的密度超过给定的阀值MinPs。
边界点:该点不是核心点,但是其邻域内包含至少一个核心点。
噪音点:不是核心点,也不是边界点。

有了以上对数据点的划分,聚合可以这样进行:各个核心点与其邻域内的所有核心点放在同一个簇中,把边界点跟其邻域内的某个核心点放在同一个簇中。

# scoding=utf-8
import pylab as pl
from collections import defaultdict,Counter
points = [[int(eachpoint.split("#")[0]), int(eachpoint.split("#")[1])] for eachpoint in open("points","r")]
# 计算每个数据点相邻的数据点,邻域定义为以该点为中心以边长为2*EPs的网格
Eps = 10
surroundPoints = defaultdict(list)
for idx1,point1 in enumerate(points):
  for idx2,point2 in enumerate(points):
    if (idx1 < idx2):
      if(abs(point1[0]-point2[0])<=Eps and abs(point1[1]-point2[1])<=Eps):
        surroundPoints[idx1].append(idx2)
        surroundPoints[idx2].append(idx1)
# 定义邻域内相邻的数据点的个数大于4的为核心点
MinPts = 5
corePointIdx = [pointIdx for pointIdx,surPointIdxs in surroundPoints.iteritems() if len(surPointIdxs)>=MinPts]
# 邻域内包含某个核心点的非核心点,定义为边界点
borderPointIdx = []
for pointIdx,surPointIdxs in surroundPoints.iteritems():
  if (pointIdx not in corePointIdx):
    for onesurPointIdx in surPointIdxs:
      if onesurPointIdx in corePointIdx:
        borderPointIdx.append(pointIdx)
        break
# 噪音点既不是边界点也不是核心点
noisePointIdx = [pointIdx for pointIdx in range(len(points)) if pointIdx not in corePointIdx and pointIdx not in borderPointIdx]
corePoint = [points[pointIdx] for pointIdx in corePointIdx] 
borderPoint = [points[pointIdx] for pointIdx in borderPointIdx]
noisePoint = [points[pointIdx] for pointIdx in noisePointIdx]
# pl.plot([eachpoint[0] for eachpoint in corePoint], [eachpoint[1] for eachpoint in corePoint], 'or')
# pl.plot([eachpoint[0] for eachpoint in borderPoint], [eachpoint[1] for eachpoint in borderPoint], 'oy')
# pl.plot([eachpoint[0] for eachpoint in noisePoint], [eachpoint[1] for eachpoint in noisePoint], 'ok')
groups = [idx for idx in range(len(points))]
# 各个核心点与其邻域内的所有核心点放在同一个簇中
for pointidx,surroundIdxs in surroundPoints.iteritems():
  for oneSurroundIdx in surroundIdxs:
    if (pointidx in corePointIdx and oneSurroundIdx in corePointIdx and pointidx < oneSurroundIdx):
      for idx in range(len(groups)):
        if groups[idx] == groups[oneSurroundIdx]:
          groups[idx] = groups[pointidx]
# 边界点跟其邻域内的某个核心点放在同一个簇中
for pointidx,surroundIdxs in surroundPoints.iteritems():
  for oneSurroundIdx in surroundIdxs:
    if (pointidx in borderPointIdx and oneSurroundIdx in corePointIdx):
      groups[pointidx] = groups[oneSurroundIdx]
      break
# 取簇规模最大的5个簇
wantGroupNum = 3
finalGroup = Counter(groups).most_common(3)
finalGroup = [onecount[0] for onecount in finalGroup]
group1 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[0]]
group2 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[1]]
group3 = [points[idx] for idx in xrange(len(points)) if groups[idx]==finalGroup[2]]
pl.plot([eachpoint[0] for eachpoint in group1], [eachpoint[1] for eachpoint in group1], 'or')
pl.plot([eachpoint[0] for eachpoint in group2], [eachpoint[1] for eachpoint in group2], 'oy')
pl.plot([eachpoint[0] for eachpoint in group3], [eachpoint[1] for eachpoint in group3], 'og')
# 打印噪音点,黑色
pl.plot([eachpoint[0] for eachpoint in noisePoint], [eachpoint[1] for eachpoint in noisePoint], 'ok')  
pl.show()

运行效果截图如下:

Python聚类算法之DBSACN实例分析

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现抓取页面上链接的简单爬虫分享
Jan 21 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python小程序实现刷票功能详解
Jul 17 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 #Python
Python聚类算法之基本K均值实例详解
Nov 20 #Python
Python实现将xml导入至excel
Nov 20 #Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 #Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 #Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 #Python
Python的Flask开发框架简单上手笔记
Nov 16 #Python
You might like
解析如何用php screw加密php源代码
2013/06/20 PHP
php curl选项列表(超详细)
2013/07/01 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
PDO::_construct讲解
2019/01/27 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
python实现图片批量剪切示例
2014/03/25 Python
Python实现批量修改文件名实例
2015/07/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Pycharm调试程序技巧小结
2020/08/08 Python
优秀教师获奖感言
2014/01/31 职场文书
烹调加工管理制度
2014/02/04 职场文书
观看信仰心得体会
2014/09/04 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
中学生自我评价范文
2015/03/03 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书