6

(-inf,inf) から [0,1] までの非減少全射(onto) 関数のセットを考えてみましょう。(典型的なCDFはこの性質を満たします。) 言い換えると、任意の実数 x について、0 <= f(x) <= 1 です。ロジスティック関数は、おそらく最もよく知られている例です。

ここで、x 値のリストの形でいくつかの制約が与えられ、各 x 値に対して、関数が間になければならない y 値のペアが与えられます。次のような{x、ymin、ymax}トリプルのリストとしてそれを表すことができます

constraints = {{0, 0, 0}, {1, 0.00311936, 0.00416369}, {2, 0.0847077, 0.109064}, 
 {3, 0.272142, 0.354692}, {4, 0.53198, 0.646113}, {5, 0.623413, 0.743102}, 
 {6, 0.744714, 0.905966}}

グラフィカルには次のようになります。

cdf の制約
(ソース: yootles.com )

これらの制約を尊重する曲線を探します。例えば:

当てはめた累積分布関数
(ソース: yootles.com )

最初に、制約の中点を通る単純な補間を試してみましょう。

mids = ({#1, Mean[{#2,#3}]}&) @@@ constraints
f = Interpolation[mids, InterpolationOrder->0]

プロットすると、f は次のようになります。

内挿累積分布関数
(ソース: yootles.com )

その関数は全射ではありません。また、よりスムーズにしたいと考えています。補間次数を増やすことができますが、範囲が [0,1] であるという制約に違反しています。

内挿次数が高い内挿 cdf
(ソース: yootles.com )

目標は、制約を満たす最も滑らかな関数を見つけることです。

  1. 非減少。
  2. x が負の無限大に近づくと 0 になり、x が無限大に近づくと 1 になります。
  3. 指定された y エラーバーのリストを通過します。

上でプロットした最初の例は良い候補のようですが、対数正規 CDFを想定して Mathematica のFindFit関数でそれを行いました。これはこの特定の例ではうまく機能しますが、一般に、制約を満たす対数正規 CDF が存在する必要はありません。

4

3 に答える 3

5

目的の CDF を一意にするのに十分な基準を指定していないと思います。

保持する必要がある唯一の基準が次の場合:

  1. CDF は「かなり滑らか」でなければなりません (以下を参照)。
  2. CDF は非減少でなければなりません
  3. CDF は「エラー バー」の y 間隔を通過する必要があります
  4. CDF は x --> -Infinity として 0 に向かう傾向がある必要があります
  5. CDF は、x --> 無限大として 1 に向かう必要があります。

おそらく、 Monotone Cubic Interpolationを使用できます。これにより、3 次スプラインとは異なり、単調データが与えられたときに単調であることが保証される C^2 (2 回連続微分可能) 関数が得られます。

これは、単調な 3 次補間を生成するために正確にどのデータを使用する必要があるかという問題を未解決のままにします。各エラー バーの中心点 (平均) を取得すると、結果のデータ ポイントが単調に増加することが保証されますか? そうでない場合は、任意の選択を行って、選択したポイントが単調に増加することを保証することもできます (基準によってソリューションが一意になることは強制されないため)。

では、最後のデータ ポイントについてはどうすればよいでしょうか。制約データ セット内のどの x よりも大きいことが保証されている X はありますか? おそらく、再び便利な任意の選択を行い、いくつかの非常に大きな X を選択して、(X,1) を最終データ ポイントとして配置することができます。

コメント 1:問題は 2 つのサブ問題に分けることができます。

  1. CDF が通過しなければならない正確な点 (x_i,y_i) が与えられた場合、どのように CDF を生成しますか? 無限の滑らかさの制約があっても、可能な解決策は無限にあると思います。

  2. y エラーバーが与えられた場合、(x_i,y_i) をどのように選択する必要がありますか? 繰り返しますが、無限に多くの可能な解決策があります。一意の選択を強制するために、いくつかの追加基準を追加する必要がある場合があります。追加の基準によって、問題が現在よりもさらに難しくなる可能性があります。

コメント 2:単調 3 次補間を使用し、基準 4 と 5 を満たす方法を次に示します。

単調な 3 次補間 (と呼びましょう) はR --> Rfをマップします。

しましょうCDF(x) = exp(-exp(f(x)))。それからCDF: R --> (0,1)。適切な を見つけることができれば、このようにf定義することCDFで、基準 4 と 5 を満たすことができます。

を見つけるには、変換を使用しfて CDF 制約を変換します。これは変換の逆です。が増加していた場合、は減少しています。(x_0,y_0),...,(x_n,y_n)xhat_i = x_iyhat_i = log(-log(y_i))CDFy_iyhat_i

(x_hat,y_hat) データ ポイントにモノトーン キュービック補間を適用して を生成しfます。そして最後に、 を定義しますCDF(x) = exp(-exp(f(x)))。これは、点 (x_i,y_i) を通過するR --> (0,1)から単調増加する関数になります。

これは、2 ~ 5 のすべての基準を満たしていると思います。基準 1 はある程度満足していますが、よりスムーズなソリューションが存在する可能性は確かにあります。

于 2010-04-24T02:12:52.593 に答える
4

さまざまな入力に対して妥当な結果が得られるソリューションを見つけました。最初にモデルを適合させます。1 回目は制約の下端に、もう 1 つは上端に合わせます。これら 2 つの近似関数の平均を「理想関数」と呼びます。この理想的な関数を使用して、制約が終了する場所の左右を外挿し、制約内のギャップ間を補間します。すべての制約を含め、理想的な関数の値を一定の間隔で計算します。左側の関数がほぼ 0 の場所から、右側のほぼ 1 の場所までです。制約では、制約を満たすために必要に応じてこれらの値をクリップします。最後に、これらの値を処理する補間関数を作成します。

私の Mathematica の実装は次のとおりです。
まず、いくつかのヘルパー関数:

(* Distance from x to the nearest member of list l. *)
listdist[x_, l_List] := Min[Abs[x - #] & /@ l]

(* Return a value x for the variable var such that expr/.var->x is at least (or
   at most, if dir is -1) t. *)
invertish[expr_, var_, t_, dir_:1] := Module[{x = dir},
  While[dir*(expr /. var -> x) < dir*t, x *= 2];
  x]

そして、ここに主な機能があります:

(* Return a non-decreasing interpolating function that maps from the
   reals to [0,1] and that is as close as possible to expr[var] without
   violating the given constraints (a list of {x,ymin,ymax} triples).
   The model, expr, will have free parameters, params, so first do a
   model fit to choose the parameters to satisfy the constraints as well
   as possible. *)
cfit[constraints_, expr_, params_, var_] := 
Block[{xlist,bots,tops,loparams,hiparams,lofit,hifit,xmin,xmax,gap,aug,bests},
  xlist = First /@ constraints;
  bots = Most /@ constraints; (* bottom points of the constraints *)
  tops = constraints /. {x_, _, ymax_} -> {x, ymax};
  (* fit a model to the lower bounds of the constraints, and 
     to the upper bounds *)
  loparams = FindFit[bots, expr, params, var];
  hiparams = FindFit[tops, expr, params, var];
  lofit[z_] = (expr /. loparams /. var -> z);
  hifit[z_] = (expr /. hiparams /. var -> z);
  (* find x-values where the fitted function is very close to 0 and to 1 *)
  {xmin, xmax} = {
    Min@Append[xlist, invertish[expr /. hiparams, var, 10^-6, -1]],
    Max@Append[xlist, invertish[expr /. loparams, var, 1-10^-6]]};
  (* the smallest gap between x-values in constraints *)
  gap = Min[(#2 - #1 &) @@@ Partition[Sort[xlist], 2, 1]];
  (* augment the constraints to fill in any gaps and extrapolate so there are 
     constraints everywhere from where the function is almost 0 to where it's 
     almost 1 *)
  aug = SortBy[Join[constraints, Select[Table[{x, lofit[x], hifit[x]}, 
                                              {x, xmin,xmax, gap}], 
                                        listdist[#[[1]],xlist]>gap&]], First];
  (* pick a y-value from each constraint that is as close as possible to 
     the mean of lofit and hifit *)
  bests = ({#1, Clip[(lofit[#1] + hifit[#1])/2, {#2, #3}]} &) @@@ aug;
  Interpolation[bests, InterpolationOrder -> 3]]

たとえば、対数正規関数、正規関数、またはロジスティック関数に適合させることができます。

g1 = cfit[constraints, CDF[LogNormalDistribution[mu,sigma], z], {mu,sigma}, z]
g2 = cfit[constraints, CDF[NormalDistribution[mu,sigma], z], {mu,sigma}, z]
g3 = cfit[constraints, 1/(1 + c*Exp[-k*z]), {c,k}, z]

例の制約の元のリストでは、これらがどのように見えるかを次に示します。

対数正規関数、正規関数、およびロジスティック関数への制約付きフィット
(ソース: yootles.com )

正規とロジスティックはほぼ重なり合っており、対数正規は青い曲線です。

これらは完全ではありません。特に、それらは完全に単調ではありません。導関数のプロットは次のとおりです。

Plot[{g1'[x], g2'[x], g3'[x]}, {x, 0, 10}]

当てはめ関数の導関数
(ソース: yootles.com )

これは、滑らかさの欠如と、ゼロに近いわずかな非単調性を示しています。このソリューションの改善を歓迎します!

于 2010-04-24T21:24:56.703 に答える
0

中点を通るベジエ曲線を当てはめることができます。具体的には、 C2 連続曲線が必要だと思います。

于 2010-04-24T02:04:17.733 に答える