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异步回调机制实现和使用方法
Nov 26 Python
深入浅析python定时杀进程
Jun 06 Python
Python实现的多进程和多线程功能示例
May 29 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
python使用udp实现聊天器功能
Dec 10 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
python字符串的index和find的区别详解
Jun 20 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python urlopen()参数代码示例解析
Dec 10 Python
opencv读取视频并保存图像的方法
Jun 04 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
php中socket的用法详解
2014/10/24 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
laravel入门知识点整理
2020/09/15 PHP
PHP7 windows支持
2021/03/09 PHP
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
Vue关于组件化开发知识点详解
2020/05/13 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
详解Django框架中的视图级缓存
2015/07/23 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
Python设计密码强度校验程序
2020/07/30 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
个人担保书范文
2014/05/20 职场文书
社区平安建设方案
2014/05/25 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
党员个人对照检查材料
2014/10/01 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
windows安装python超详细图文教程
2021/05/21 Python
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
Python代码实现双链表
2022/05/25 Python