Vectors must be the same length 错误在Matlab中的曲线拟合
Vectors must be the same length error in Curve Fitting in Matlab
我在为函数拟合随机数据时遇到问题
这是我的代码
N = 100;
mu = 5; stdev = 2;
x = mu+stdev*randn(N,1);
bin=mu-6*stdev:0.5:mu+6*stdev;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;
x_ = x(1):0.1:x(end);
y_ = (1./sqrt(8.*pi)).*exp(-((x_-mu).^2)./8);
plot(x_,y_,'b-'); hold on;
似乎我遇到了矢量大小问题,因为它给我错误
Error using plot
Vectors must be the same length.
请注意,我简化了 y_,因为 mu 和标准偏差是已知的。
剧情:
那么首先对你的问题做一些调整:
您不是要对通过从同一分布(参数为 (mu,sigma)
的正态分布)中随机取点而获得的直方图执行 curve fitting. What you are trying to do (in my opinion) is to overlay a probability density function。这两条曲线确实应该重叠,因为它们代表的是同一件事,只有一条是解析的,另一条是数值得出的。
如图所示 hist documentation, hist
is not recommended and you should use histogram instead
第一步:生成随机数据
知道分布是正态分布,我们可以使用MATLAB's random function来做到这一点:
N = 150;
rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,N,1);
第二步:绘制直方图
因为我们不只是想要每个 bin 中元素的计数,而是想了解概率密度函数,我们可以使用 'Normalization'
'pdf'
参数
Nbins = 25;
f=histogram(r,Nbins,'Normalization','pdf');
hold on
在这里,我宁愿指定 bin 的数量,也不愿指定 bin 本身,因为你永远不会提前知道你的数据离均值有多远。
最后一步:在直方图上叠加概率密度函数
直方图已经与概率密度函数一致,只需叠加密度函数即可:
x_ = linspace(min(r),max(r),100);
y_ = (1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2));
plot(x_,y_,'b-');
和N = 150
和N = 1500
有N = 150.000
和Nbins = 50
如果出于某些不明确的原因您想使用旧的 hist() 函数
旧的 hist()
函数无法处理归一化,因此您必须手动完成,通过归一化密度函数以适合直方图:
N = 1500;
% rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,1,N);
Nbins = 50;
[~,centers]=hist(r,Nbins);
hist(r,Nbins); hold on
% Width of bins
Widths = diff(centers);
x_ = linspace(min(r),max(r),100);
y_ = N*mean(Widths)*(1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2));
plot(x_,y_,'r-');
我在为函数拟合随机数据时遇到问题
这是我的代码
N = 100;
mu = 5; stdev = 2;
x = mu+stdev*randn(N,1);
bin=mu-6*stdev:0.5:mu+6*stdev;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;
x_ = x(1):0.1:x(end);
y_ = (1./sqrt(8.*pi)).*exp(-((x_-mu).^2)./8);
plot(x_,y_,'b-'); hold on;
似乎我遇到了矢量大小问题,因为它给我错误
Error using plot
Vectors must be the same length.
请注意,我简化了 y_,因为 mu 和标准偏差是已知的。
剧情:
那么首先对你的问题做一些调整:
您不是要对通过从同一分布(参数为
(mu,sigma)
的正态分布)中随机取点而获得的直方图执行 curve fitting. What you are trying to do (in my opinion) is to overlay a probability density function。这两条曲线确实应该重叠,因为它们代表的是同一件事,只有一条是解析的,另一条是数值得出的。如图所示 hist documentation,
hist
is not recommended and you should use histogram instead
第一步:生成随机数据
知道分布是正态分布,我们可以使用MATLAB's random function来做到这一点:
N = 150;
rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,N,1);
第二步:绘制直方图
因为我们不只是想要每个 bin 中元素的计数,而是想了解概率密度函数,我们可以使用 'Normalization'
'pdf'
参数
Nbins = 25;
f=histogram(r,Nbins,'Normalization','pdf');
hold on
在这里,我宁愿指定 bin 的数量,也不愿指定 bin 本身,因为你永远不会提前知道你的数据离均值有多远。
最后一步:在直方图上叠加概率密度函数
直方图已经与概率密度函数一致,只需叠加密度函数即可:
x_ = linspace(min(r),max(r),100);
y_ = (1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2));
plot(x_,y_,'b-');
和N = 150
和N = 1500
有N = 150.000
和Nbins = 50
如果出于某些不明确的原因您想使用旧的 hist() 函数
旧的 hist()
函数无法处理归一化,因此您必须手动完成,通过归一化密度函数以适合直方图:
N = 1500;
% rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,1,N);
Nbins = 50;
[~,centers]=hist(r,Nbins);
hist(r,Nbins); hold on
% Width of bins
Widths = diff(centers);
x_ = linspace(min(r),max(r),100);
y_ = N*mean(Widths)*(1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2));
plot(x_,y_,'r-');