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里对list中的整数求平均并排序
Sep 12 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
Python 支付整合开发包的实现
Jan 23 Python
python把1变成01的步骤总结
Feb 27 Python
详解Python3序列赋值、序列解包
May 14 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 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 FPDF类库应用实现代码
2009/03/20 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python制作Windows系统服务
2017/03/25 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
详解python内置模块urllib
2020/09/09 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
易程科技软件测试笔试
2013/03/24 面试题
求职简历中自我评价
2014/01/28 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js