matlab如何绘制离散数据的置信椭圆并求取相关面积
将通过下述几个方面阐述下如何绘制置信椭圆并求取相关面积:
- 引言
- 原理介绍
- 源代码
- 结论
一、引言
对离散数据的统计学分析的时候,我们会经常遇到对于一类数据的可视化,其中对于数据的置信椭圆的绘制是我们经常遇到的情况。 在这篇文章中,我将展示如何为2D正态分布数据绘制误差椭圆(也称为置信椭圆)。误差椭圆表示高斯分布的等值线,并允许您可视化2D置信区间。下图显示了一组2D正态分布数据样本的95%置信椭圆。该置信椭圆定义了一个区域,该区域包含可以从基础高斯分布中提取的所有样本的95%。
二、原理介绍
1、轴对齐置信椭圆
在推导获得误差椭圆的通用方法之前,让我们看一下椭圆的主轴与X轴对齐的特殊情况,如下图所示:
上图说明了椭圆的角度由数据的协方差确定。在这种情况下,协方差为零,因此数据不相关,从而导致轴对齐的误差椭圆。
表格1。 数据的协方差矩阵如图2所示
此外,很明显,椭圆轴的大小取决于数据的方差。在我们的情况下,最大的方差在X轴方向,而最小的方差在Y轴方向。
一般而言,以长轴为长轴,2a长轴为短轴2b,以原点为中心的椭圆形轴的方程式由以下方程式定义:
在我们的情况下,轴的长度由标准偏差\ sigma_x和\ sigma_y数据定义,以使误差椭圆的方程变为:
其中s定义椭圆的比例,并且可以是任意数字(例如s = 1)。现在的问题是如何选择s,使得生成的椭圆的比例代表所选的置信度(例如95%的置信度对应于s = 5.991)。
我们的2D数据是从具有零协方差的多元高斯抽样的。这意味着x值和y值也都呈正态分布。因此,等式(2)的左侧实际上表示独立的正态分布数据样本的平方和。已知平方高斯数据点的总和是根据所谓的卡方分布进行分布的。卡方分布是根据“自由度”定义的,自由度代表未知数。在我们的情况下,有两个未知数,因此有两个自由度。
因此,我们可以s通过计算卡方似然来轻松获得上述总和的概率,从而等于特定值。实际上,由于我们对置信区间感兴趣,因此我们正在寻找s小于或等于特定值的概率,该概率可以使用累积卡方分布轻松获得。由于统计学家是懒惰的人,我们通常不尝试计算此概率,而只是在概率表中查找它:https : //people.richland.edu/james/lecture/m170/tbl-chi.html。
例如,使用此概率表,我们可以轻松地在2自由度情况下找到这一点:
因此,95%的置信区间对应于s = 5.991。换句话说,95%的数据将落入定义为的椭圆内:
类似地,99%的置信区间对应于s = 9.210,而90%的置信区间对应于s = 4.605。
因此,通过图2中的误差椭圆节目可以得出具有长轴长度的椭圆形等于和短轴长度
。
任意置信椭圆
在数据不相关的情况下(例如存在协方差),所得的误差椭圆将不会与轴对齐。在这种情况下,只有当我们临时定义一个新的坐标系以使椭圆变为与轴对齐,然后再旋转生成的椭圆时,以上段落的推理才成立。
换句话说,尽管我们较早地计算了方差\ sigma_x并\ sigma_y平行于x轴和y轴,但现在我们需要计算平行于置信椭圆的长轴和短轴的这些方差。图1中用粉红色和绿色箭头表示需要计算这些方差的方向。
这些方向实际上是数据变化最大的方向,并由协方差矩阵定义。可以将协方差矩阵视为对某些原始数据进行线性变换以获得当前观察到的数据的矩阵。在上一篇有关特征向量和特征值的文章中,我们证明了沿这种线性变换的方向向量是变换矩阵的特征向量。实际上,图1中粉红色和绿色箭头所示的向量是数据协方差矩阵的特征向量,而向量的长度对应于特征值。
因此,特征值代表数据在特征向量方向上的扩散。换句话说,特征值表示数据在特征向量方向上的方差。在轴对齐误差椭圆的情况下,即当协方差等于零时,特征值等于协方差矩阵的方差,特征向量等于x轴和y轴的定义。在任意相关数据的情况下,特征向量表示数据最大扩展的方向,而特征值则定义了此扩展的实际大小。
因此,可以类似于轴对齐的情况定义95%置信椭圆,其中长度的长轴和长度的短轴2
,其中 lambda_1和lambda_2代表协方差矩阵的特征值。
要获得椭圆的方向,我们只需计算最大特征向量与x轴的夹角即可:
其中V1,协方差矩阵的特征向量对应于最大特征值。
根据短轴和长轴的长度以及\α长轴和x轴之间的角度,绘制置信椭圆变得很简单。图3显示了几个置信度值的误差椭圆:
通过上述的计算之后,椭圆的面积则就是简单的将长半轴乘以短半轴乘以圆周率即可。下面则是列出了两种不同的计算置信椭圆面积的代码。
代码一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | clear all; close all; % Create some random data s = [2 2]; x = randn(334,1); y1 = normrnd(s(1).*x,1); y2 = normrnd(s(2).*x,1); data = [y1 y2]; % Calculate the eigenvectors and eigenvalues covariance = cov(data); [eigenvec, eigenval ] = eig(covariance); % Get the index of the largest eigenvector [largest_eigenvec_ind_c, r] = find(eigenval == max(max(eigenval))); largest_eigenvec = eigenvec(:, largest_eigenvec_ind_c); % Get the largest eigenvalue largest_eigenval = max(max(eigenval)); % Get the smallest eigenvector and eigenvalue if(largest_eigenvec_ind_c == 1) smallest_eigenval = max(eigenval(:,2)) smallest_eigenvec = eigenvec(:,2); else smallest_eigenval = max(eigenval(:,1)) smallest_eigenvec = eigenvec(1,:); end % Calculate the angle between the x-axis and the largest eigenvector angle = atan2(largest_eigenvec(2), largest_eigenvec(1)); % This angle is between -pi and pi. % Let's shift it such that the angle is between 0 and 2pi if(angle < 0) angle = angle + 2*pi; end % Get the coordinates of the data mean avg = mean(data); % Get the 95% confidence interval error ellipse chisquare_val = 2.4477; theta_grid = linspace(0,2*pi); phi = angle; X0=avg(1); Y0=avg(2); a=chisquare_val*sqrt(largest_eigenval); b=chisquare_val*sqrt(smallest_eigenval); % the ellipse in x and y coordinates ellipse_x_r = a*cos( theta_grid ); ellipse_y_r = b*sin( theta_grid ); %Define a rotation matrix R = [ cos(phi) sin(phi); -sin(phi) cos(phi) ]; %let's rotate the ellipse to some angle phi r_ellipse = [ellipse_x_r;ellipse_y_r]' * R; % Draw the error ellipse plot(r_ellipse(:,1) + X0,r_ellipse(:,2) + Y0,'-') hold on; % Plot the original data plot(data(:,1), data(:,2), '.'); mindata = min(min(data)); maxdata = max(max(data)); Xlim([mindata-3, maxdata+3]); Ylim([mindata-3, maxdata+3]); hold on; % Plot the eigenvectors quiver(X0, Y0, largest_eigenvec(1)*sqrt(largest_eigenval), largest_eigenvec(2)*sqrt(largest_eigenval), '-m', 'LineWidth',2); quiver(X0, Y0, smallest_eigenvec(1)*sqrt(smallest_eigenval), smallest_eigenvec(2)*sqrt(smallest_eigenval), '-g', 'LineWidth',2); hold on; % Set the axis labels hXLabel = xlabel('x'); hYLabel = ylabel('y'); |
代码二:
1 2 3 4 5 6 7 8 | function [saxes,hypervolume] = cop_AREA_CE95(data) [n, p] = size(data); % 2-D array dimensions covar = cov(data); % covariance matrix of data [U, S, V] = svd(covar); % singular value decomposition f95 = finv(.95,p,n-p)*(n-1)*p*(n+1)/n/(n-p); % F 95 percent point function saxes = sqrt(diag(S)*f95); % semi-axes lengths hypervolume = pi^(p/2)/gamma(p/2+1)*prod(saxes); %for p=2, gamma(p/2+1)=1 end |
结论
在本文中,我们展示了如何根据选定的置信度值获得2D正态分布数据的误差椭圆。当可视化或分析数据时,该方法十分好用。