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 MySQLdb Linux下安装笔记
May 09 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
Python语言描述随机梯度下降法
Jan 04 Python
详解django.contirb.auth-认证
Jul 16 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
Python中SQLite如何使用
May 27 Python
Python实现查找数据库最接近的数据
Jun 08 Python
Python如何加载模型并查看网络
Jul 15 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
Django 中 cookie的使用
2017/08/17 PHP
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
js实现蒙版效果
2020/01/11 Javascript
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
Python 实现简单的客户端认证
2020/07/29 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
运动会800米加油稿
2014/02/22 职场文书
李开复演讲稿
2014/05/24 职场文书
委托书格式要求
2015/01/28 职场文书
公务员个人总结
2015/02/12 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
统招统分证明
2015/06/23 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle