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入门篇之文件
Oct 20 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
详解Python import方法引入模块的实例
Aug 02 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
Python作用域和名称空间的详细介绍
Apr 13 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
php中去除所有js,html,css代码
2010/10/12 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python实现反转部分单向链表
2018/09/27 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
C/C++程序员常见面试题一
2012/12/08 面试题
函授大专自我鉴定
2013/11/01 职场文书
学校办公室主任职责
2013/12/27 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
环保志愿者活动方案
2014/08/14 职场文书
保外就医申请书范文
2015/08/06 职场文书
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS