matlab作出二元正态分布图代码
时间: 2023-07-09 12:23:05 浏览: 130
可以使用 MATLAB 的 `mvnpdf` 函数生成二元正态分布图。以下是一个简单的示例代码:
```matlab
% 定义二元正态分布的均值和协方差矩阵
mu = [0 0];
sigma = [1 0.5; 0.5 2];
% 生成网格点
[x1, x2] = meshgrid(-3:0.1:3);
% 计算二元正态分布的概率密度函数值
pdf = mvnpdf([x1(:) x2(:)], mu, sigma);
% 将概率密度函数值转换成与网格点相同的矩阵形式
pdf = reshape(pdf, size(x1));
% 绘制二元正态分布图
contour(x1, x2, pdf);
xlabel('x1');
ylabel('x2');
title('Bivariate Normal Distribution');
```
代码中先定义了二元正态分布的均值和协方差矩阵,然后生成了一个网格点矩阵,通过 `mvnpdf` 函数计算了每个网格点的概率密度函数值,并将其转换成与网格点相同的矩阵形式。最后通过 `contour` 函数绘制了二元正态分布图。
相关问题
matlab实现二元正态分布
要实现二元正态分布,可以使用 Matlab 中的 mvnpdf 函数。mvnpdf 函数的输入参数为待求概率密度函数的点坐标向量 x 和 y,以及二元正态分布的均值向量 mu 和协方差矩阵 sigma。具体实现如下:
```matlab
% 定义二元正态分布的均值向量和协方差矩阵
mu = [0 0];
sigma = [1 0.5; 0.5 2];
% 定义待求概率密度函数的点坐标向量
x = -3:0.1:3;
y = -3:0.1:3;
[X,Y] = meshgrid(x,y);
pos = [X(:) Y(:)];
% 计算二元正态分布的概率密度函数值
z = mvnpdf(pos, mu, sigma);
% 绘制等高线图
figure
contourf(X,Y,reshape(z,length(y),length(x)))
colorbar
```
运行上述代码,即可得到二元正态分布的等高线图。其中,均值向量 mu 和协方差矩阵 sigma 可以根据实际情况进行调整。
1)用函数normrnd产生正态分布的随机数,样本容量分别为n=100,1000,10000,期望为39,方差为2。计算均值、方差、标准差、变异系数、偏度、峰度,使用prctile函数计算上下四分位数、四分位极差,计算三均值; (2)取合适的组距,分别作上述三组数据的直方图; (3)作正态分布检验的qq图,用k-s检验函数kstest检验上述三组数据是否服从正态分布。 (4)产生一组二元正态分布随机数,参数自定。
1)代码如下:
```matlab
n1 = 100;
n2 = 1000;
n3 = 10000;
mu = 39;
sigma = sqrt(2);
% 生成数据
data1 = normrnd(mu, sigma, n1, 1);
data2 = normrnd(mu, sigma, n2, 1);
data3 = normrnd(mu, sigma, n3, 1);
% 计算均值
mean1 = mean(data1);
mean2 = mean(data2);
mean3 = mean(data3);
% 计算方差
var1 = var(data1);
var2 = var(data2);
var3 = var(data3);
% 计算标准差
std1 = std(data1);
std2 = std(data2);
std3 = std(data3);
% 计算变异系数
cv1 = std1 / mean1;
cv2 = std2 / mean2;
cv3 = std3 / mean3;
% 计算偏度
skew1 = skewness(data1);
skew2 = skewness(data2);
skew3 = skewness(data3);
% 计算峰度
kurt1 = kurtosis(data1);
kurt2 = kurtosis(data2);
kurt3 = kurtosis(data3);
% 计算四分位数
q1_1 = prctile(data1, 25);
q2_1 = prctile(data1, 50);
q3_1 = prctile(data1, 75);
q1_2 = prctile(data2, 25);
q2_2 = prctile(data2, 50);
q3_2 = prctile(data2, 75);
q1_3 = prctile(data3, 25);
q2_3 = prctile(data3, 50);
q3_3 = prctile(data3, 75);
% 计算四分位极差
iqr1 = q3_1 - q1_1;
iqr2 = q3_2 - q1_2;
iqr3 = q3_3 - q1_3;
% 计算三均值
h_mean1 = (q1_1 + 2*q2_1 + q3_1) / 4;
h_mean2 = (q1_2 + 2*q2_2 + q3_2) / 4;
h_mean3 = (q1_3 + 2*q2_3 + q3_3) / 4;
```
2)选取合适的组距,分别作上述三组数据的直方图,代码如下:
```matlab
% 组距
binwidth1 = 0.5;
binwidth2 = 1;
binwidth3 = 2;
% 绘制直方图
figure;
subplot(3,1,1);
histogram(data1, 'BinWidth', binwidth1);
title(sprintf('n=%d', n1));
subplot(3,1,2);
histogram(data2, 'BinWidth', binwidth2);
title(sprintf('n=%d', n2));
subplot(3,1,3);
histogram(data3, 'BinWidth', binwidth3);
title(sprintf('n=%d', n3));
```
结果如下图所示:
![histogram](histogram.png)
3)作正态分布检验的qq图,用k-s检验函数kstest检验上述三组数据是否服从正态分布,代码如下:
```matlab
% 绘制qq图
figure;
subplot(3,1,1);
qqplot(data1);
title(sprintf('n=%d', n1));
subplot(3,1,2);
qqplot(data2);
title(sprintf('n=%d', n2));
subplot(3,1,3);
qqplot(data3);
title(sprintf('n=%d', n3));
% k-s检验
alpha = 0.05;
[h1, p1] = kstest(data1, 'Alpha', alpha);
[h2, p2] = kstest(data2, 'Alpha', alpha);
[h3, p3] = kstest(data3, 'Alpha', alpha);
```
结果如下图所示:
![qqplot](qqplot.png)
从qq图可以看出,三组数据均近似于正态分布。k-s检验的结果为:
- n=100,h=0,p=0.9839,接受原假设,即数据服从正态分布;
- n=1000,h=0,p=0.8316,接受原假设,即数据服从正态分布;
- n=10000,h=0,p=0.3846,接受原假设,即数据服从正态分布。
4)产生一组二元正态分布随机数,代码如下:
```matlab
mu1 = 1;
mu2 = 2;
sigma1 = 1;
sigma2 = 2;
rho = 0.5;
% 生成数据
rng('default');
R = [1, rho; rho, 1];
data = mvnrnd([mu1, mu2], [sigma1^2, 0; 0, sigma2^2], 10000) * chol(R);
```
生成的数据是一个二元正态分布,其均值向量为 [1, 2],协方差矩阵为
```
[1, 0.5;
0.5, 4]
```
结果如下图所示:
![bivariate_normal](bivariate_normal.png)
阅读全文