PCL高斯混合聚类

news/2024/5/20 8:02:50 标签: 聚类, 算法, C++

1.GMM的应用场景:

高斯混合聚类(GMM)是一种被广泛应用的聚类算法,适用于多种不同的场景。

首先,GMM 聚类通常适用于数据集中存在多个分离或者重叠的簇的情况,例如图像分割、语音识别等领域。在这些任务中,数据集中的不同对象或者声音可以被视为不同的簇。由于这些数据集中的簇可能具有不同的形状和大小,并且可能有重叠的区域,因此 GMM 聚类算法可以更好地对这些数据进行建模和聚类

其次,在实际应用中,GMM 聚类算法通常用于数据量较小、维度较高的情况,例如文本挖掘、金融数据分析、生物信息学等领域。在这些领域中,样本数量有限,而特征的数量较多,因此很难使用传统的基于距离和密度的聚类方法进行聚类。而 GMM 聚类算法通过引入高斯分布来建模每个簇,可以更好地处理这类高维数据,同时可以有效缓解维度灾难问题。

此外,GMM 聚类算法还可以用于异常检测、数据压缩等领域,例如在异常检测中,可以将 GMM 用于对正常数据的建模,并使用 GMM 模型判断给定样本是否为异常数据。

总之,GMM 聚类算法是一种通用的聚类方法,在多个不同领域都具有广泛的应用。

2.PCL中的GMM算法

GMM 聚类算法通过假设数据集中的每个簇都服从一个高斯分布来建模数据,并使用最大似然估计(Maximum Likelihood Estimation,MLE)方法估计 GMM 的参数。在 PCL 中,可以使用 pcl::GaussianMixtureModel 类实现 GMM 聚类

具体来说,该算法首先使用类似 k-means 的方法选取一些数据点作为聚类的初始化中心。之后,通过交替进行 E (Expectation)和 M (Maximization) 步骤来估计 GMM 的参数。

E 步骤通过使用贝叶斯定理计算每个数据点属于每个簇的概率,即计算每个簇的后验概率。在这个过程中,需要计算当前估计的 GMM 参数对应下,每个数据点属于每个簇的概率。

M 步骤根据 E 步骤计算得到的后验概率以及每个簇的先验概率,在最大化似然函数的意义下更新 GMM 的参数,包括每个簇的均值、协方差矩阵和先验概率。

通过迭代地执行 E 和 M 步骤,可以得到 GMM 的最优参数估计,并使用这些参数将数据集聚类成多个簇。详细信息可以参考 PCL 官方文档中 pcl::GaussianMixtureModel<pcl::PointXYZ> 类的说明文档。

示例代码:

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/features/normals.h>
#include <pcl/segmentation/gaussian_mixture.h>

int main(){
    // 创建一个点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    cloud->width = 1000;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud->points[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1.0f;
    }
  
    // 估计法向量
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setInputCloud(cloud);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    ne.setSearchMethod(tree);
    pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
    ne.setRadiusSearch(0.03);
    ne.compute(*cloud_normals);

    // 高斯聚类
    pcl::GaussianMixture<pcl::PointXYZ> gm;
    gm.setInputCloud(cloud);
    gm.setNormals(cloud_normals);
    gm.setNumberOfModels(3);        // 设置簇的数量为3
    gm.setResidualThreshold(0.01);  // 设置残差阈值
    gm.setMaxIterations(300);       // 设置最大迭代次数
    gm.setCovarianceType(pcl::GaussianMixtureModel<pcl::PointXYZ>::COVARIANCE_FULL); // 设置协方差类型为完全协方差矩阵
    pcl::PointCloud<pcl::PointXYZL>::Ptr clusters(new pcl::PointCloud<pcl::PointXYZL>);
    gm.compute(*clusters);

    // 输出聚类结果
    std::cout << "Number of clusters: " << gm.getNumberOfModels() << std::endl;
    for (size_t i = 0; i < clusters->points.size(); ++i)
    {
        std::cout << "Cluster " << clusters->points[i].label << ": "
                  << "(" << clusters->points[i].x << ", "
                  << clusters->points[i].y << ", " 
                  << clusters->points[i].z << ")" << std::endl;
    }
  
    return 0;
}


http://www.niftyadmin.cn/n/245783.html

相关文章

报错Unknown property used in expression: ${day<=2}

报错信息 Unknown property used in expression: ${day<2} 解决方法&#xff1a; 错误代码: //2 启动流程实例 Test public void startProcessInstance() {Map<String,Object> map new HashMap<>();//设置请假天数map.put("day","2");P…

MySQL数据库——MySQL SELECT:数据表查询语句

在 MySQL 中&#xff0c;可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求&#xff0c;使用不同的查询方式来获取不同的数据&#xff0c;是使用频率最高、最重要的操作。 SELECT 的语法格式如下&#xff1a; SELECT {* | <字段列名>} [ FROM <表 1&…

Spring IoC容器、IoC与DI

目录 Spring是什么&#xff1f; 理解容器 什么是IoC(Inversion of Control) 传统的new创建对象的方式中类与类的耦合程度很大。 IoC的优势&#xff1a; Spring IoC容器最核心的功能 什么是DI (Dependency Injection) IoC和DI的区别 Spring是什么&#xff1f; Spr…

Markdown 语法手册

Markdown 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。 Markdown 语言在 2004 由约翰格鲁伯(John Gruber)创建。 Markdown 的设计哲学是可读性。 Markdown 支持原生 HTML 标签. vscode侧边预览markdown的插件&#xff1a;markdown-previ…

后台管理系统之登录方案记录

需求&#xff1a;根据当前环境的不同&#xff0c;请求不同的 BaseUrl 解决&#xff1a;在根目录中新建.env.development与.env.production连个文件&#xff0c;进行配置&#xff1a; # .env.production ENV production# base api VUE_APP_BASE_API /prod-api# .env.develop…

社区生态 | openEuler、龙蜥Anolis、统信UOS三大主流操作系统下编译GreatSQL二进制包

为了更好地支持更多操作系统及相关生态&#xff0c;GreatSQL社区决定发布openEuler、龙蜥Anolis、统信UOS三个操作系统下的GreatSQL二进制包。相应的二进制包可以访问gitee.com上的 GreatSQL项目 https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.25-17下载。 …

[python][pcl]python-pcl案例之兔子显示

兔子pcd文件下载&#xff1a;firc.lanzoux.com/iLfSgg749ab# -*- coding: utf-8 -*- # Point cloud library import pcl import pcl.pcl_visualization# Opencv # import opencv import cv2def main():# These are track bar initial settings adjusted to the given pointclou…

Java并发编程 —— 延迟队列DelayQueue源码解析

一、什么是DelayQueue DelayQueue是一个支持并发的无界延迟队列&#xff0c;队列中的每个元素都有个预定时间&#xff0c;当线程从队列获取元素时&#xff0c;只有到期元素才会出队列&#xff0c;没有到期元素则阻塞等待。队列头元素是最快要到期的元素。因此DelayQueue可用于…