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两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
python算法演练_One Rule 算法(详解)
May 17 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
Python 创建空的list,以及append用法讲解
May 04 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
pandas计数 value_counts()的使用
Jun 24 Python
python代码编写计算器小程序
Mar 30 Python
Python将string转换到float的实例方法
Jul 29 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
php防止sql注入代码实例
2013/12/18 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
Javascript调用C#代码
2011/01/17 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
Python os模块介绍
2014/11/30 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python实现AES加密和解密
2019/03/27 Python
如何在django中添加日志功能
2020/02/06 Python
python实现FTP循环上传文件
2020/03/20 Python
恒华伟业笔试面试题
2015/02/26 面试题
数控专业毕业生自荐信范文
2014/03/04 职场文书
党建工作经验交流材料
2014/05/25 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
质检员岗位职责
2015/02/03 职场文书
责任书范本大全
2015/05/11 职场文书
Fluentd搭建日志收集服务
2022/09/23 Servers