拟合经验CDF曲线以找到精确的vaue

时间:2016-09-13 07:11:45

标签: matlab curve-fitting cdf

我试图使用经验cdf找到任何数字的确切值。获得确切价值的最佳方法是什么?我可以使用拟合工具然后使用拟合函数进行估算吗?

[f,x] = ecdf(samples);

即如何找到适合我的经验CDF的最佳函数来获得我想要的任何数字的确切CDF?

这些是我的样本:

enter image description here

1 个答案:

答案 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)

enter image description here

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)