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根据经纬度计算距离示例
Feb 16 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python检测生僻字的实现方法
Oct 23 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 Python
Django自定义认证方式用法示例
Jun 23 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
python做接口测试的必要性
Nov 20 Python
python绘制雪景图
Dec 16 Python
Python通过len函数返回对象长度
Oct 22 Python
Python语言中的数据类型-序列
Feb 24 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
常用的php对象类型判断
2008/08/27 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
php中使用GD库做验证码
2016/03/31 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Python3实现购物车功能
2018/04/18 Python
python脚本实现验证码识别
2018/06/07 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
创业计划书的主要内容有哪些
2014/01/29 职场文书
个人校本研修方案
2014/05/26 职场文书
庆祝国庆节标语
2014/10/09 职场文书
自我评价优缺点范文
2015/03/11 职场文书
教师节座谈会主持词
2015/07/03 职场文书