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的词法分析与语法分析
May 18 Python
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
Python 高级专用类方法的实例详解
Sep 11 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
python os用法总结
Jun 08 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
如何利用python实现Simhash算法
Jun 28 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
建立动态的WML站点(一)
2006/10/09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
5 cool javascript apps
2007/03/24 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python 定时器每天就执行一次的实现代码
2019/08/14 Python
python word转pdf代码实例
2019/08/16 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
python跨文件使用全局变量的实现
2020/11/17 Python
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
党员自我评价分享
2013/12/13 职场文书
大学生村官演讲稿
2014/04/25 职场文书
优秀教研组申报材料
2014/12/26 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers