基于高斯混合模型的数据分析及其延伸应用(具体代码分析)
一、代码分析
(一)清除工作区和命令行窗口
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、聚合运算符…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...