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 相关文章推荐
django 常用orm操作详解
Sep 13 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python实现ip代理池功能示例
Jul 05 Python
python单例设计模式实现解析
Jan 07 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python 安装移动复制第三方库操作
Jul 13 Python
python 爬虫请求模块requests详解
Dec 04 Python
Python实现一个论文下载器的过程
Jan 18 Python
浅谈Python数学建模之固定费用问题
Jun 23 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
菜鸟学PHP之Smarty入门
2007/01/04 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
python采集百度百科的方法
2015/06/05 Python
Python 基础教程之包和类的用法
2017/02/23 Python
Python工程师面试必备25条知识点
2018/01/17 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
公司活动策划方案
2014/01/13 职场文书
实习鉴定评语
2014/01/19 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
有关爱国演讲稿
2014/05/07 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
租车协议书范本2014
2014/11/17 职场文书
大学学生个人总结
2015/02/15 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
分析Java中Map的遍历性能问题
2021/06/26 Java/Android