ECDF曲线之间的插值

时间:2015-08-25 16:51:13

标签: matlab linear-interpolation ecdf

我有6条曲线描述了以固定值购买的门票数量的ECDF。 ECDF Curves

现在我想插值以在它们之间制作曲线,但是遵循下一个公式。例如,以10k的价格估算ECDF,应由F(10k)=αF1+(1-α)F2引导; 0 <α<1。我绘制的曲线是通过ecdf函数得到的。我试图用interp1来模拟观察但是我没有用它来模拟新价格的观察结果。

所以我尝试使用@rayryeng的代码

  

max_len = max(数字(F1),数字(F2));   F1_interp = interp1(1:numel(F1),F1(:)。',linspace(1,numel(F1),max_len));   F2_interp = interp1(1:numel(F2),F2(:)。',linspace(1,numel(F2),max_len));

alpha =(10e3 - 9.5e3)/(11e3 - 9.5e3); Fnew = alpha * F1_interp +(1-alpha)* F2_interp;

并获取下一条曲线Fnew

但是用F1和F2绘制曲线似乎没有插入或插入那些曲线。plotting curves

1 个答案:

答案 0 :(得分:2)

如果您遵循该公式,则根本不需要interp1。您可以认真地计算F(10k)alpha*F1 + (1-alpha)*F2 alpha介于[0,1]之间,如果我正确地解释您的问题,那么就可以alpha

F1的情况下,这是在F2看到的值和在alpha = (ffnew - ff1) / (ff2 - ff1) 看到的值之间的分数。在您的情况下,这很简单:

ff1

ff2ffnew是您想要的值之间的价格,即ffnew = ff1。您可以验证alpha = 0,然后是F2并获得原始的ffnew = ff2曲线。同样,如果alpha = 1,则为F1,因此您将获得原始的F1曲线。在F2alpha之间的任何价格值,您只需明智地指定alpha

因此,对于ff1 = 9.5kff2 = 11k以及fnew = 10k的情况,alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333... 将为:

F1

因此,假设F29.5k分别是11kalpha = (10e3 - 9.5e3) / (11e3 - 9.5e3); Fnew = alpha*F1 + (1-alpha)*F2; 处的曲线:

interp1

以上假设您的信号长度相同。如果不是,则必须插入较小的信号,使其与较大的信号长度匹配。 F1是此处使用的工具(恕我直言)。您可以将键/控制点指定为interp1的点。但是,(x,y)需要x对,我们没有任何y值.... F1值来自x。因此,您将人工创建linspace值作为正在增加的数值向量。我能想到的最简单的一个是从1到多个值的向量,与较小的信号一样多。要扩展信号,您将生成另一个向量,该向量在较小的信号中再次从1到多个值,但我们使用max_len = max(numel(F1),numel(F2)); F1_interp = interp1(1:numel(F1), F1(:).', linspace(1,numel(F1),max_len)); F2_interp = interp1(1:numel(F2), F2(:).', linspace(1,numel(F2),max_len)); alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3); Fnew = alpha*F1_interp1 + (1-alpha)*F2_interp2; 创建点数为更大的信号。

因此,尝试这样的事情:

F1

第一行代码找到两个信号长度中最大的一个。接下来,我们确保F2F1的长度相同。结果是其中一个不会改变,而另一个将扩展以匹配更大的信号。以上是为了确保两个信号的长度相同,无论F2func checkForAnagram(firstString firstString: String, secondString: String) -> Bool { return firstString.lowercaseString.characters.sort() == secondString.lowercaseString.characters.sort() } 是什么。完成此操作后,您可以在新信号上正常应用我们上面谈到的操作。