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中的__init__和__new__
Mar 12 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
详解python中@的用法
Mar 27 Python
python实现月食效果实例代码
Jun 18 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
如何在Win10系统使用Python3连接Hive
Oct 15 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
Python实现Hash算法
Mar 18 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
PHP5中虚函数的实现方法分享
2011/04/20 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
用Python编写web API的教程
2015/04/30 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
python集合的新增元素方法整理
2020/12/07 Python
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
2014年房地产销售工作总结
2014/12/01 职场文书
中秋节慰问信
2015/02/15 职场文书
英文版辞职信
2015/02/28 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电