1

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

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

所以我尝试了@rayryeng 制作的代码

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));

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

并得到下一条曲线新

但是用 F1 和 F2 绘制曲线似乎并不介于两者之间或两者之间的插值。绘制曲线

4

1 回答 1

2

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

在 的情况下,这是在 处看到的值和在 处alpha看到的值之间的分数。在您的情况下,这很简单:F1F2

alpha = (ffnew - ff1) / (ff2 - ff1)

ff1并且ff2是您想要的值之间的价格,即ffnew. 您可以验证 if ffnew = ff1, thenalpha = 0并且您得到原始F2曲线。同样,如果ffnew = ff2, thenalpha = 1等你会得到原始F1曲线。F1任何介于两者之间的价格值F2,您只需要谨慎地指定您的指定方式即可alpha

因此,alpha对于您的情况,并且ff1 = 9.5k将 是:ff2 = 11kfnew = 10k

alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...

因此,假设F1和分别是和F2处的曲线:9.5k11k

alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1 + (1-alpha)*F2;

以上假设您的信号长度相同。如果不是,那么您必须对较小的信号进行插值,使其在长度上与较大的信号匹配。 interp1是在这里使用的工具(恕我直言)。您可以将关键点/控制点指定为来自 的点F1。但是,interp1需要(x,y)对并且我们没有任何x值....y尽管这些值来自F1. 因此,您将人为x地创建值作为增加的数值向量。我能想到的最简单的是一个从 1 到与较小信号一样多的值的向量。要扩展信号,您将生成另一个向量,该向量再次从 1 到较小信号中的多个值,但我们linspace.

因此,尝试这样的事情:

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;

第一行代码找到两个信号长度中最大的一个。接下来我们确保两者F1F2长度相同。效果是其中一个不会改变,但另一个会扩展以匹配更大的信号。以上是为了保证两个信号的长度相同,不管是什么F1F2是。完成此操作后,您就可以将我们上面讨论的操作照常应用于新信号。

于 2015-08-25T17:07:32.097 回答