当前位置: 首页 > news >正文

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

一、代码分析

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

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 函数对数据分布进行可视化,帮助理解多变量数据的分布特征和模型拟合情况。

相关文章:

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

一、代码分析 &#xff08;一&#xff09;清除工作区和命令行窗口 clear; clc;clear;&#xff1a;该命令用于清除 MATLAB 工作区中的所有变量&#xff0c;确保代码运行环境的清洁&#xff0c;避免之前遗留的变量对当前代码运行产生干扰。例如&#xff0c;如果之前运行的代码中…...

无人机+Ai应用场景!

军事领域 无人机AI制导技术在军事领域的应用尤为突出。通过AI技术&#xff0c;无人机可以自主执行侦察、监视、打击等多种任务&#xff0c;极大地提高了军事行动的效率和准确性。 侦察与监视&#xff1a;AI无人机能够利用先进的传感器和摄像头&#xff0c;对目标区域进行大范…...

操作手册:集成钉钉审批实例消息监听配置

此文档将记录在慧集通平台怎么实现钉钉审批实例结束或发起或取消时&#xff0c;能够实时的将对应的实例数据抓取出来送入第三方系统 集成平台配置 1、配置中心库&#xff0c;存储钉钉发送的消息&#xff0c;可以忽略&#xff0c;若不配置&#xff0c;则钉钉的消息将不再记录到…...

AI大模型-提示工程学习笔记4

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 不同主题提示词可以完成不同基本任务&#xff0c;常见的提示主题有&#xff1a; 文本概…...

Vue3.5 企业级管理系统实战(一):项目初始搭建与配置

本文详细介绍了如何使用 Vite 构建一个高效的 Vue 3.5 项目框架&#xff0c;并整合了 ESLint、Prettier、EditorConfig、Husky、lint-staged 和 commitlint 等现代化开发工具。通过这些工具的集成&#xff0c;我们能够确保代码质量、格式化和提交规范的一致性&#xff0c;从而提…...

缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)

**Cache-Aside Pattern&#xff08;旁路缓存模式&#xff09;**是一种广泛应用于缓存管理的设计模式&#xff0c;尤其在使用 Redis 作为缓存层时尤为常见。该模式通过在应用程序与缓存之间引入一个旁路&#xff0c;确保数据的一致性和高效性。本文将在之前讨论的 Redis 主动更新…...

杭州市有哪些大学能够出具论文检索报告?

杭州市具有查收查引服务的学校有浙江大学、杭州电子科技大学、浙江工业大学、杭州师范大学等高校。 1、浙江大学图书馆 浙江大学图书馆提供文献查收查引服务&#xff0c;包括查询学术论文被SCIE、SSCI、A&HCI、EI、CPCI-S、CPCI-SSH、CSSCI、CSCD等国内外权威数据库收录和…...

SpringBootWeb 登录认证(day12)

登录功能 基本信息 请求参数 参数格式&#xff1a;application/json 请求数据样例&#xff1a; 响应数据 参数格式&#xff1a;application/json 响应数据样例&#xff1a; Slf4j RestController public class LoginController {Autowiredpriva…...

使用AOP在切面逻辑中无法获取到requesetBody

使用场景&#xff1a;在接口处理之前&#xff0c;我们需要拿到请求参数&#xff0c;对参数进行校验。注意&#xff0c;这里需要拿到的是原始的请求信息&#xff01; 一般的获取方式 ServletInputStream inputStream request.getInputStream(); StringBuilder stringBuilder …...

生成模型:变分自编码器-VAE

1.基本概念 1.1 概率 这里有&#xff1a; x为真实图像&#xff0c;开源为数据集, 编码器将其编码为分布参数 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自动合并输出的小文件的主要优化手段为&#xff1a;HIVE将会启动一个独立的map-reduce任务进行输出文件的merge。 set hive.merge.mapfiles true&#xff1a; 在只有map的作业结束时合并小文件&#xff0c; set hive.merge.mapredfiles true&#xff1a; 在Map-Reduce的任…...

鸿蒙 ArkUI实现地图找房效果

常用的地图找房功能&#xff0c;是在地图上添加区域、商圈、房源等一些自定义 marker&#xff0c;然后配上自己应用的一些筛选逻辑构成&#xff0c;在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网&#xff0c;注册应用&…...

一套极简易的直流无刷电机(Deng FOC)开发套件介绍

目录 概述 1. 硬件组成介绍 1.1 主要硬件 1.2 电机驱动板介绍 1.3 2208电机模块 1.3.1 参数介绍 1.3.2 认识2208电机 2 驱动板接口介绍 2.1 PCB接口&#xff08;MCU&#xff09;定义 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的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...

【深度学习】在深度学习训练过程中,数据量太少会导致模型过拟合还是欠拟合?

过拟合与欠拟合 过拟合 : 是指在训练集上表现非常好&#xff0c;但是在新的数据集上表现较差的现象。具体来说&#xff0c;模型在训练集上过度学习&#xff0c;捕捉了数据中的噪声和偶然性&#xff0c;导致它对训练数据的拟合非常精确&#xff0c;但缺乏泛化能力&#xff0c;无…...

js迭代器模式

以前JS原生的集合类型数据结构&#xff0c;只有Array&#xff08;数组&#xff09;和Object&#xff08;对象&#xff09;&#xff1b; 而ES6中&#xff0c;又新增了Map和Set。四种数据结构各自有着自己特别的内部实现&#xff0c;但我们仍期待以同样的一套规则去遍历它们&…...

测试开发基础知识2

10.什么是等价类和边界值法&#xff1f; 1)等价类划分 等价类划分是将系统的输入域划分为若干部分&#xff0c;然后从每个部分选取少量代表性数据进行测试。等价类划分认为如果一个测试用例在某个等价类中的一个值上通过测试&#xff0c;那么它在这个类中的其他值上也…...

PromQL基础使用和案例解析

文章目录 PromQL简介数据类型1、瞬时数据 (Instant vector)2、区间数据 (Range vector)➢ Time Durations➢ Offest modifier➢ modifier 3、标量数据 (Scalar)4、字符串 (String) 条件匹配1、完全匹配2、正则匹配 运算符1、比较运算符2、算数运算符3、逻辑运算符4、聚合运算符…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...