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多进程编程技术实例分析
Sep 16 Python
详解Python中for循环的使用
Apr 14 Python
virtualenv实现多个版本Python共存
Aug 21 Python
简述Python2与Python3的不同点
Jan 21 Python
python字典快速保存于读取的方法
Mar 23 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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
phpinfo 系统查看参数函数代码
2009/06/05 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
零基础php编程好学吗
2019/10/11 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
简单学习vue指令directive
2016/11/03 Javascript
几种tab切换详解
2017/02/03 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python中拆分字符串的操作方法
2019/07/23 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
python 实现有道翻译功能
2021/02/26 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
培训计划通知
2015/07/15 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers