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

一、代码分析

(一)清除工作区和命令行窗口

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)对数据进行高斯混合模型的拟合,得到高斯混合模型对象,从中可获取每个分量的均值和协方差矩阵。根据均值的简单排序取平均值确定分割阈值,对于只有一个峰的特殊情况,将该峰的均值作为分割阈值,最后将分割阈值显示在命令行窗口。

在延伸应用方面,有以下五个方面:

  1. 数据分类与分类评估:根据计算得到的分割阈值将数据分为两类,并在假设已知真实类别标签的情况下计算分类准确率,同时通过直方图直观地展示不同类别数据的分布情况。此应用可帮助评估使用当前分割阈值进行数据分类的效果。
  2. 异常值检测:通过计算数据点在高斯混合模型下的概率密度,设定概率密度阈值,将低于该阈值的数据点视为异常值,使用 scatter 函数将正常数据和异常数据以不同颜色展示,以便直观识别数据中的异常情况。
  3. 模型选择与评估:尝试不同的分量数量(从 1 到 5)拟合高斯混合模型,计算每个模型的贝叶斯信息准则(BIC),根据 BIC 最小原则选择最优的分量数量,同时绘制 BIC 随分量数量变化的曲线,帮助确定最优的模型复杂度。
  4. 数据生成与模拟:根据确定的最优分量数量拟合高斯混合模型,使用 random 函数生成新的数据,将生成的数据和原始数据的直方图归一化为概率密度函数进行对比,可用于数据模拟或数据增强。
  5. 多变量数据的扩展应用:针对多变量数据,读取文件并将其转换为数组,设定分量数量进行高斯混合模型拟合,对于二维数据,使用 meshgridpdfcontour 和 scatter 函数对数据分布进行可视化,帮助理解多变量数据的分布特征和模型拟合情况。

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

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

相关文章

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…

如何配置Cursor的显示主题模式

cursor打开代码后&#xff0c;默认主题显示的主要代码颜色是白色&#xff0c;注解是黑色的&#xff0c;很不习惯&#xff0c;摸索一下&#xff0c;如何配置成与VSOCDE一样的主题&#xff0c;方案如下。 选择菜单 "File"--"Preferences 选择“ Theme" ---&…

Windows 系统中的任务管理器是什么,打开快捷键是什么?

任务管理器是 Windows 操作系统中一个强大的工具&#xff0c;它允许用户监控系统的性能、启动和停止进程、管理服务、以及查看网络活动等。掌握任务管理器的快捷键可以帮助你更高效地进行这些操作。本文中简鹿办公将教你如何利用任务管理器中的快捷键来提升你的工作效率。 一、…

论文导读 | 数据库中的连接操作

1. 连接操作的背景与问题定义 在关系型数据库中&#xff0c;我们通常面对以下问题&#xff1a; 给定一个数据库实例 I \mathcal{I} I&#xff0c;包含若干关系&#xff08;表&#xff09; R { R 1 , R 2 , ⋯ , R n } \mathcal{R}\{R_1, R_2, \cdots, R_n\} R{R1​,R2​,⋯…

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上&#xff0c;实例是别的同事搭建的。最近又又又想了解一下&#xff0c;而且已经盘了一些了&#xff0c;所以写写记录一下。因为这个事儿没太多的进度压力&#xff0c;索性写到哪儿算哪儿&#xff0c;只要是新了解到的…

【搜索】【推荐】大 PK

引言 在当今信息爆炸的时代&#xff0c;如何从海量数据中精准地为用户推荐最相关的内容成为了科技领域的关键挑战。搜推技术作为推荐系统的核心组件&#xff0c;扮演着至关重要的角色。本文将深入探讨这两种技术背后的方法论&#xff0c;剖析它们各自面临的难点&#xff0c;并…

多模态大模型初探索:通过ollama部署多模态大模型

文章目录 前言模型下载 前言 今天和同事聊天&#xff0c;聊到多模态大模型&#xff0c;感觉可以作为2025年的一个新的探索方向。希望和大家一起学习&#xff0c;一起进步。 今天也是尝试了我能想到的最基本最快速地本地部署多模态大模型的方式&#xff0c;那便是使用ollama。…

maven如何从外部导包

1.找到你项目的文件位置&#xff0c;将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

流媒体内网穿透/组网/网络映射EasyNTS上云网关启动失败如何解决?

在当今的网络视频监控和远程通信领域&#xff0c;设备的远程访问和数据共享需求日益增长。通过EasyNTS平台&#xff0c;用户无需开放内网端口&#xff0c;即可实现内网应用的外网访问&#xff0c;极大地简化了网络配置和维护工作。 EasyNTS上云网关的主要作用是解决异地视频共…

力扣刷题:数组OJ篇(下)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.轮转数组&#xff08;1&#xff09;题目描述…

flink cdc oceanbase(binlog模式)

接上文&#xff1a;一文说清flink从编码到部署上线 环境&#xff1a;①操作系统&#xff1a;阿里龙蜥 7.9&#xff08;平替CentOS7.9&#xff09;&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 预研初衷&#xff1a;现在很多项目有国产化的要求&#…

【Web】0基础学Web—事件对象、事件委托(事件代理)——星级评论案例

0基础学Web—事件对象、事件委托&#xff08;事件代理&#xff09;——星级评论案例 事件对象关闭鼠标右键的点击事件关闭鼠标滚轮的事件点击的目标对象点击鼠标的左键0 滚轮1 右键2获得被点击的节点的名称或取相对于浏览器左上角的距离&#xff08;会受页面滚动条的影响&#…

el-table 多级表头

1.结构 <el-table:data"tableData"border:height"700"style"width: 100% !important; overflow: auto":header-cell-style"{ background: #becee1, color: #333 }":cell-style"{ padding: 5px }"><template v-for…

计算机网络基础——网络协议

""" 资料的搬运工 """ 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。 1、网络层次划分 OSI七层网络模型 1&#xff09;物理层 确保原始的数据可在各种物理媒体上传输 中继器&#xff08;放大器&#xff09;和集…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了&#xff08;具体哪些是必须的&#xff0c;哪些是多余的没验证&#xff09;&#xff0c;configure才能认为X的库文件和头文件是可以用的。打开多个编程语言的支持特性。 ./configure --prefixpwd/mybui…

Numpy数组的属性

NumPy中最重要的一个特点就是其n维数组对象&#xff0c;即ndarray(别名array)对象&#xff0c;该对象具有矢量算术能力和复杂的广播能力&#xff0c;可以执行一些科学计算。不同于Python内置的数组类型&#xff0c; array对象拥有对高维数组的处理能力&#xff0c;这也是数值计…

如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01;点击&#xff01;点击&#xff01; ⏰️创作时间&#xff1a;2025年1月8日8点14分…

ProtonBase 荣获 Datafun “数智技术最佳探索奖”

2024年&#xff0c;数智领域迎来技术创新的高峰&#xff0c;尖端技术和用户案例呈现井喷式增长&#xff0c;成为引领时代潮流的关键词。DataFun 社区作为数智前沿阵地&#xff0c;汇聚全球数智精英&#xff0c;推动技术革新和知识共享&#xff0c;助力技术加速发展。 由 DataFu…