KMeans等其他聚类算法

KMeans算法是一种经典的聚类方法,最早由Stuart Lloyd在1957年提出,并在1982年由J. MacQueen推广和普及。虽然KMeans已经有几十年的历史,但它依然是数据挖掘和机器学习领域中最常用的聚类算法之一。

数学原理

KMeans算法的目标是将数据集分成(k)个簇,每个簇的中心(质心)是该簇中所有点的平均值。算法的步骤如下:

  1. 初始化:随机选择(k)个初始质心。

  2. 分配数据点:将每个数据点分配到距离最近的质心。

  3. 更新质心:重新计算每个簇的质心,即该簇中所有点的平均值。

  4. 重复步骤2和3,直到质心不再变化或达到最大迭代次数。

用数学公式表示为:

  1. 初始质心:

  2. 分配数据点:

  3. 更新质心:

其中,表示第个簇的质心,表示第个簇,表示欧几里德距离。

其他聚类算法简要介绍

OPTICS(Ordering Points To Identify the Clustering Structure)

OPTICS算法通过分析数据点的可达性图来识别不同密度的簇,非常适合处理具有不同密度的复杂数据集。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import OPTICSif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd1 = deepcopy(pcd)points = np.array(pcd1.points)result = OPTICS(min_samples=2, max_eps=5).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd1.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd1], window_name="OPTICS 点云聚类", width=800, height=600)

图片

Spectral Clustering

Spectral Clustering利用数据的特征值和特征向量,将数据映射到一个低维空间中进行聚类,适合处理非凸形状的簇。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import SpectralClusteringif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd2 = deepcopy(pcd)points = np.array(pcd2.points)result = SpectralClustering(n_clusters=8).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd2.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd2], window_name="Spectral Clustering 点云聚类", width=800, height=600)

图片

Hierarchical Clustering

Hierarchical Clustering分为凝聚层次聚类和分裂层次聚类,创建一棵树状结构(树状图)来表示数据点之间的层次关系。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import AgglomerativeClusteringif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd3 = deepcopy(pcd)points = np.array(pcd3.points)result = AgglomerativeClustering(n_clusters=8).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd3.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd3], window_name="Hierarchical Clustering 点云聚类", width=800, height=600)

图片

Mean-shift

Mean-shift是一种基于密度的聚类方法,通过滑动窗口找到数据点密度的峰值,非常适合处理形状不规则的簇。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import estimate_bandwidth, MeanShiftif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd4 = deepcopy(pcd)points = np.array(pcd4.points)bandwidth = estimate_bandwidth(points, quantile=0.2, n_samples=500)result = MeanShift(bandwidth=bandwidth).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd4.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd4], window_name="Mean-shift 点云聚类", width=800, height=600)

图片

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)

BIRCH算法通过构建一个高度平衡的树结构,进行逐步聚类,适用于大规模数据集。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import Birchif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd5 = deepcopy(pcd)points = np.array(pcd5.points)result = Birch(n_clusters=8).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd5.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd5], window_name="BIRCH 点云聚类", width=800, height=600)

图片

Affinity Propagation

Affinity Propagation通过传递“信息”在数据点之间找到一组最能代表其他数据点的“示例”,不需要预先指定簇的数量。

import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import AffinityPropagationif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)  # 每10个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色print(pcd)pcd6 = deepcopy(pcd)points = np.array(pcd6.points)result = AffinityPropagation(preference=-20).fit(points)labels = result.labels_max_label = np.max(labels) + 1colors = np.random.randint(255, size=(max_label+1, 3)) / 255.colors = colors[labels]colors[labels < 0] = 0  # 没有分类成功的点设置为黑色pcd6.colors = o3d.utility.Vector3dVector(colors[:, :3])o3d.visualization.draw_geometries([pcd6], window_name="Affinity Propagation 点云聚类", width=800, height=600)

图片

以上所有的聚类算法同时对目标点云数据进行聚类的结果如下:

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""import open3d as o3d
import numpy as np
from copy import deepcopy
from sklearn.cluster import OPTICS, SpectralClustering, AgglomerativeClustering, estimate_bandwidth, MeanShift, Birch, AffinityPropagationif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd = pcd.uniform_down_sample(10)#每50个点采样一次pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色print(pcd)pcd1 = deepcopy(pcd)pcd1.translate((20, 0, 0)) #整体进行x轴方向平移20points = np.array(pcd1.points)result = OPTICS(min_samples=2, max_eps=5).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd1.colors = o3d.utility.Vector3dVector(colors[:, :3])pcd2 = deepcopy(pcd)pcd2.translate((-20, 0, 0)) #整体进行x轴方向平移-20points = np.array(pcd2.points)result = SpectralClustering(n_clusters=8).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd2.colors = o3d.utility.Vector3dVector(colors[:, :3])pcd3 = deepcopy(pcd)pcd3.translate((0, 20, 0)) #整体进行y轴方向平移20points = np.array(pcd3.points)result = AgglomerativeClustering(n_clusters=8).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd3.colors = o3d.utility.Vector3dVector(colors[:, :3])pcd4 = deepcopy(pcd)pcd4.translate((0, -20, 0)) #整体进行y轴方向平移-20points = np.array(pcd4.points)#定义搜索半径,也可以直接初始化一个数值bandwidth = estimate_bandwidth(points, quantile=0.2, n_samples=500)result = MeanShift(bandwidth=bandwidth).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd4.colors = o3d.utility.Vector3dVector(colors[:, :3])pcd5 = deepcopy(pcd)pcd5.translate((40, 0, 0)) #整体进行x轴方向平移40points = np.array(pcd5.points)result = Birch(n_clusters=8).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd5.colors = o3d.utility.Vector3dVector(colors[:, :3])pcd6 = deepcopy(pcd)pcd6.translate((-40, 0, 0)) #整体进行x轴方向平移-40points = np.array(pcd6.points)result = AffinityPropagation(preference=-20).fit(points)#各个类别中心# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label+1, 3))/255.colors = colors[labels]#没有分类成功的点设置为黑色colors[labels < 0] = 0 pcd6.colors = o3d.utility.Vector3dVector(colors[:, :3])# 点云显示o3d.visualization.draw_geometries([pcd, pcd1, pcd2, pcd3, pcd4, pcd5, pcd6], #点云列表window_name="点云聚类",point_show_normal=False,width=800,  # 窗口宽度height=600)  # 窗口高度

图片

KMeans可视化算法实例

以下是一个使用Open3D进行KMeans聚类的示例:

import open3d as o3d
import numpy as np
from sklearn.cluster import KMeansif __name__ == '__main__':file_path = 'rabbit.pcd'pcd = o3d.io.read_point_cloud(file_path)pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色print(pcd)points = np.array(pcd.points)result = KMeans(n_clusters=8).fit(points)#各个类别中心center = result.cluster_centers_# labels返回聚类成功的类别,从0开始,每个数据表示一个类别labels = result.labels_#最大值相当于共有多少个类别max_label = np.max(labels) + 1 #从0开始计算标签print(max(labels))#生成k个类别的颜色,k表示聚类成功的类别colors = np.random.randint(255, size=(max_label, 3))/255.colors = colors[labels]pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])# 点云显示o3d.visualization.draw_geometries([pcd], #点云列表window_name="Kmeans点云聚类",point_show_normal=False,width=800,  # 窗口宽度height=600)  # 窗口高度

图片

以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!

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

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

相关文章

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染&#xff01;这一次内容比较多&#xff0c;我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步&#xff0c;还是老规矩&#xff0c;先准备好接口函数。方便我们的页面组件拿到对…

亚信安全终端一体化解决方案入选应用创新典型案例

近日&#xff0c;由工业和信息化部信息中心主办的2024信息技术应用创新发展大会暨解决方案应用推广大会成功落幕&#xff0c;会上集中发布了一系列技术水平先进、应用效果突出、产业带动性强的信息技术创新工作成果。其中&#xff0c;亚信安全“终端一体化安全运营解决方案”在…

Aigtek:电压放大器的选型方法有哪些

电压放大器是电子电路中常见的元件&#xff0c;用于将输入电压信号放大到所需的水平。在选择适合特定应用的电压放大器时&#xff0c;需要考虑多个因素&#xff0c;包括性能要求、电源电压、带宽、噪声等。下面安泰电子将详细介绍电压放大器的选型方法&#xff0c;以帮助工程师…

浪潮自研交换机系列常见问题处理

CN61108PC-V-H 不能PING通任何地址&#xff0c;也不能被PING 输入ip traceroute enable既可。注意视图 交换机通过console口远程登录至其他交换机&#xff0c;掉线后console口无法使用 例如有2台交换机A和B&#xff0c;在A交换机上插上console线登录后&#xff0c;在A通过SSH…

【嵌入式硬件】快衰减和慢衰减

1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…

KingBase 下的 sys_hba.conf 详解

客户端访问KingbaseES数据库&#xff0c;需要建立身份的认证&#xff0c;sys_hba.conf相当于认证的黑白名单&#xff0c;可以通过配置sys_hba.conf允许或拒绝客户端对数据库服务器的访问。 sys_hba.conf原理&#xff1a; 客户端认证是由一个配置文件&#xff08;通常名为sys_…

linux环境交叉编译openssl库,以使Qt支持https

一.前言 Qt若需要支持https&#xff0c;则需要openssl的支撑,并且要注意&#xff0c;Qt不同版本会指定对应的openssl版本库&#xff0c;比方我用的Qt5.14.2他要求用的openssl版本是1.1.1&#xff0c;你就不能用其他版本&#xff0c;不然基本就是失败报错。 如何查看Qt对应open…

