三维点云学习(4)5-DBSCNA python 复现-1- 距离矩阵法

代码参考,及伪代码参考:
DBSCAN 对点云障碍物聚类
使用Kdtree加速的DBSCAN进行点云聚类
DBSCAN 课程笔记回顾

使用DBSCAN聚类最终效果图

原图:

DBSCAN 聚类后结果

运行时间:

生成的聚类个数:4
dbscan time:19.526319Process finished with exit code 0

DBSCAN-使用距离矩阵法-编写流程

step1: 建立数据集中每个点两两点的距离矩阵,距离矩阵为对角矩阵,对角线为0
step2: 通过 eps半径 Minpts:最小样本点数 的判定,找出所有核心点
step3: 进行聚类

代码块

建立距离矩阵代码块:

#构建距离矩阵
def mydistanceMarix(data):S = np.zeros((len(data), len(data)))  # 初始化 关系矩阵 w 为 nn的矩阵# step1 建立关系矩阵, 每个节点都有连线,权重为距离的倒数for i in range(len(data)):  # i:行for j in range(len(data)):  # j:列S[i][j] = np.linalg.norm(data[i] - data[j])  # 二范数计算两个点直接的距离,两个点之间的权重为之间距离的倒数return S

DBSCAN代码块:

def DBSCAN(data, eps, Minpts):"""基于密度的点云聚类:param d_bbox: 点与点之间的距离矩阵:param eps:  最大搜索直径阈值:param Minpts:  最小包含其他对象数量阈值:return: 返回聚类结果,是一个嵌套列表,每个子列表就是这个区域的对象的序号"""# 先求距离d_bbox = my_distance_Marix(data)#step1 初始化核心对象集合T,聚类个数k,聚类集合C, 未访问集合PT = set()    #set 集合k = 0        #类初始化C = []       #聚类集合unvisited = set(range(d_bbox.shape[0]))   #初始化未访问集合#step2 通过判断,两点得 distance 找出所有核心点for d in range(d_bbox.shape[0]):if np.sum(d_bbox[d,:] <= eps) >= Minpts:     #临近点数 > min_sample,加入核心点T.add(d)    #最初得核心点#step3 聚类while len(T):     #visited core ,until all core points were visitedunvisited_old = unvisited     #更新为访问集合core = list(T)[np.random.randint(0,len(T))]    #从 核心点集T 中随机选取一个 核心点coreunvisited = unvisited - set([core])      #把核心点标记为 visited,从 unvisited 集合中剔除visited = []visited.append(core)while len(visited):new_core = visited[0]new_core_nearest = np.where(d_bbox[new_core,:] <= eps)[0]   #获取new_core 得邻近点if len(new_core_nearest) >= Minpts:S = unvisited & set(new_core_nearest)    #当前 核心对象的nearest 与 unvisited 的交集visited +=  (list(S))                     #对该new core所能辐射的点,再做检测unvisited = unvisited - S          #unvisited 剔除已 visited 的点visited.remove(new_core)                     #new core 已做检测,去掉new corek += 1   #类个数cluster = unvisited_old -  unvisited    #原有的 unvisited # 和去掉了 该核心对象的密度可达对象的visited就是该类的所有对象T = T - cluster  #去掉该类对象里面包含的核心对象C.append(cluster)  #把对象加入列表print("生成的聚类个数:%d" %k)return C,k

生成仿真数据代码块

# 生成仿真数据
def generate_X(true_Mu, true_Var):# 第一簇的数据num1, mu1, var1 = 400, true_Mu[0], true_Var[0]X1 = np.random.multivariate_normal(mu1, np.diag(var1), num1)# 第二簇的数据num2, mu2, var2 = 600, true_Mu[1], true_Var[1]X2 = np.random.multivariate_normal(mu2, np.diag(var2), num2)# 第三簇的数据num3, mu3, var3 = 1000, true_Mu[2], true_Var[2]X3 = np.random.multivariate_normal(mu3, np.diag(var3), num3)# 合并在一起X = np.vstack((X1, X2, X3))# 显示数据plt.figure(figsize=(10, 8))plt.axis([-10, 15, -5, 15])plt.scatter(X1[:, 0], X1[:, 1], s=5)plt.scatter(X2[:, 0], X2[:, 1], s=5)plt.scatter(X3[:, 0], X3[:, 1], s=5)#plt.show()return X

完整代码

注意:最后显示的是三个类,实际生成类的个数未知,因而入股哦生成类小于三个,显示部分会报错,需要稍微修改或重新运行

# 文件功能:实现 Spectral 谱聚类 算法
from numpy import *
from numpy.random import rand
import matplotlib.pyplot as plt
import  timeplt.style.use('seaborn')# matplotlib显示点云函数
def Point_Show(point,color):x = []y = []point = np.asarray(point)for i in range(len(point)):x.append(point[i][0])y.append(point[i][1])plt.scatter(x, y,color=color)#构建距离矩阵
def my_distance_Marix(data):S = np.zeros((len(data), len(data)))  # 初始化 关系矩阵 w 为 n*n的矩阵# step1 建立关系矩阵, 每个节点都有连线,权重为距离的倒数for i in range(len(data)):  # i:行for j in range(len(data)):  # j:列S[i][j] = np.linalg.norm(data[i] - data[j])  # 二范数计算两个点直接的距离,两个点之间的权重为之间距离的倒数return S# @profile
def DBSCAN(data, eps, Minpts):"""基于密度的点云聚类:param d_bbox: 点与点之间的距离矩阵:param eps:  最大搜索直径阈值:param Minpts:  最小包含其他对象数量阈值:return: 返回聚类结果,是一个嵌套列表,每个子列表就是这个区域的对象的序号"""# 先求距离d_bbox = my_distance_Marix(data)#step1 初始化核心对象集合T,聚类个数k,聚类集合C, 未访问集合PT = set()    #set 集合k = 0        #类初始化C = []       #聚类集合unvisited = set(range(d_bbox.shape[0]))   #初始化未访问集合#step2 通过判断,两点得 distance 找出所有核心点for d in range(d_bbox.shape[0]):if np.sum(d_bbox[d,:] <= eps) >= Minpts:     #临近点数 > min_sample,加入核心点T.add(d)    #最初得核心点#step3 聚类while len(T):     #visited core ,until all core points were visitedunvisited_old = unvisited     #更新为访问集合core = list(T)[np.random.randint(0,len(T))]    #从 核心点集T 中随机选取一个 核心点coreunvisited = unvisited - set([core])      #把核心点标记为 visited,从 unvisited 集合中剔除visited = []visited.append(core)while len(visited):new_core = visited[0]new_core_nearest = np.where(d_bbox[new_core,:] <= eps)[0]   #获取new_core 得邻近点if len(new_core_nearest) >= Minpts:S = unvisited & set(new_core_nearest)    #当前 核心对象的nearest 与 unvisited 的交集visited +=  (list(S))                     #对该new core所能辐射的点,再做检测unvisited = unvisited - S          #unvisited 剔除已 visited 的点visited.remove(new_core)                     #new core 已做检测,去掉new corek += 1   #类个数cluster = unvisited_old -  unvisited    #原有的 unvisited # 和去掉了 该核心对象的密度可达对象的visited就是该类的所有对象T = T - cluster  #去掉该类对象里面包含的核心对象C.append(cluster)  #把对象加入列表print("生成的聚类个数:%d" %k)return C,k
# 生成仿真数据
def generate_X(true_Mu, true_Var):# 第一簇的数据num1, mu1, var1 = 400, true_Mu[0], true_Var[0]X1 = np.random.multivariate_normal(mu1, np.diag(var1), num1)# 第二簇的数据num2, mu2, var2 = 600, true_Mu[1], true_Var[1]X2 = np.random.multivariate_normal(mu2, np.diag(var2), num2)# 第三簇的数据num3, mu3, var3 = 1000, true_Mu[2], true_Var[2]X3 = np.random.multivariate_normal(mu3, np.diag(var3), num3)# 合并在一起X = np.vstack((X1, X2, X3))# 显示数据plt.figure(figsize=(10, 8))plt.axis([-10, 15, -5, 15])plt.scatter(X1[:, 0], X1[:, 1], s=5)plt.scatter(X2[:, 0], X2[:, 1], s=5)plt.scatter(X3[:, 0], X3[:, 1], s=5)#plt.show()return Xif __name__ == '__main__':# 生成数据true_Mu = [[0.5, 0.5], [5.5, 2.5], [1, 7]]true_Var = [[1, 3], [2, 2], [6, 2]]X = generate_X(true_Mu, true_Var)begin_t = time.time()index,k = DBSCAN(X,eps=0.5,Minpts=15)dbscan_time = time.time() - begin_tprint("dbscan time:%f" %dbscan_time)cluster = [[] for i in range(k)]for i in range(k):cluster[i] = [X[j] for j in index[i]]Point_Show(cluster[0],color="red")Point_Show(cluster[1], color="orange")Point_Show(cluster[2],color="blue")plt.show()# dbscan.fit(X)# K = 3# spectral.fit(X)# cat = spectral.predict(X)# print(cat)# cluster =[[] for i in range(K)]# for i in range(len(X)):#     if cat[i] == 0:#         cluster[0].append(X[i])#     elif cat[i] == 1:#         cluster[1].append(X[i])#     elif cat[i] == 2:#         cluster[2].append(X[i])# Point_Show(cluster[0],color="red")# Point_Show(cluster[1], color="orange")# Point_Show(cluster[2],color="blue")# plt.show()

三维点云学习(4)5-DBSCNA python 复现-1- 距离矩阵法相关推荐

  1. 三维点云学习(4)5-DBSCNA python 复现-2-kd-_tree加速

    三维点云学习(4)5-DBSCNA python 复现-2-kd-tree加速 因为在上一章DBSCAN在构建距离矩阵时,需要构建一个NN的距离矩阵,严重占用资源,古采用kd_tree搜索进行进一步的 ...

  2. 三维点云学习(4)5-DBSCNA python 复现-3-kd-tree radius NN 三方库 scipy 与 sklearn速度比较

    三维点云学习(4)5-DBSCNA python 复现-3-kd-tree radius NN 三方库 scipy 与 sklearn速度比较 import from scipy.spatial im ...

  3. 三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较

    三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较 回顾: 实现ransac地面分割 DBSCNA python 复现-1- 距离矩阵法 DBSCNA python 复现-2-kd- ...

  4. 三维点云学习(3)7- 实现GMM

    三维点云学习(3)7- 实现GMM github大神参考代码 高斯混合模型的通俗理解 GMM课程个人总结笔记 最终效果图 原图 进行高斯聚类后的图 代码编写流程 1.输入数据集x1 x2 -xn,和K ...

  5. 三维点云学习(1)上-PCA主成分分析 法向量估计

    三维点云学习(1)上 环境安装 1.系统环境 win10 或者 ubuntu 2. Anaconda3+python3.6 使用Anaconda创建的conda虚拟环境进行python的编写 环境安装 ...

  6. 三维点云学习(9)5-实现RANSAC Registration配准

    三维点云学习(9)5-实现RANSAC Registration配准 参考博客: 机器视觉之 ICP算法和RANSAC算法 三维点云配准 ICP点云配准原理及优化 本章因个人能力有限,大部分代码摘自g ...

  7. 三维点云学习(5)5-实现Deeplearning-PointNet-2-classfication

    三维点云学习(5)5-实现Deeplearning-PointNet-2-classfication Github PointNet源码 数据集下载:为40种物体的三维点云数据集 提取码:es14 运 ...

  8. 三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取

    三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取 Github PointNet源码 数据集下载:为40种物体的三维点云数据集 提取码:es14 因为本人初次 ...

  9. 三维点云学习(5)3-Deep learning for Point Cloud-PointNet++

    三维点云学习(5)3-Deep learning for Point Cloud-PointNet++ 强烈推荐 PointNet的深刻理解 PointNet++示意图 可分为 Encoder. Se ...

最新文章

  1. 微信小程序直播如何接入?开源代码接入案例分享
  2. Android之选项菜单创建
  3. 项目总结(二)-一些常用的工具浅谈
  4. c语言 sizeof_c语言详解sizeof
  5. LeetCode之Detect Capital
  6. c 语言 16进制写法,C语言16进制中16怎么表示?
  7. 程序员身体容易出什么毛病..
  8. 【SegMap: 3D Segment Mapping using Data-Driven Descriptors】
  9. 谈谈那些基础但不简单的股票数据
  10. socket 10106问题解决日记
  11. 使用 RSA 算法进行加解密,签名和验签
  12. 个人怎么申请微信公众号
  13. 4.STM32F407之HAL库——按键
  14. 转区系统开放艾欧尼亚转入服务器,【英雄联盟】转区系统开放艾欧尼亚转入服务...
  15. 2013c语言二级等级考试试题,计算机等级考试二级c语言考试试题
  16. 访客管理系统 - 天天访客
  17. mysql exit quit_MySQL数据库5.5基础 exit quit \q 退出MySQL数据库
  18. 后端程序员必备:mysql数据库相关流程图/原理图芬芬细雨
  19. 导航和地图解决方案行业研究及十四五规划分析报告
  20. Jenkins(10) 配置邮件通知

热门文章

  1. 解决 Chrome 下载不了东西 失败 - 已屏蔽 的问题
  2. 编写一个程序,从10亿个数字的数组中找出100个最大的数字
  3. 清除或重新创建Ruby on Rails数据库
  4. JavaScript等同于printf / String.Format
  5. win11不显示缩略图怎么办 windows11不显示缩略图的解决方法
  6. java 变量 安全访问_访问java变量
  7. Shell:export命令
  8. 端如何访问rc_如何进行 Linux 启动时间优化
  9. storyboard 苹果启动图_iOS LaunchScreen.storyboard启动图更新
  10. arcgis engine设置数据源路径_不用ArcGIS做前期分析,你是不是想被辞!