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中cPickle用法例子分享
Jan 03 Python
python paramiko模块学习分享
Aug 23 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
python实现画循环圆
Nov 23 Python
python集合删除多种方法详解
Feb 10 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
python爬虫请求头的使用
Dec 01 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
pytest配置文件pytest.ini的详细使用
Apr 17 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
JAVA/JSP学习系列之二
2006/10/09 PHP
追求程序速度,而不是编程的速度
2008/04/23 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
js密码强度检测
2016/01/07 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
高中自我评价分享
2013/12/05 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
教师求职自荐书
2014/06/14 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
2016寒假假期总结
2015/10/10 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
SQL Server内存机制浅探
2022/04/06 SQL Server