基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)

这篇具有很好参考价值的文章主要介绍了基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Part.I Introduction

基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)

因为在学习模糊度固定的时候涉及了『搜索椭球』这一概念,很想知道是如何用椭球来表示搜索空间的。出于好奇,在查阅了一些相关文献,终于解决了笔者的疑惑,此篇博文就简要记录一下如何根据协方差矩阵来绘制椭球。

下面是得到的一些结论:

  • 对协方差矩阵进行奇异值分解得到奇异值和奇异向量
  • 协方差矩阵的奇异值表征椭球的向径长度
  • 协方差矩阵的奇异向量表征椭球的向径指向

Part.II 二维情况

Chap.I 绘图函数

%% 根据 奇异值分解绘制相关椭圆
function draw_oval1(cova)
[U,S,V] = svd(cova);    % 奇异值分解
% [U,S] = eig(cova);         % 特征值
angle = cart2pol(U(1, :), U(2, :))*180/pi;
beta = angle(1, 1);
if beta<0; beta=beta+180; end
    
semimajor = sqrt(S(1, 1)); % 长轴长度(一半)
semiminor = sqrt(S(2, 2)); % 短轴长度(一半)
alpha = linspace(0, 360, 2000)';
level = 1;
% 椭圆坐标点
ellipse_X = 0+sqrt(level)*(semimajor*cosd(alpha)*cosd(beta)-...
    semiminor*sind(alpha)*sind(beta));
ellipse_Y = 0+sqrt(level)*(semimajor*cosd(alpha)*sind(beta)+...
    semiminor*sind(alpha)*cosd(beta));

%% 可视化
% figure
hold on
box on
grid on
set(gca, 'linewidth', 1.5)
% 置信椭圆
plot(ellipse_X, ellipse_Y, 'Color', [0, 102, 255]/255,...
    'LineStyle', '-', 'LineWidth', 3),

level = 1.5;
quiver(0,0,U(1,1)*semimajor*level,U(1,2)*semimajor*level,'LineWidth',2.0);
quiver(0,0,U(2,1)*semiminor*level,U(2,2)*semiminor*level,'LineWidth',2.0);
str=sprintf('a=%.2f\nb=%.2f\n',semimajor,semiminor);  % len=%d\n
str=[str,sprintf('e=%.2f\nang=%.2f',(semimajor-semiminor)/semimajor,beta)];
text(2, -3, str, 'FontSize', 16, 'FontWeight', 'bold')
axis equal
end

Chap.II 调用示例与结果

调用示例:

Z=[55.4 38.4;38.4 28];
draw_oval1(Z)

结果:
基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)

Part.III 三维情况

Chap.I 绘图函数

%% 根据 奇异值绘制相关椭球
function draw_ellipsoid(A)
[theta,phi] = meshgrid(0:10:360,-90:10:90);
[nr,nc] = size(theta);
Theta = reshape(theta,nr*nc,1)*pi/180;
Phi = reshape(phi,nr*nc,1)*pi/180;
%[R,V] = eig(A);
[R,V,U] = svd(A);    % 奇异值分解, sqrt(V) 是半长轴, R 是向量方向
V=sqrt(V);
nd = size(A,1);
V = abs(V);
xyz = V(1,1)*sin(Phi)*R(:,1)'+ V(2,2)*cos(Phi).*cos(Theta)*R(:,2)'+ V(3,3)*cos(Phi).*sin(Theta)*R(:,3)';
P1 = reshape(xyz(:,1),nr,nc);
P2 = reshape(xyz(:,2),nr,nc);
P3 = reshape(xyz(:,3),nr,nc);
plot3(0,0,0);
hold on; surfl(P1, P2, P3);
%绘制向量箭头
level=1.5;
quiver3(0,0,0,R(1,1)*V(1,1)*level,R(2,1)*V(1,1)*level,R(3,1)*V(1,1)*level,'LineWidth',2.0);
quiver3(0,0,0,R(1,2)*V(2,2)*level,R(2,2)*V(2,2)*level,R(3,2)*V(2,2)*level,'LineWidth',2.0);
quiver3(0,0,0,R(1,3)*V(3,3)*level,R(2,3)*V(3,3)*level,R(3,3)*V(3,3)*level,'LineWidth',2.0);
end

Chap.II 调用示例与结果

调用示例:

cova=[6.290 5.978 0.544;5.978 6.292 2.340;0.544 2.340 6.288];
draw_ellipsoid1(cova)
saveGIF()

结果:
基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)

Chap.III 补充函数

可以看到,笔者将绘制结果保存成了一个gif,所用到的函数为:

%% generate GIF and save file.
function saveGIF()
sdir='C:\Users\OHanlon\Desktop\temp\ellipsoid.gif';
%surf(peaks,'EdgeColor','yellow')
img_num = 120;
for i=1:img_num
    camorbit(360/img_num,0,'data',[0,0,1])   %[0 0 1]表示按z轴旋转。
    M=getframe(gcf);
    nn=frame2im(M);
    [nn,cm]=rgb2ind(nn,256);
    if i==1
        imwrite(nn,cm,sdir,'gif','LoopCount',inf,'DelayTime',0.1);%说明loopcount只是在i==1的时候才有用
    else
        imwrite(nn,cm,sdir,'gif','WriteMode','append','DelayTime',0.1)%当i>=2的时候loopcount不起作用
    end
