%% 中心极限定理仿真实践1: 多变量的和是否呈正态分布的仿真实践 %%
%思路:随机生成多组(至少30组?)等长的不同类型的分布,然后将所有的分布叠加。
%author: https://blog.csdn.net/xhblair?spm=1010.2135.3001.5343%
clear; close all; clc;
%------ 生成各种分布下的数据 ------%
NumSample = 512; %每个分布生成1*256大小的样本数据
%我这里设定了:均匀分布rand、正态分布normrnd、对数正态分布lognrnd、二项分布binornd、泊松分布poissrnd、指数分布exprnd、卡方分布chi2rnd、T分布trnd 8种类型的分布,
%所生成的样本组数为:K*8, k≥1 为整数 K对应了k次循环,每次循环生成8组分布,前后循环下同类型分布的均值和方差不一样(随机产生)
K = 10;
sumX = zeros(1,NumSample); %用来装载所有分布叠加的结果
%可以看看这几种分布%
x1 = rand(1,NumSample);
x2 = normrnd(rand(1),rand(1),1,NumSample); %指定均值和标准差(我这里都在(0 1)内随机生成)
x3 = lognrnd(rand(1),rand(1),1,NumSample);
x4 = binornd(10,rand(1),1,NumSample); %指定试验次数和试验成功率
x5 = poissrnd(randi(1),1,NumSample); %指定均值
x6 = exprnd(rand(1),1,NumSample); %指定均值
x7 = chi2rnd(randi(10),1,NumSample); %指定自由度
x8 = trnd(randi(10),1,NumSample); %指定自由度
figure(100);
subplot(2,4,1);plot(1:NumSample,x1);title('均匀分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,2);plot(1:NumSample,x2);title('正态分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,3);plot(1:NumSample,x3);title('对数正态分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,4);plot(1:NumSample,x4);title('二项分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,5);plot(1:NumSample,x5);title('泊松分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,6);plot(1:NumSample,x6);title('指数分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,7);plot(1:NumSample,x7);title('卡方分布');xlabel('样本ID');ylabel('样本值');grid on;
subplot(2,4,8);plot(1:NumSample,x8);title('T分布');xlabel('样本ID');ylabel('样本值');grid on;
for ii = 1:K
x1 = rand(1,NumSample);
x2 = normrnd(rand(1),rand(1),1,NumSample); %指定均值和标准差(我这里都在(0 1)内随机生成)
x3 = lognrnd(rand(1),rand(1),1,NumSample);
x4 = binornd(10,rand(1),1,NumSample); %指定试验次数和试验成功率
x5 = poissrnd(randi(1),1,NumSample); %指定均值
x6 = exprnd(rand(1),1,NumSample); %指定均值
x7 = chi2rnd(randi(10),1,NumSample); %指定自由度
x8 = trnd(randi(10),1,NumSample); %指定自由度
sumX = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + sumX;
end
%这里我分别用:1、在之前的概率密度中的方法求其概率密度 2、用Matlab自带的histfit来拟合
%首先求均值和方差
Datamean = mean(sumX);
varsum = 0;
for ii = 1:NumSample
varsum = varsum + (sumX(ii) - Datamean)^2;
end
Datavar = varsum/NumSample;
%归一化?
sumX = (sumX - Datamean)./sqrt(Datavar);
%法1
%将数据更加离散化:为等间隔的N个区间,计算每个区间内的概率得到概率密度分布、分布函数
minData = min(sumX);
maxData = max(sumX);
InterValNum = 30;
Dval = (maxData - minData)/InterValNum; %每个区间的间隔
NumBuffer = zeros(1,InterValNum); %构造该变量用来装载每个区间的样本数
%怎么计算每个数据的所属区间?构造两个循环!
for ii = 1:NumSample
for jj = 1:InterValNum
if sumX(ii) >= (minData + (jj-1)*Dval) && sumX(ii) < (minData + jj*Dval)
NumBuffer(jj) = NumBuffer(jj) + 1;
break;
end
if sumX(ii) == (minData + jj*Dval) %前面我们是取了左边的值,没有考虑如果数据值等于最大值的情况。
NumBuffer(end) = NumBuffer(end)+1;
break;
end
end
end
PDF_Y = NumBuffer./NumSample;
%构造横坐标: 概率分布的横坐标我们取各区间的中间值? 分布函数的纵坐标也是。
Xaxis = linspace(minData,maxData,InterValNum);
figure(1)
plot(Xaxis,PDF_Y);grid on; xlabel('幅值(样本值)');ylabel('概率值'); title('样本的概率密度分布对应的曲线');
%法2
figure(2)
histfit(sumX,25);xlabel('幅值区间');ylabel('次数');title('样本分布直方图');grid on
墨@#≯
- 粉丝: 1376
- 资源: 45
最新资源
- 豆包MarsCode 蛇年编程大作战 - 蛇年运势预测
- 一个在绘画软件《画世界》体现2w算法的图形模版
- 《蓝桥杯题库》(毕业设计,源码,教程)简单部署即可运行 功能完善、操作简单,适合毕设或课程设计.zip
- Cinebench R23安装包
- 《蓝桥杯Python解答(入门练习、基础练习、算法训练)》(毕业设计,源码,教程)简单部署即可运行 功能完善、操作简单,适合毕设或课程设计.zip
- C++17新年烟花代码(基于SFML3.0)
- 奶龙最强版v1(修复版) (1).zip
- 基于HBuilder-uni-project的UniAPP社区论坛项目实战设计源码
- 基于JavaScript的HTML/CSS/JavaScript低代码开发平台设计源码
- 基于Vue框架的Go语言开发的redis管理器web端设计源码
- 基于C语言的跨平台C-CNN深度学习神经网络模型设计源码
- 基于HTML和Java的my_server多语言设计源码
- 基于Vue的ShopXO开源商城可视化DIY装修设计源码
- 基于Java与HTML的AI智能减肥食谱设计源码
- 基于ASP.NET Core 8.0的Vue技术简单三层后台管理系统设计源码
- 【计算机毕业设计免费!】基于servlet+jsp网上购书商城系统 附源码!
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