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实现读取及写入csv文件的方法示例
Jan 12 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
对python字典过滤条件的实例详解
Jan 22 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
Jan 29 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
python中threading开启关闭线程操作
May 02 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 Python
深入理解Python 多线程
Jun 16 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
Python实现小黑屋游戏的完整实例
Jan 06 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
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Python中的各种装饰器详解
2015/04/11 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
应届生求职推荐信
2013/10/28 职场文书
记者岗位职责
2014/01/06 职场文书
母亲节感恩寄语
2014/02/21 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
民主生活会剖析材料
2014/09/30 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
职代会闭幕词
2015/01/28 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
排球赛新闻稿
2015/07/17 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
关于python类SortedList详解
2021/09/04 Python