end
end

Part.IV 探究过程与存在的问题

Chap.I 探究过程

刚开始的时候,绕了一个弯路:因为之前有写过置信椭圆(误差椭圆)详解,里面可以用主成分分析来绘制样本的置信区域(椭圆);因为我不知道是如何来得到椭圆的长短半轴以及方向的,只是将里面用的函数当作一个黑盒子,只要我有样本数据,输进去它就会给我吐出来一个椭圆。所以我就用待画的椭圆来模拟一些样本数据,丢给那个函数就行了。但是这样存在一个问题:模拟出来的数据总是会存在离群值,从而导致绘制出来的椭圆并不是所给协方差,而是和它有一个微小的偏差(可以忽略不记)。

利用这种思路写的绘制函数如下:

function draw_oval(cova)
% ----------- 模拟数据 ---------------
len=300*10;
data=randn(len, 2);
data1=[];
while size(data1,1)~=size(data,1)
    data1=data;
    data=rmoutliers(data1,'mean');
end
R = chol(cova);                % 上三角矩阵
data=data*R;

center = mean(data);
[coeff, ~, latent, ~, ~] = pca(data);

% r1 r2 为自定义的向量大小参数()
r1 = 6;
r2 = 3;
% p1 p2 为第一主轴和第二主轴上的点
p1 = r1*coeff(:, 1)'+center;
p2 = r2*coeff(:, 2)'+center;

% 主轴方向与X轴之间的夹角
angle = cart2pol(coeff(1, :), coeff(2, :))*180/pi;
% disp("第一主轴方向与 X 轴之间的夹角");
beta = angle(1, 1);
% 置信椭圆坐标(以 95% 为例)
semimajor = sqrt(latent(1, 1)); % 长轴长度(一半)
semiminor = sqrt(latent(2, 1)); % 短轴长度(一半)
alpha = linspace(0, 360, 2000)';
% 卡方分布表
% https://people.richland.edu/james/lecture/m170/tbl-chi.html
% level = 4.605;  % 90%
% level = 5.991;  % 95%
% level = 9.210;  % 99%
level = 10.597;  % 99.5%
% 椭圆坐标点
ellipse_X = center(1, 1)+sqrt(level)*(semimajor*cosd(alpha)*cosd(beta)-...
    semiminor*sind(alpha)*sind(beta));
ellipse_Y = center(1, 2)+sqrt(level)*(semimajor*cosd(alpha)*sind(beta)+...
    semiminor*sind(alpha)*cosd(beta));

%% 可视化
% figure
hold on
box on
grid on
% 原始数据
% scatter(data(:, 1), data(:, 2), 15, 'LineWidth', 1.2,...
%         'MarkerEdgeColor', [151, 138, 189]/255,...
%         'MarkerFaceColor', [151, 138, 189]/255);
% t=10;
% xlim([-t, t]);      % 在这里更改显示界限
% ylim([-t, t]);
set(gca, 'linewidth', 1.5)

% 置信椭圆
plot(ellipse_X, ellipse_Y, 'Color', [0, 102, 255]/255,...
    'LineStyle', '-', 'LineWidth', 3),

% 第一主轴方向
arrow_1 = annotation('arrow', 'Color', [162, 20, 47]/255,...
    'HeadStyle', 'cback2', 'LineWidth', 3, 'HeadWidth', 20, 'HeadLength', 20);
arrow_1.Parent = gca;
arrow_1.X = [center(1, 1), p1(1, 1)];
arrow_1.Y = [center(1, 2), p1(1, 2)];  

% 第二主轴方向
arrow_2 = annotation('arrow', 'Color', [0, 114, 189]/255,...
    'HeadStyle', 'cback2', 'LineWidth', 3, 'HeadWidth', 20, 'HeadLength', 20);
arrow_2.Parent = gca; 
arrow_2.X = [center(1, 1), p2(1, 1)]; 
arrow_2.Y = [center(1, 2), p2(1, 2)];  

% 中心点
plot(center(1, 1), center(1, 2),...
    'Marker', 'o',...
    'MarkerSize', 8,...
    'MarkerEdgeColor', [162, 20, 47]/255,...
    'MarkerFaceColor', [162, 20, 47]/255);

% title('主轴方向和置信椭圆', 'FontSize', 16, 'FontWeight', 'bold')
str=sprintf('a=%.2f\nb=%.2f\n',semimajor,semiminor);  % len=%d\n
str=[str,sprintf('e=%.2f\nang=%.2f',(semimajor-semiminor)/semimajor,beta)];
text(2, -3, str, 'FontSize', 16, 'FontWeight', 'bold')
axis equal
end

