用python实现dbscan聚类算法方法你知道吗?
Admin 2021-08-20 群英技术资讯 621 次浏览
这篇文章主要给大家分享用python实现dbscan聚类算法,对大家理解DBSCAN 算法具有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获。
DBSCAN 算法是一种基于密度的空间聚类算法。该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值。DBSCAN 算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:
1. 当数据量增大时,要求较大的内存支持 I/0 消耗也很大;
2. 当空间聚类的密度不均匀、聚类间距离相差很大时,聚类质量较差。
DBSCAN算法的聚类过程
DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为: 任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象所组成的集合构成了一个完整的聚类C,且p属于C。
先上结果
先根据给定的半径 r 确定中心点,也就是这类点在半径r内包含的点数量 n 大于我们的要求(n>=minPionts)
然后遍历所有的中心点,将互相可通达的中心点与其包括的点分为一组
全部分完组之后,没有被纳入任何一组的点就是离群点啦!
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets
def cuircl(pointA,pointB): distance = np.sqrt(np.sum(np.power(pointA - pointB,2))) return distance
def firstCluster(dataSets,r,include): cluster = [] m = np.shape(dataSets)[0] ungrouped = np.array([i for i in range (m)]) for i in range (m): tempCluster = [] #第一位存储中心点簇 tempCluster.append(i) for j in range (m): if (cuircl(dataSets[i,:],dataSets[j,:]) < r and i != j ): tempCluster.append(j) tempCluster = np.mat(np.array(tempCluster)) if (np.size(tempCluster)) >= include: cluster.append(np.array(tempCluster).flatten()) #返回的是List center=[] n = np.shape(cluster)[0] for k in range (n): center.append(cluster[k][0]) #其他的就是非中心点啦 ungrouped = np.delete(ungrouped,center) #ungrouped为非中心点 return cluster,center,ungrouped
将所有中心点遍历并进行聚集
def clusterGrouped(tempcluster,centers): m = np.shape(tempcluster)[0] group = [] #对应点是否遍历过 position = np.ones(m) unvisited = [] #未遍历点 unvisited.extend(centers) #所有点均遍历完毕 for i in range (len(position)): coreNeihbor = [] result = [] #删除第一个 #刨去自己的邻居结点,这一段就类似于深度遍历 if position[i]: #将邻结点填入 coreNeihbor.extend(list(tempcluster[i][:])) position[i] = 0 temp = coreNeihbor #按照深度遍历遍历完所有可达点 #遍历完所有的邻居结点 while len(coreNeihbor) > 0 : #选择当前点 present = coreNeihbor[0] for j in range(len(position)): #如果没有访问过 if position[j] == 1: same = [] #求所有的可达点 if (present in tempcluster[j]): cluster = tempcluster[j].tolist() diff = [] for x in cluster: if x not in temp: #确保没有重复点 diff.append(x) temp.extend(diff) position[j] = 0 # 删掉当前点 del coreNeihbor[0] result.extend(temp) group.append(list(set(result))) i +=1 return group
核心算法完毕!
生成同心圆类型的随机数据进行测试
#生成非凸数据 factor表示内外圈距离比 X,Y1 = datasets.make_circles(n_samples = 1500, factor = .4, noise = .07) #参数选择,0.1为圆半径,6为判定中心点所要求的点个数,生成分类结果 tempcluster,center,ungrouped = firstCluster(X,0.1,6) group = clusterGrouped(tempcluster,center) #以下是分类后对数据进行进一步处理 num = len(group) voice = list(ungrouped) Y = [] for i in range (num): Y.append(X[group[i]]) flat = [] for i in range(num): flat.extend(group[i]) diff = [x for x in voice if x not in flat] Y.append(X[diff]) Y = np.mat(np.array(Y))
绘图~
color = ['red','blue','green','black','pink','orange'] for i in range(num): plt.scatter(Y[0,i][:,0],Y[0,i][:,1],c=color[i]) plt.scatter(Y[0,-1][:,0],Y[0,-1][:,1],c = 'purple') plt.show()
结果
紫色点就是离散点
以上就是关于python实现dbscan算法的介绍,上述代码仅供参考,希望本文对大家学习python有帮助,想要了解更多python dbscan聚类算法的内容,大家可以继续关注其他相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式:pack,grid,place。注意这三种布局管理在同一个 master window 里一定不可以混用! 布局管理有以下功能:
这篇文章主要介绍了Python如何读取16进制byte数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
字典(dictionary)我们都曾经使用过语言词典来查找不认识的单词的定义。语言词典针对给定的单词(比如 python)提供一组标准的信息。这种
这篇文章主要介绍了Django表单外键选项初始化的问题及解决方法,需本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,要的朋友可以参考下
大家都知道数组array是同类型数据的有限集合,列表list是一系列按特定顺序排列的元素组成,可以将任何数据放入列表,且其中元素之间没有任何关系,本文介绍python中数组array和列表list的基本用法及区别,感兴趣的朋友一起看看吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008