站在资本投资领域如何看待分布式光纤传感行业?

近年来&#xff0c;资本投资领域对于分布式光纤传感行业并不十分敏感。这主要是由于分布式光纤传感技术是一个专业且小众的领域&#xff0c;其生命周期相对较长&#xff0c;缺乏爆发性&#xff0c;与消费品或商业模式创新产业有所不同。此外&#xff0c;国内的投资环境也是影响…

开源AI智能名片S2B2C商城小程序在社群团购模式中的应用与探索

摘要 本文深入探讨了开源AI智能名片S2B2C商城小程序在社群团购模式中的创新应用与未来发展。通过详细分析社群团购模式的特征、发展趋势及其面临的挑战&#xff0c;结合开源AI智能名片S2B2C商城小程序的技术优势与实际应用案例&#xff0c;本文提出了一系列旨在提升社群团购效…

文档解析效果全维度测评标准

TextIn文档解析测评工具&#xff0c;全面评测文档解析产品能力 关注TechLead&#xff0c;复旦AI博士&#xff0c;分享AI领域全维度知识与研究。拥有10年AI领域研究经验、复旦机器人智能实验室成员&#xff0c;国家级大学生赛事评审专家&#xff0c;发表多篇SCI核心期刊学术论文…

品牌设计宝典:打造独特视觉形象

今天&#xff0c;我们来谈谈品牌设计。品牌设计是视觉设计师非常重要的内容。如果你了解品牌设计的相关知识&#xff0c;你会更好地了解“包装”自己、运营自己或建立个人品牌内容。 理论上&#xff0c;品牌是一个广义的概念。比如公司从外到内建立的一些内容属于品牌概念下的…

Unity DOTS中的world

Unity DOTS中的world 注册销毁逻辑自定义创建逻辑创建world创建system group插入player loopReference DOTS中&#xff0c;world是一组entity的集合。entity的ID在其自身的世界中是唯一的。每个world都拥有一个EntityManager&#xff0c;可以用它来创建、销毁和修改world中的en…

Python机器学习入门:从理论到实践

文章目录 前言一、机器学习是什么&#xff1f;二、机器学习基本流程三、使用Python进行机器学习1.数据读取2.数据规范化3. 数据降维&#xff08;主成分分析&#xff09;4. 机器学习模型的选择5. 线性回归模型的实现6. 可视化结果 总结 前言 机器学习是人工智能的一个重要分支&…

安装好anaconda,打开jupyter notebook,新建 报500错

解决办法&#xff1a; 打开anaconda prompt 输入 jupyter --version 重新进入jupyter notebook&#xff1a; 可以成功进入进行代码编辑

功能测试与APPSCAN自动化测试结合的提高效率测试策略

背景 手工探索性测试&#xff08;Manual Exploratory Testing&#xff0c;简称MET&#xff09;是一种软件测试方法&#xff0c;它依赖于测试人员的直觉、经验和即兴发挥来探索应用程序或系统。与传统的脚本化测试相比&#xff0c;手工探索性测试不遵循固定的测试脚本&#xff0…

基于 PyTorch 的模型瘦身三部曲:量化、剪枝和蒸馏,让模型更短小精悍!

基于 PyTorch 的模型量化、剪枝和蒸馏 1. 模型量化1.1 原理介绍1.2 PyTorch 实现 2. 模型剪枝2.1 原理介绍2.2 PyTorch 实现 3. 模型蒸馏3.1 原理介绍3.2 PyTorch 实现 参考文献 1. 模型量化 1.1 原理介绍 模型量化是将模型参数从高精度&#xff08;通常是 float32&#xff0…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十四章 注册字符设备号

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【Linux】汇总TCP网络连接状态命令

输入命令&#xff1a; netstat -na | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]} 显示&#xff1a; 让我们逐步解析这个命令&#xff1a; netstat -na: netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令。 -n 选项表示输出地址和端口以数字格式显示…

Armv8/Armv9架构的学习大纲-学习方法-自学路线-付费学习路线

本文给大家列出了Arm架构的学习大纲、学习方法、自学路线、付费学习路线。有兴趣的可以关注&#xff0c;希望对您有帮助。 如果大家有需要的&#xff0c;欢迎关注我的CSDN课程&#xff1a;https://edu.csdn.net/lecturer/6964 ARM 64位架构介绍 ARM 64位架构介绍 ARM架构概况…

Wi-SUN无线通信技术 — 大规模分散式物联网应用首选

引言 在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正逐渐渗透到我们生活的方方面面。Wi-SUN技术以其卓越的性能和广泛的应用前景&#xff0c;成为了大规模分散式物联网应用的首选。本文将深入探讨Wi-SUN技术的市场现状、核心优势、实际应用中的案例以及…