后来对pca函数进行了一下研究,发现pca就是对样本的协方差矩阵做了一个奇异值分解,椭圆的长短半轴和方向都是根据分解结果得到的。蓦然回首,那人却在灯火阑珊处。所以上面的是直接用奇异值分解对协方差矩阵进行了分解,然后直接绘制椭圆的函数。


然后,在做三维椭球绘制的时候,我发现特征值和奇异值有着千丝万缕的联系,但是这种关系搞得我云里雾里,只知道求椭球参数用奇异值分解也行,用特征值和特征向量也行,只是特征向量和奇异向量貌似只有顺序不一样?文章来源地址https://www.toymoban.com/news/detail-464500.html

Chap.II 存在的问题

  • 只会绘制二维和三维的情况,但是更高维度的呢?
  • 有大佬总结用 R 语言进行相关系数的可视化[3],有点好看,用空学学。

Reference

  1. 在matlab中绘制椭圆和椭球
  2. 【矩阵论】矩阵的奇异值分解
  3. R 数据可视化 — 相关系数图

到了这里,关于基于 Matlab 的方差-协方差矩阵可视化表示(椭圆、椭球)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于协方差矩阵自适应演化策略(CMA-ES)的高效特征选择

    特征选择是指从原始特征集中选择一部分特征,以提高模型性能、减少计算开销或改善模型的解释性。特征选择的目标是找到对目标变量预测最具信息量的特征,同时减少不必要的特征。这有助于防止过拟合、提高模型的泛化能力,并且可以减少训练和推理的计算成本。 如果

    2024年01月19日
    浏览(28)
  • 【什么是自相关矩阵,自协方差矩阵,互相关矩阵,互协方差矩阵?】

    最近看模式识别课程的时候卡在了一个地方,见下图: 协方差矩阵倒还知道,自相关矩阵?怎么推导的?它有什么意义?上网查了资料,要么晦涩难懂,要么一堆废话,这里我想尽量用最简洁的语言讲清楚它们。 向量的内积与外积 场景:机器学习 样本(n个样本,N个维度(

    2023年04月20日
    浏览(29)
  • 矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例

            在统计学中, 方差 是用来度量 单个随机变量 的 离散程度 ,而协方差则一般用来刻画 两个随机变量 的 相似程度。 参考: 带你了解什么是Covariance Matrix协方差矩阵 - 知乎 将输入数据A进行中心化处理得到A\\\'。即通过 减去每个维度的平均值 来实现中心化。 注意:

    2024年02月03日
    浏览(34)
  • 【概率论理论】协方差,协方差矩阵理论(机器学习)

      在许多算法中需要求出两个分量间相互关系的信息。协方差就是描述这种相互关联程度的一个特征数。   设 ( X , Y ) (X,Y) ( X , Y ) 是一个二维随机变量,若 E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] E[(X-E(X))(Y-E(Y))] E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] 存在,则称此数学期望为 X X X 与

    2024年02月14日
    浏览(36)
  • 协方差矩阵在torch和numpy中的比较,自行实现torch协方差矩阵

    数学中(教科书、大学课堂、数学相关的科普视频),一个矩阵的向量往往是竖着的, 一列作为一个vector ,这一点numpy库也是这样默认的。 但是在机器学习以torch框架为例,一个有意义的向量或者说embedding 是横着的 。 因为numpy库默认是一列是一个向量而torch等机器学习框架

    2023年04月08日
    浏览(28)
  • 协方差矩阵的研究

    (1)协方差矩阵的定义、计算过程。         协方差(Covariance):在概率论和统计学中用于衡量两个变量的总体误差。协方差在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。协方差矩阵

    2024年02月13日
    浏览(22)
  • 协方差矩阵

    首先先了解方差与协方差: 协方差: (1)针对 一维样本集合 时(y i =x i ),求出的协方差其实就是方差,既方差是协方差的一种特殊情况。协方差意义和方差一样,都是 反应集合中各元素离散程度 。 (2)针对 二维样本集合 时,求出的协方差反映的就是 两个维度之间的相

    2024年02月10日
    浏览(48)
  • 因子模型:协方差矩阵

    本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 因子协方差矩阵 (factor covariance matrix)在计算风险的时候很重要。如果一个模型有个因子,那么协方差矩阵的大小就是。对角线元素是每个因子的方差,非对角线元素是协方差,这些协方差有可能不为零。 协方差

    2024年02月04日
    浏览(76)
  • 【信息融合与状态估计】基于Kalman滤波和现代时间序列分析方法,利用集中式融合估计、分布式融合估计(按矩阵加权、按对角阵加权、按标量加权)、 协方差交叉融合等方法实现对状态的融合估计(Matlab)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 改进的CI融合估值器 2.2 基于现代时间

    2024年01月15日
    浏览(43)
  • 协方差矩阵到底有什么用?

    我们知道,线性代数,可以完成空间上的线性变换——旋转,缩放。对于协方差,我们隐约可以想到,它能解释一个随机变量,它在各个维度的变化程度。但是,这种认识其实还是处于比较浅层次的。数学嘛,总要落实到公式上,才算认识比较深刻。 我认为,协方差一个经典

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包