基于高斯混合模型的数据分析及其延伸应用(具体代码分析)
一、代码分析

(一)清除工作区和命令行窗口
clear;
clc;
clear;:该命令用于清除 MATLAB 工作区中的所有变量,确保代码运行环境的清洁,避免之前遗留的变量对当前代码运行产生干扰。例如,如果之前运行的代码中定义了名为data或col1Data的变量,在本次运行中如果不使用clear,可能会导致错误地使用了旧的变量值,从而得出错误的结果。clc;:此命令清除命令行窗口的内容,让后续输出的信息更加清晰,避免之前的输出信息干扰当前的信息查看。
(二)读取 CSV 文件
data = readtable('testdata1219.csv');
col1Data = data{:, 1}; % 获取第一列数据
col1Data = col1Data(:);
data = readtable('testdata1219.csv');:使用readtable函数从名为testdata1219.csv的文件中读取数据并存储在data表中。readtable函数会自动解析文件中的表头和数据,将其存储为表格数据类型,方便后续的数据操作,如筛选、查询等。col1Data = data{:, 1};:通过{:, 1}的索引方式从data表中提取第一列的数据。这里使用花括号是因为我们想要提取的是一个数组而不是子表格。col1Data = col1Data(:);:将提取的第一列数据转换为列向量。这是因为许多 MATLAB 函数(如后续的fitgmdist)期望输入数据是列向量,以确保数据处理的一致性和正确性。
(三)拟合高斯混合模型
nComponents = 2; % 高斯混合模型的分量数量
gmModel = fitgmdist(col1Data, nComponents);
nComponents = 2;:设定高斯混合模型中的分量数量为 2。分量数量的选择对模型的拟合效果有重要影响,不同的分量数量可以表示数据是由不同数量的高斯分布混合而成。在选择分量数量时,需要根据数据的分布特点和先验知识进行合理选择。gmModel = fitgmdist(col1Data, nComponents);:使用fitgmdist函数对col1Data进行高斯混合模型的拟合。该函数会根据最大似然估计等方法估计出每个高斯分量的参数,如均值、协方差矩阵和分量的权重,拟合结果存储在gmModel对象中。
(四)获取高斯混合模型的参数
mu = gmModel.mu; % 均值
sigma = gmModel.Sigma; % 协方差矩阵
mu = gmModel.mu;:从gmModel中提取每个高斯分量的均值,存储在mu向量中。均值表示每个高斯分量的中心位置,是描述数据集中趋势的重要参数。sigma = gmModel.Sigma;:提取每个高斯分量的协方差矩阵,存储在sigma中。协方差矩阵描述了数据的离散程度和不同维度间的相关性,对于单变量数据,它表示方差,对于多变量数据,它反映了数据在不同维度上的分布情况。
(五)确定分割阈值
sortedMu = sort(mu);
threshold = mean(sortedMu); % 这里简单取两个均值的平均值作为分割阈值
sortedMu = sort(mu);:对提取的均值向量mu进行排序,以便更清晰地观察不同分量的均值顺序,为后续的处理提供便利。threshold = mean(sortedMu);:通过计算排序后均值的平均值来确定分割阈值。这种方法简单直观,但可能不够精确,尤其当不同分量的权重和方差差异较大时,可能无法很好地将数据分割开。
(六)特殊情况处理(当只有一个峰时)
if nComponents == 1threshold = mu; % 如果只有一个峰,直接以该均值作为分割阈值
end
- 当
nComponents等于 1 时,说明数据仅由一个高斯分量拟合,将该分量的均值作为分割阈值。这在某些情况下是合理的,例如将数据划分为该均值以下和以上两部分进行后续分析。
(七)显示分割阈值
disp(['分割阈值为:', num2str(threshold)]);
- 该语句将计算得到的分割阈值以字符串形式输出到命令行窗口,使用
num2str函数将数值转换为字符串,方便查看和后续使用。
二、延伸应用
(一)数据分类与分类评估
% 将数据根据阈值分为两类
class1 = col1Data(col1Data < threshold);
class2 = col1Data(col1Data >= threshold);% 假设我们有真实的类别标签,这里用 labels 表示
labels = % 此处应根据实际情况提供真实的类别标签,例如从文件中读取或手动标记
% 计算分类准确率
correct = sum((col1Data < threshold) == (labels == 1)) + sum((col1Data >= threshold) == (labels == 2));
accuracy = correct / length(labels);
disp(['分类准确率为:', num2str(accuracy)]);% 绘制分类结果的直方图
histogram(class1, 'FaceColor', 'b', 'DisplayName', 'Class 1');
hold on;
histogram(class2, 'FaceColor', 'r', 'DisplayName', 'Class 2');
legend('Location', 'best');
title('数据分类结果的直方图');
hold off;
- 首先,根据计算出的
threshold将col1Data分为两类class1和class2。 - 假设我们有真实的类别标签
labels,可以计算分类准确率。这里通过比较数据点与阈值的大小关系和真实标签是否相符,计算正确分类的样本数,进而得出准确率。 - 使用
histogram函数绘制分类结果的直方图,不同颜色表示不同类别,方便直观地观察分类效果。
(二)异常值检测
% 计算每个数据点在高斯混合模型下的概率密度
pdfValues = pdf(gmModel, col1Data);
% 设定概率密度阈值,低于该阈值的数据点可能是异常值
pdfThreshold = 0.01;
anomalies = col1Data(pdfValues < pdfThreshold);% 可视化异常值
scatter(col1Data, zeros(size(col1Data)), 'b');
hold on;
scatter(anomalies, zeros(size(anomalies)), 'r');
legend('正常数据', '异常数据');
title('异常值检测结果');
hold off;
- 使用
pdf函数计算每个数据点在高斯混合模型下的概率密度pdfValues。 - 设定
pdfThreshold为 0.01,将概率密度低于该阈值的数据点视为异常值,存储在anomalies中。 - 通过
scatter函数将正常数据和异常数据以不同颜色绘制,直观地展示异常值的位置和分布,有助于识别数据中的异常情况。
(三)模型选择与评估
% 尝试不同的分量数量,选择最优模型
componentNumbers = 1:5;
BIC = zeros(size(componentNumbers));
for i = 1:length(componentNumbers)gmModel = fitgmdist(col1Data, componentNumbers(i));BIC(i) = gmModel.BIC;
end% 找到 BIC 最小的分量数量作为最优分量数量
[~, optimalIndex] = min(BIC);
optimalComponents = componentNumbers(optimalIndex);
disp(['最优分量数量为:', num2str(optimalComponents)]);% 绘制 BIC 随分量数量的变化曲线
plot(componentNumbers, BIC, 'o-');
xlabel('分量数量');
ylabel('BIC 值');
title('BIC 随分量数量的变化');
- 通过一个循环,使用不同的分量数量(1 到 5)拟合高斯混合模型,并计算每个模型的贝叶斯信息准则(BIC)。
- BIC 综合考虑了模型的复杂度和对数据的拟合程度,通常选择 BIC 值最小的模型作为最优模型。
- 找到 BIC 最小的分量数量,并将其作为最优的模型参数,同时绘制 BIC 随分量数量变化的曲线,帮助我们直观地观察模型复杂度和性能之间的关系。
(四)数据生成与模拟
% 根据最优模型生成新的数据
optimalComponents = 2; % 假设最优分量数量为 2
gmModel = fitgmdist(col1Data, optimalComponents);
generatedData = random(gmModel, 1000); % 生成 1000 个新的数据点% 绘制生成的数据和原始数据的直方图
histogram(col1Data, 'FaceColor', 'b', 'Normalization', 'pdf', 'DisplayName', '原始数据');
hold on;
histogram(generatedData, 'FaceColor', 'r', 'Normalization', 'pdf', 'DisplayName', '生成数据');
legend('Location', 'best');
title('原始数据与生成数据的分布');
hold off;
- 首先根据确定的最优分量数量(这里假设为 2)拟合高斯混合模型。
- 使用
random函数根据该模型生成 1000 个新的数据点存储在generatedData中。 - 绘制原始数据和生成数据的直方图,使用
Normalization选项将直方图归一化为概率密度函数(PDF),以便比较两者的分布,观察生成数据是否与原始数据相似,可用于数据模拟或数据增强等应用。
(五)多变量数据的扩展应用
% 假设我们读取的是多变量数据
multidata = readtable('multivariate_data.csv');
multidataArray = table2array(multidata(:, 2:end)); % 假设第一列是标识符,从第二列开始是数据
nComponents = 3; % 假设使用三个分量
gmModel = fitgmdist(multidataArray, nComponents);
mu = gmModel.mu;
sigma = gmModel.Sigma;% 可视化多变量数据的分布,这里以二维数据为例
if size(multidataArray, 2) == 2[X, Y] = meshgrid(min(multidataArray(:,1)):0.1:max(multidataArray(:,1)), min(multidataArray(:,2)):0.1:max(multidataArray(:,2)));Z = reshape(pdf(gmModel, [X(:), Y(:)]), size(X));contour(X, Y, Z);hold on;scatter(multidataArray(:,1), multidataArray(:,2), 'filled');hold off;title('多变量数据的高斯混合模型拟合与可视化');
end
- 对于多变量数据,首先使用
readtable读取数据并转换为数组。 - 设定分量数量为 3 拟合高斯混合模型,提取模型的均值和协方差矩阵。
- 对于二维多变量数据,使用
meshgrid和pdf函数计算概率密度函数的网格,并使用contour函数绘制等高线图,同时使用scatter函数绘制原始数据点,以直观地观察多变量数据的分布和模型拟合情况,帮助我们理解多变量数据的分布特征。
三、总结:
本文主要对一段 MATLAB 代码进行了详细分析,并探讨了其延伸应用。首先,代码通过 clear 和 clc 命令清除工作区变量和命令行窗口内容,为后续操作提供了干净的环境。接着使用 readtable 函数读取 CSV 文件中的数据,提取其中的第一列数据并将其转换为列向量。然后,使用 fitgmdist 函数以预先设定的分量数量(初始为 2)对数据进行高斯混合模型的拟合,得到高斯混合模型对象,从中可获取每个分量的均值和协方差矩阵。根据均值的简单排序取平均值确定分割阈值,对于只有一个峰的特殊情况,将该峰的均值作为分割阈值,最后将分割阈值显示在命令行窗口。
在延伸应用方面,有以下五个方面:
- 数据分类与分类评估:根据计算得到的分割阈值将数据分为两类,并在假设已知真实类别标签的情况下计算分类准确率,同时通过直方图直观地展示不同类别数据的分布情况。此应用可帮助评估使用当前分割阈值进行数据分类的效果。
- 异常值检测:通过计算数据点在高斯混合模型下的概率密度,设定概率密度阈值,将低于该阈值的数据点视为异常值,使用
scatter函数将正常数据和异常数据以不同颜色展示,以便直观识别数据中的异常情况。 - 模型选择与评估:尝试不同的分量数量(从 1 到 5)拟合高斯混合模型,计算每个模型的贝叶斯信息准则(BIC),根据 BIC 最小原则选择最优的分量数量,同时绘制 BIC 随分量数量变化的曲线,帮助确定最优的模型复杂度。
- 数据生成与模拟:根据确定的最优分量数量拟合高斯混合模型,使用
random函数生成新的数据,将生成的数据和原始数据的直方图归一化为概率密度函数进行对比,可用于数据模拟或数据增强。 - 多变量数据的扩展应用:针对多变量数据,读取文件并将其转换为数组,设定分量数量进行高斯混合模型拟合,对于二维数据,使用
meshgrid、pdf、contour和scatter函数对数据分布进行可视化,帮助理解多变量数据的分布特征和模型拟合情况。
相关文章:
基于高斯混合模型的数据分析及其延伸应用(具体代码分析)
一、代码分析 (一)清除工作区和命令行窗口 clear; clc;clear;:该命令用于清除 MATLAB 工作区中的所有变量,确保代码运行环境的清洁,避免之前遗留的变量对当前代码运行产生干扰。例如,如果之前运行的代码中…...
无人机+Ai应用场景!
军事领域 无人机AI制导技术在军事领域的应用尤为突出。通过AI技术,无人机可以自主执行侦察、监视、打击等多种任务,极大地提高了军事行动的效率和准确性。 侦察与监视:AI无人机能够利用先进的传感器和摄像头,对目标区域进行大范…...
操作手册:集成钉钉审批实例消息监听配置
此文档将记录在慧集通平台怎么实现钉钉审批实例结束或发起或取消时,能够实时的将对应的实例数据抓取出来送入第三方系统 集成平台配置 1、配置中心库,存储钉钉发送的消息,可以忽略,若不配置,则钉钉的消息将不再记录到…...
AI大模型-提示工程学习笔记4
卷首语:我所知的是我自己非常无知,所以我要不断学习。 写给AI入行比较晚的小白们(比如我自己)看的,大神可以直接路过无视了。 不同主题提示词可以完成不同基本任务,常见的提示主题有: 文本概…...
Vue3.5 企业级管理系统实战(一):项目初始搭建与配置
本文详细介绍了如何使用 Vite 构建一个高效的 Vue 3.5 项目框架,并整合了 ESLint、Prettier、EditorConfig、Husky、lint-staged 和 commitlint 等现代化开发工具。通过这些工具的集成,我们能够确保代码质量、格式化和提交规范的一致性,从而提…...
缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)
**Cache-Aside Pattern(旁路缓存模式)**是一种广泛应用于缓存管理的设计模式,尤其在使用 Redis 作为缓存层时尤为常见。该模式通过在应用程序与缓存之间引入一个旁路,确保数据的一致性和高效性。本文将在之前讨论的 Redis 主动更新…...
杭州市有哪些大学能够出具论文检索报告?
杭州市具有查收查引服务的学校有浙江大学、杭州电子科技大学、浙江工业大学、杭州师范大学等高校。 1、浙江大学图书馆 浙江大学图书馆提供文献查收查引服务,包括查询学术论文被SCIE、SSCI、A&HCI、EI、CPCI-S、CPCI-SSH、CSSCI、CSCD等国内外权威数据库收录和…...
SpringBootWeb 登录认证(day12)
登录功能 基本信息 请求参数 参数格式:application/json 请求数据样例: 响应数据 参数格式:application/json 响应数据样例: Slf4j RestController public class LoginController {Autowiredpriva…...
使用AOP在切面逻辑中无法获取到requesetBody
使用场景:在接口处理之前,我们需要拿到请求参数,对参数进行校验。注意,这里需要拿到的是原始的请求信息! 一般的获取方式 ServletInputStream inputStream request.getInputStream(); StringBuilder stringBuilder …...
生成模型:变分自编码器-VAE
1.基本概念 1.1 概率 这里有: x为真实图像,开源为数据集, 编码器将其编码为分布参数 x ^ \hat{x} x^为生成图像, 通过解码器获得 p ( x ) ^ \hat{p(x)} p(x)^: 观测数据的分布, 即数据集所构成的经验分布 p r e a l ( x ) p_{real}(x) preal(x): …...
Hive sql执行文件合并配置参数
HIVE自动合并输出的小文件的主要优化手段为:HIVE将会启动一个独立的map-reduce任务进行输出文件的merge。 set hive.merge.mapfiles true: 在只有map的作业结束时合并小文件, set hive.merge.mapredfiles true: 在Map-Reduce的任…...
鸿蒙 ArkUI实现地图找房效果
常用的地图找房功能,是在地图上添加区域、商圈、房源等一些自定义 marker,然后配上自己应用的一些筛选逻辑构成,在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网,注册应用&…...
一套极简易的直流无刷电机(Deng FOC)开发套件介绍
目录 概述 1. 硬件组成介绍 1.1 主要硬件 1.2 电机驱动板介绍 1.3 2208电机模块 1.3.1 参数介绍 1.3.2 认识2208电机 2 驱动板接口介绍 2.1 PCB接口(MCU)定义 2.2 功能描述 2.2.1 电机驱动接口 2.2.2 编码器接口 2.2.3 电流输入引脚接口 2.…...
Inception模型详解及代码分析
模型背景 Inception系列模型由Google团队提出,旨在解决CNN分类模型面临的两大挑战: 如何在增加网络深度的同时提升分类性能 如何在保证分类准确率的同时降低计算和内存开销 Inception V1通过引入 并行卷积结构 和 1x1卷积 ,巧妙地解决了这两个问题,在保证模型质量的前提下…...
Springboot AOP 每个接口运行前 修改入参
控制台log输出为何频频失踪? wxss代码为何频频失效? wxml布局为何乱作一团? 究竟是道德的沦丧?还是人性的缺失? 让我们一起来 走 跑进科学 前言 麻蛋被这个功能恶心好久 终于解决了 特此记录一下 正文 Before("authCut()")public void cutProc…...
课题推荐——基于GPS的无人机自主着陆系统设计
关于“基于GPS的无人机自主着陆系统设计”的详细展开,包括项目背景、具体内容、实施步骤和创新点。如需帮助,或有导航、定位滤波相关的代码定制需求,请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...
【深度学习】在深度学习训练过程中,数据量太少会导致模型过拟合还是欠拟合?
过拟合与欠拟合 过拟合 : 是指在训练集上表现非常好,但是在新的数据集上表现较差的现象。具体来说,模型在训练集上过度学习,捕捉了数据中的噪声和偶然性,导致它对训练数据的拟合非常精确,但缺乏泛化能力,无…...
js迭代器模式
以前JS原生的集合类型数据结构,只有Array(数组)和Object(对象); 而ES6中,又新增了Map和Set。四种数据结构各自有着自己特别的内部实现,但我们仍期待以同样的一套规则去遍历它们&…...
测试开发基础知识2
10.什么是等价类和边界值法? 1)等价类划分 等价类划分是将系统的输入域划分为若干部分,然后从每个部分选取少量代表性数据进行测试。等价类划分认为如果一个测试用例在某个等价类中的一个值上通过测试,那么它在这个类中的其他值上也…...
PromQL基础使用和案例解析
文章目录 PromQL简介数据类型1、瞬时数据 (Instant vector)2、区间数据 (Range vector)➢ Time Durations➢ Offest modifier➢ modifier 3、标量数据 (Scalar)4、字符串 (String) 条件匹配1、完全匹配2、正则匹配 运算符1、比较运算符2、算数运算符3、逻辑运算符4、聚合运算符…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
