python实现密度聚类(模板代码+sklearn代码)


Posted in Python onApril 27, 2020

本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法。
有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易,但自己实现代码会对自己对算法的理解更上一层楼。

#调用科学计算包与绘图包
import numpy as np
import random
import matplotlib.pyplot as plt
# 获取数据
def loadDataSet(filename):
  dataSet=np.loadtxt(filename,dtype=np.float32,delimiter=',')
  return dataSet
#计算两个向量之间的欧式距离
def calDist(X1 , X2 ):
  sum = 0
  for x1 , x2 in zip(X1 , X2):
    sum += (x1 - x2) ** 2
  return sum ** 0.5
#获取一个点的ε-邻域(记录的是索引)
def getNeibor(data , dataSet , e):
  res = []
  for i in range(dataSet.shape[0]):
    if calDist(data , dataSet[i])<e:
      res.append(i)
  return res
#密度聚类算法
def DBSCAN(dataSet , e , minPts):
  coreObjs = {}#初始化核心对象集合
  C = {}
  n = dataSet.shape[0]
  #找出所有核心对象,key是核心对象的index,value是ε-邻域中对象的index
  for i in range(n):
    neibor = getNeibor(dataSet[i] , dataSet , e)
    if len(neibor)>=minPts:
      coreObjs[i] = neibor
  oldCoreObjs = coreObjs.copy()
  k = 0#初始化聚类簇数
  notAccess = list(range(n))#初始化未访问样本集合(索引)
  while len(coreObjs)>0:
    OldNotAccess = []
    OldNotAccess.extend(notAccess)
    cores = coreObjs.keys()
    #随机选取一个核心对象
    randNum = random.randint(0,len(cores)-1)
    cores=list(cores)
    core = cores[randNum]
    queue = []
    queue.append(core)
    notAccess.remove(core)
    while len(queue)>0:
      q = queue[0]
      del queue[0]
      if q in oldCoreObjs.keys() :
        delte = [val for val in oldCoreObjs[q] if val in notAccess]#Δ = N(q)∩Γ
        queue.extend(delte)#将Δ中的样本加入队列Q
        notAccess = [val for val in notAccess if val not in delte]#Γ = Γ\Δ
    k += 1
    C[k] = [val for val in OldNotAccess if val not in notAccess]
    for x in C[k]:
      if x in coreObjs.keys():
        del coreObjs[x]
  return C
# 代码入口
dataSet = loadDataSet(r"E:\jupyter\sklearn学习\sklearn聚类\DataSet.txt")
print(dataSet)
print(dataSet.shape)
C = DBSCAN(dataSet, 0.11, 5)
draw(C, dataSet)

结果图:

python实现密度聚类(模板代码+sklearn代码)

下面是调用sklearn库的实现

db = skc.DBSCAN(eps=1.5, min_samples=3).fit(dataSet) #DBSCAN聚类方法 还有参数,matric = ""距离计算方法
labels = db.labels_ #和X同一个维度,labels对应索引序号的值 为她所在簇的序号。若簇编号为-1,表示为噪声
print('每个样本的簇标号:')
print(labels)
raito = len(labels[labels[:] == -1]) / len(labels) #计算噪声点个数占总数的比例
print('噪声比:', format(raito, '.2%'))
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) # 获取分簇的数目
print('分簇的数目: %d' % n_clusters_)
print("轮廓系数: %0.3f" % metrics.silhouette_score(X, labels)) #轮廓系数评价聚类的好坏
for i in range(n_clusters_):
  print('簇 ', i, '的所有样本:')
  one_cluster = X[labels == i]
  print(one_cluster)
  plt.plot(one_cluster[:,0],one_cluster[:,1],'o')
plt.show()

到此这篇关于python实现密度聚类(模板代码+sklearn代码)的文章就介绍到这了,更多相关python 密度聚类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
关于Keras Dense层整理
May 21 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
python中如何写类
Jun 29 Python
Python创建临时文件和文件夹
Aug 05 Python
Django中文件上传和文件访问微项目的方法
Apr 27 #Python
详解Python中namedtuple的使用
Apr 27 #Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 #Python
使用python实现微信小程序自动签到功能
Apr 27 #Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 #Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 #Python
python logging通过json文件配置的步骤
Apr 27 #Python
You might like
咖啡的传说和历史
2021/03/03 新手入门
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
php 常用类整理
2009/12/23 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
ThinkPHP模型详解
2015/07/27 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
Prototype Array对象 学习
2009/07/19 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Django 路由控制的实现代码
2018/11/08 Python
Python饼状图的绘制实例
2019/01/15 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
ddl,dml和dcl的含义
2016/05/08 面试题
护士优质服务演讲稿
2014/08/26 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server