KMeans等其他聚类算法

news2024/11/25 22:52:44

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 OPTICS

if __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) + 1
    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])

    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 SpectralClustering

if __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) + 1
    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])

    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 AgglomerativeClustering

if __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) + 1
    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])

    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, MeanShift

if __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) + 1
    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])

    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 Birch

if __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) + 1
    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])

    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 AffinityPropagation

if __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) + 1
    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([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, AffinityPropagation
 
 
if __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轴方向平移20
    points = 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轴方向平移-20
    points = 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轴方向平移20
    points = 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轴方向平移-20
    points = 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轴方向平移40
    points = 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轴方向平移-40
    points = 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 KMeans
 
 
if __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.coloradmin.cn/o/1938797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blender中的重拓扑修改器如何使用?

许多人还不了解Blender中的重拓扑编辑器及其使用方法。Blender中的重拓扑修改器提供了一系列工具和选项&#xff0c;以简化创建优化网格的过程&#xff0c;无论是出于何种目的&#xff0c;都能为3D艺术家和建模者节省大量时间和精力。那么&#xff0c;在Blender中重拓扑的定义是…

springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient

背景 在对已有项目进行改造的时候&#xff0c;集成SpringConfigStarter&#xff0c;编写完bootstrap.yml&#xff0c;在idea 启动项中编辑并新增VM options -Dspring.cloud.config.discovery.enabledtrue&#xff0c;该版本不加spring不会从configService获取信息&#xff0c;…

网络结构-组件-AI(九)

深度学习网络组件 RNN公式讲解计算示意图讲解 CNN计算示意 Normalization(归一化层)Normalization常见两种方式 Dropout层 RNN 循环神经网络&#xff08;recurrent neural network&#xff09; 主要思想&#xff1a; 即将整个序列划分成多个时间步&#xff0c;将每一个时间步的…

OrangePi AIpro 快速上手初体验

开发板开箱 1.1.包装 1.2.开发版 Orange Pi AIpro Orange Pi官网-香橙派&#xff08;Orange Pi&#xff09;开发板 1.3.引脚分布 1.4开发板资源简介 1CPU配备了4核64位ARM处理器&#xff0c;其中默认预留1个给AI处理器使用NPU集成了华为昇腾310BAI处理器&#xff0c;拥有4TF…

(二)原生js案例之数码时钟计时

原生js实现的数字时间上下切换显示时间的效果&#xff0c;有参考相关设计&#xff0c;思路比较难&#xff0c;代码其实很简单 效果 代码实现 必要的样式 <style>* {padding: 0;margin: 0;}.content{/* text-align: center; */display: flex;align-items: center;justif…

华为OD机试(C卷,200分)- 二叉树计算

题目描述 给出一个二叉树如下图所示&#xff1a; 请由该二叉树生成一个新的二叉树&#xff0c;它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树&#xff1b;右子树表示该节点右侧叶子节点为根节点的一颗新树。…

笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调

内容摘自王老师的B站视频&#xff0c;大家还是尽量去看视频&#xff0c;老师讲的特别好&#xff0c;不到一小时的时间就缕清了小样本学习的基础知识点~Few-Shot Learning (1/3): 基本概念_哔哩哔哩_bilibili Few-Shot Learning&#xff08;小样本分类&#xff09; 假设现在每类…

【Linux】基础I/O——动静态库的制作

我想把我写的头文件和源文件给别人用 1.把源代码直接给他2.把我们的源代码想办法打包为库 1.制作静态库 1.1.制作静态库的过程 我们先看看怎么制作静态库的&#xff01; makefile 所谓制作静态库 需要将所有的.c源文件都编译为(.o)目标文件。使用ar指令将所有目标文件打包…

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…

[2019红帽杯]Snake

[2019红帽杯]Snake-CSDN博客 unity的题 下载下来看看是什么类型就是 这道题就是贪吃蛇 unity无脑找Assembly 用dnspy打开 一般就在这里慢慢找 但是你可以发现没有任何的信息 这里外接库 只能从这里下手试试 64位链接库的意思 游戏题,win!很关键 进入了Gameobject 看a1,小…

复现Android中GridView的bug并解决

几年前的一个bug&#xff0c;GridView的item高度不一致。如下图&#xff1a; 复现bug的代码&#xff1a; import android.os.Bundle; import android.widget.BaseAdapter; import android.widget.GridView; import androidx.appcompat.app.AppCompatActivity; import java.uti…

【Day12】登录认证、异常处理

1 登录 先创建一个新的 controller 层&#xff1a;LoginController RestController public class LoginController {Autowiredprivate EmpService empService;// 注入PostMapping("/login")public Result login(RequestBody Emp emp) { // 包装对象Emp e empServic…

html 单页面引用vue3和element-plus

引入方式&#xff1a; element-plus基于vue3.0&#xff0c;所以必须导入vue3.0的js文件&#xff0c;然后再导入element-plus自身所需的js以及css文件&#xff0c;导入文件有两种方法&#xff1a;外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …

Golang | Leetcode Golang题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) []int {xorSum : 0for _, num : range nums {xorSum ^ num}lsb : xorSum & -xorSumtype1, type2 : 0, 0for _, num : range nums {if num&lsb > 0 {type1 ^ num} else {type2 ^ num}}return []in…

【数据结构】二叉树OJ题_对称二叉树_另一棵的子树

对称二叉树 题目 101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2…

不同类型的指针变量进行++操作的效果

可以看到 不同变量的指针进行操作的时候&#xff0c;他的地址移动的大小是不一样的 运行了打印了一些东西 &#xff0c; 没想到可以用sizeof来打印出 names[0][]这个字符串的长度方法 &#xff0c; 只能用这个 strlen1来判断这个字符串的长度。

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

minio client 前言使用1.拉取minio client 镜像2.部署mc容器3.添加云存储服务器4.迁移数据1.全量迁移2.只迁移某个桶3.覆盖重名文件 5.其他操作1.列出所有alias、列出列出桶中的文件和目录1.1.列出所有alias1.2.列出桶中的文件和目录 2.创建桶、删除桶2.1.创建桶2.2.删除桶 3.删…

DX-10A信号继电器 柜内安装,板前接线 约瑟JOSEF

DX-10型闪光信号继电器型号&#xff1a; DX-10A闪光信号继电器&#xff1b; DX-10B闪光信号继电器&#xff1b; DX-10C闪光信号继电器; 用途 DX-10 闪光继电器用于电力系统断路器的位置信号灯不对应闪光&#xff0c;该继电器是为了适应当前推广使用发光二极管节能指示灯而…

“狂飙”过后,大模型未来在何方?

2024年6月14日&#xff0c;第六届“北京智源大会”在中关村展示中心开幕。 开幕现场&#xff0c;智源研究院、OpenAI、百度、零一万物、百川智能、智谱AI、面壁智能等国内主流大模型公司CEO与CTO&#xff0c;人工智能顶尖学者和产业专家&#xff0c;在围绕人工智能关键技术路径…

rockchip的yolov5 rknn python推理分析

rockchip的yolov5 rknn推理分析 对于rockchip给出的这个yolov5后处理代码的分析&#xff0c;本人能力十分有限&#xff0c;可能有的地方描述的很不好&#xff0c;欢迎大家和我一起讨论&#xff0c;指出我的错误&#xff01;&#xff01;&#xff01; RKNN模型输出 将官方的Y…