我试图使用经验cdf找到任何数字的确切值。获得确切价值的最佳方法是什么?我可以使用拟合工具然后使用拟合函数进行估算吗?
[f,x] = ecdf(samples);
即如何找到适合我的经验CDF的最佳函数来获得我想要的任何数字的确切CDF?
这些是我的样本:
答案 0 :(得分:1)
通过在最小二乘意义上找到最适合曲线的形状(σ)和位置(μ)参数,可以得到f(x)的近似值。
这是一组具有正态分布的“示例”噪声“测试数据”(类似于您的采样数据):
>> % ytest = f(xtest, mutest, sigtest) % sample test data
>> xtest = linspace(-10, 10, 100); % independent variable linearly spaced
>> mutest = rand(1, 1) - 0.5; % random location parameter
>> sigtest = 1 + rand(1, 1); % random shape parameter
>> ytest = normcdf(x, mutest, sigtest) + rand(1, 100) / 10; % distribution
mutest =
0.2803
sigtest =
1.6518
现在,您可以使用fminsearch
来查找假设正态分布的形状和位置参数。我们需要提供一个目标函数,我们希望fminsearch
最小化,因此我们创建一个匿名函数,它是理想正态累积分布函数和测试数据之间残差的范数。该函数具有2维,[μ,σ],我们将其作为向量传递。我们还需要为fminsearch
提供初步猜测。
>> % objective function with normal distribution
>> % mu(1) = location parameter (mean)
>> % mu(2) = shape parameter (standard deviation)
>> obj_func = @(mu)norm(normcdf(xtest, mu(1), mu(2)) - ytest)
>> mu0 = [0, 1]; % initial guesses for mean and stdev
>> mu = fminsearch(obj_func, mu0);
>> sigma = mu(2); % best fit standard deviation
>> mu = mu(1) % best fit mean
mu =
-0.0386
sigma
1.7399
现在,您可以使用normcdf
函数使用x,μ和σ预测经验数据中的任何CDF
>> y = normcdf(x, mu, sigma)
MATLAB offers many types of probability distributions.如果您不知道数据的分发类型,我建议使用Weibull,因为它具有最通用的形式 - 然后只需将normcdf
替换为{ {3}}
>> % objective function with Weibull distribution
>> % mu(1) = location parameter (mean)
>> % mu(2) = shape parameter (standard deviation)
>> obj_func = @(mu)norm(wblcdf(xtest, mu(1), mu(2)) - ytest)
>> mu0 = [0, 1]; % initial guesses for mean and stdev
>> mu = fminsearch(obj_func, mu0);
>> sigma = mu(2); % best fit standard deviation
>> mu = mu(1) % best fit mean
>> y = wblcdf(x, mu, sigma)