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代码调试的几种方法总结
Apr 15 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
Nov 21 Python
python实现两个文件合并功能
Apr 01 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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 mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
Django框架多表查询实例分析
2018/07/04 Python
python七夕浪漫表白源码
2019/04/05 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python celery原理及运行流程解析
2020/06/13 Python
django使用channels实现通信的示例
2020/10/19 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
一句话工作感言
2014/03/01 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
运动会加油稿
2015/07/22 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python