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 01 Python
python实现的简单抽奖系统实例
May 22 Python
python检测是文件还是目录的方法
Jul 03 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python统计单词出现的次数
Apr 04 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
python中map的基本用法示例
Sep 10 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
python科学计算之scipy——optimize用法
Nov 25 Python
python之列表推导式的用法
Nov 29 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
基于python模拟bfs和dfs代码实例
Nov 19 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.ini中文版(2)
2006/10/09 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
python简单实现获取当前时间
2016/08/27 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
selenium+python环境配置教程详解
2019/05/28 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Django实现基于类的分页功能
2019/10/31 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
自我评价范文点评
2013/12/04 职场文书
服务质量承诺书
2014/03/27 职场文书
财产公证书
2014/04/10 职场文书
英文慰问信范文
2015/03/24 职场文书
首席执行官观后感
2015/06/03 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
小学信息技术教学反思
2016/02/16 职场文书