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 28 Python
Python yield 使用浅析
May 28 Python
python3操作mysql数据库的方法
Jun 23 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Python如何实现邮件功能
May 27 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
Django rest framework如何自定义用户表
Jun 09 Python
利用python进行数据加载
Jun 20 Python
python ansible自动化运维工具执行流程
Jun 24 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
php读取3389的脚本
2014/05/06 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
python中引用与复制用法实例分析
2015/06/04 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python配置grpc环境
2019/01/01 Python
python线程里哪种模块比较适合
2020/08/02 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
老师自我鉴定范文
2013/12/25 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
有趣的广告词
2014/03/18 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
服务承诺书怎么写
2014/05/24 职场文书
小学生教师节广播稿
2015/08/19 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang