open3d k-means 聚类

news/发布时间2024/5/18 15:48:36

k-means 聚类

      • 一、算法原理
          • 1、介绍
          • 2、算法步骤
      • 二、代码
          • 1、机器学习生成`kmeans`聚类
          • 2、点云学习生成聚类
      • 三、结果
          • 1、原点云
          • 2、机器学习生成`kmeans`聚类
          • 3、点云学习生成聚类
      • 四、相关链接

一、算法原理

1、介绍

K-means聚类算法是一种无监督学习算法,主要用于数据聚类。该算法的主要目标是找到一个数据点的划分,使得每个数据点与其所在簇的质心(即该簇所有数据点的均值)之间的平方距离之和最小。

​ 在K-means聚类算法中,首先需要预定义簇的数量K,然后随机选择K个对象作为初始的聚类中心。接着,算法会遍历数据集中的每个对象,根据对象与各个聚类中心的距离,将每个对象分配给距离它最近的聚类中心。完成一轮分配后,算法会重新计算每个簇的聚类中心,新的聚类中心是该簇所有对象的均值。这个过程会不断重复,直到满足某个终止条件,如没有(或最小数目)对象被重新分配给不同的簇,没有(或最小数目)簇的中心再发生变化,或者误差平方和局部最小。

2、算法步骤

在这里插入图片描述

二、代码

1、机器学习生成kmeans聚类
# -*- coding: utf-8 -*-import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn import clusterdef KMeans():# KMeans聚类,非监督pcd_path = r"res/bunny.pcd"pcd = o3d.io.read_point_cloud(pcd_path)pcd = o3d.geometry.PointCloud(pcd)o3d.visualization.draw_geometries([pcd])print(pcd)# 对点云数据进行着色操作,使其所有点的颜色相同,颜色为 [0, 0, 0]pcd.paint_uniform_color(color=[0, 0, 0]) n_clusters = 3  # 聚类簇数# 将点云数据转换为 numpy 数组,并使用 sklearn 的 KMeans 进行聚类points = np.asarray(pcd.points)print(points)kmeans = cluster.KMeans(n_clusters=n_clusters, random_state=42, n_init=10, init="k-means++")kmeans.fit(points)  # 获取聚类结果,这里主要是每个点的类别标签labels = kmeans.labels_# 随机生成一些颜色,然后根据类别标签将这些颜色分配给对应的点colors = np.random.randint(0, 255, size=(n_clusters, 3)) / 255colors = colors[labels]# 对原始的点云数据做一个深度拷贝,并将这个拷贝的每个点的位置向下移动50个单位。这是为了在可视化时更清楚地看到聚类效果pcd_cluster = deepcopy(pcd)pcd_cluster.translate([50, 0, 0])# 将新生成的颜色赋值给拷贝的点云数据pcd_cluster.colors = o3d.utility.Vector3dVector(colors)o3d.visualization.draw_geometries([pcd_cluster])if __name__ == "__main__":KMeans()
2、点云学习生成聚类
import numpy as np
import open3d as o3d
import copy
from matplotlib import pyplot as plt# 在点云上添加分类标签
def draw_labels_on_model(pcl, labels):cmap = plt.get_cmap("tab20")pcl_temp = copy.deepcopy(pcl)max_label = labels.max()colors = cmap(labels / (max_label if max_label > 0 else 1))pcl_temp.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcl_temp])# 计算欧氏距离
def euclidean_distance(one_sample, X):# 将one_sample转换为一纬向量one_sample = one_sample.reshape(1, -1)# 把X转换成一维向量X = X.reshape(X.shape[0], -1)# 这是用来确保one_sample的尺寸与X相同distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1)return distancesclass Kmeans(object):# 构造函数def __init__(self, k=2, max_iterations=1500, tolerance=0.00001):self.k = kself.max_iterations = max_iterationsself.tolerance = tolerance# 随机选取k个聚类中心点def init_random_centroids(self, X):# save the shape of Xn_samples, n_features = np.shape(X)# make a zero matrix to store valuescentroids = np.zeros((self.k, n_features))# 因为有k个中心点,所以执行k次循环for i in range(self.k):# 随机选取范围内的值centroid = X[np.random.choice(range(n_samples))]centroids[i] = centroidreturn centroids# 查找距离样本点最近的中心def closest_centroid(self, sample, centroids):distances = euclidean_distance(sample, centroids)# np.argmin 返回距离最小值的下标closest_i = np.argmin(distances)return closest_i# 确定聚类def create_clusters(self, centroids, X):# 这是为了构造用于存储集群的嵌套列表clusters = [[] for _ in range(self.k)]for sample_i, sample in enumerate(X):centroid_i = self.closest_centroid(sample, centroids)clusters[centroid_i].append(sample_i)return clusters# 基于均值算法更新质心def update_centroids(self, clusters, X):n_features = np.shape(X)[1]centroids = np.zeros((self.k, n_features))for i, cluster in enumerate(clusters):centroid = np.mean(X[cluster], axis=0)centroids[i] = centroidreturn centroids# 获取标签def get_cluster_labels(self, clusters, X):y_pred = np.zeros(np.shape(X)[0])for cluster_i, cluster in enumerate(clusters):for sample_i in cluster:y_pred[sample_i] = cluster_ireturn y_pred# 预测标签def predict(self, X):# 随机选取中心点centroids = self.init_random_centroids(X)for _ in range(self.max_iterations):# 对所有点进行聚类clusters = self.create_clusters(centroids, X)former_centroids = centroids# 计算新的聚类中心centroids = self.update_centroids(clusters, X)# 判断是否满足收敛diff = centroids - former_centroidsif diff.any() < self.tolerance:breakreturn self.get_cluster_labels(clusters, X)if __name__ == "__main__":#  加载点云pcd = o3d.io.read_point_cloud('res/bunny.pcd')points = np.asarray(pcd.points)o3d.visualization.draw_geometries([pcd])# 执行K-means聚类clf = Kmeans(k=3)labels = clf.predict(points)# 可视化聚类结果draw_labels_on_model(pcd, labels)

三、结果

1、原点云

在这里插入图片描述

2、机器学习生成kmeans聚类

在这里插入图片描述

3、点云学习生成聚类

在这里插入图片描述

四、相关链接

机器学习参考:【Lidar】Open3D点云K-Means聚类算法:基于距离的点云聚类(单木分割)附Python代码_单木分割python代码-CSDN博客

点云学习:Open3D Kmeans点云聚类(python详细过程版)_点云k-means聚类pcl-python-CSDN博客

DBSCAN 聚类:open3d DBSCAN 聚类-CSDN博客

k-means算法介绍:【机器学习】K-means(非常详细) - 知乎 (zhihu.com)

百度网盘数据集:

包括 obj,pcd,las,png,ply

百度网盘链接:https://pan.baidu.com/s/1JFxKUk_xMcEmpfBHtuC-Pg
提取码:cpev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/HPwu/2098.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

[嵌入式系统-28]:开源的虚拟机监视器和仿真器:QEMU(Quick EMUlator)与VirtualBox、VMware Workstation的比较

目录 一、QEMU概述 1.1 QEMU架构 1.2 QEMU概述 1.3 什么时候需要QEMU 1.4 QEMU两种操作模式 1.5 QEMU模拟多种CPU架构 二、QEMU与其他虚拟机的比较 2.1 常见的虚拟化技术 2.1 Linux KVM 2.2 Windows VirtualBox 2.3 Windows VMware workstation 三、VirtualBox、VM…

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…

FISCO BCOS(十七)利用脚本进行区块链系统监控

要利用脚本进行区块链系统监控&#xff0c;你可以使用各种编程语言编写脚本&#xff0c;如Python、Shell等 利用脚本进行区块链系统监控可以提高系统的稳定性、可靠性&#xff0c;并帮助及时发现和解决潜在问题&#xff0c;从而确保区块链网络的正常运行。本文可以利用脚本来解…

day09-MongoDB

文章目录 day09-MongoDB一、回顾1.1. 行为实战核心要点说明 二、评论系统2.1 MongoDB2.1.1 MongoDB简介①简介②体系结构与术语 2.1.2 安装与连接2.1.3 Springboot整合MongoDB①引入依赖②添加服务端配置③准备实体类④测试-新增⑤测试-查询⑥测试-更新测试-删除 2.2 app端评论…

fastApi笔记04-查询参数和字符串校验

额外校验 使用Query可以对查询参数添加校验 from typing import Unionfrom fastapi import FastAPI, Queryapp FastAPI()app.get("/items/") async def read_items(q: Union[str, None] Query(defaultNone, max_length50)):results {"items": [{"…

Java,SpringBoot项目中,Postman的测试方法。

目录 展示查询搜索 根据id展示数据 根据id删除数据 根据id更新数据 添加数据 展示查询搜索 // 根据姓名分页查询用户GetMapping("/getUsersByName")public IPage<User> getUsersByName(RequestParam(defaultValue "1") Long current,RequestPar…

Vue-route核心知识整理

目录 1 相关理解 1.1 对 vue-router 的理解 1.2 对 SPA 应用的理解 1.3 对路由的理解 1.3.1 什么是路由&#xff1f; 1.3.2 路由的分类 2 几个注意点 3 路由的基本使用 4 嵌套 (多级) 路由 5 路由传参 5.1 query 方式传参 5.1.1 跳转路由并携带query参数&#xff0…

32单片机基础:OLED调试工具的使用

下面会介绍OLED显示屏的驱动函数模块&#xff0c;先学会如何使用&#xff0c;至于OLED屏幕的原理和代码编写&#xff0c; 我们之后会再写一篇。 现在我们就是用OLED当一个调试的显示屏&#xff0c;方便我们调试程序。 为什么要调试呢&#xff0c;是为了方便我们看现象&#…

深度学习在时间序列预测的总结和未来方向分析

2023年是大语言模型和稳定扩散的一年&#xff0c;时间序列领域虽然没有那么大的成就&#xff0c;但是却有缓慢而稳定的进展。Neurips、ICML和AAAI等会议都有transformer 结构(BasisFormer、Crossformer、Inverted transformer和Patch transformer)的改进&#xff0c;还出现了将…

四川宏博蓬达法律咨询有限公司守护您的法律安全

在法治社会日益完善的今天&#xff0c;法律咨询服务的需求日益增长。四川宏博蓬达法律咨询有限公司作为一家专业的法律服务机构&#xff0c;始终致力于为客户提供全面、高效、安全的法律服务&#xff0c;为社会和谐稳定贡献自己的力量。 一、专业团队&#xff0c;铸就信赖 四川…

数据模型概念

一、概念 (1) 定义 在数据库系统中针对不同的使用对象和应用目的&#xff0c;采用不同的数据模型。根据模型的应用的不同目的&#xff0c;可以将这些模型划分为两类&#xff1a; (2) 分类 A&#xff1a;概念数据模型 它也称信息模型它是按用户的观点&#xff08;观念世界&…

【转载】企业资产收集与脆弱性检查工具

简介 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户管理互联网资产攻击面的 SaaS 化订阅服务产品。可实现对备案域名、子域名、IP、端口、服务、网站、漏洞、安全风险等场景进行周期性监控&#xff0c;支持多维度分析攻击面。利用可视化…

相机图像质量研究(33)常见问题总结:图像处理对成像的影响--锯齿

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Leetcode 283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

OpenAI Sora引领AI跳舞视频新浪潮:字节跳动发布创新舞蹈视频生成框架

OpenAI的Sora已经引起广泛关注&#xff0c;预计今年AI跳舞视频将在抖音平台上大放异彩。下面将为您详细介绍一款字节跳动发布的AI视频动画框架。 技术定位&#xff1a;这款框架采用先进的diffusion技术&#xff0c;专注于生成人类舞蹈视频。它不仅能够实现人体动作和表情的迁移…

Redis为什么快?

1. Redis单线程指的什么&#xff1f; Redis单线程是指命令处理是在一个单线程中处理的。 Redis本身是单线程的&#xff0c;即redis-server只有一个主线程来处理所有的命令请求和数据操作。但是&#xff0c;Redis在处理IO密集型任务时会使用多线程来提高效率。 在Redis中&…

linux调用so库之一

任务&#xff1a;linux系统&#xff0c;已经生成so库&#xff0c;需要调用。 参考文献&#xff1a; Linux 调用动态库&#xff08;.SO文件&#xff09;总结_linux deviceio.so-CSDN博客 可以看他的第一部分&#xff0c;即显式调用。但是会报错&#xff0c;我的版本是64位的U…

[经验] 什么是鄱阳湖旅游最主要的景点 #知识分享#知识分享

什么是鄱阳湖旅游最主要的景点 鄱阳湖是中国最大的淡水湖&#xff0c;位于江西省北部和湖南省南部。鄱阳湖旅游资源丰富&#xff0c;景色秀美&#xff0c;是游客游览江西最热门的旅游胜地之一。在所有的景点中&#xff0c;以下是鄱阳湖旅游中最主要的景点。 景点一&#xff1…

【学习笔记】算法学习01:复杂度分析

学习地址Hello算法&#xff1a;https://www.hello-algo.com/ 文章目录 一、复杂度分析1.1 时间复杂度1.1.1 时间复杂度分析有哪些特点&#xff1f;1.1.2 计算方法&#xff1a;1.1.3 常见类型的时间复杂度&#xff1a;1.1.4 最差、最佳、平均时间复杂度 1.2 空间复杂度1.2.1 算法…

用HTML和CSS打造跨年烟花秀视觉盛宴

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>跨年烟花秀</title><meta name"viewport" content"widthdevi…
推荐文章