標準偏差がゼロの場合、正規分布が定義されていないことは理解していますが、コンピューターアルゴリズムですべての値が等しい場合を処理する必要があります。次のメソッドは、標準偏差がゼロの場合でも、有効な値を返す必要があります。ゼロで除算されないようにこのメソッドを修正するにはどうすればよいですか?
public static double NormalDist(double x, double mean, double standard_dev) { double fact = standard_dev * Math.Sqrt(2.0 * Math.PI); double expo = (x - mean) * (x - mean) / (2.0 * standard_dev * standard_dev); return Math.Exp(-expo) / fact; }
私の考えは、メソッドの最初にこれを挿入することでした:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
これは正しいですか?
コメント
回答
標準偏差がゼロの場合、ガウス(正規)PDFはディラックのデルタ関数に変わります。ゼロ標準偏差を従来の式に単純に差し込むことはできません。たとえば、PDFをある種の数値積分に差し込むと、これは機能しません。積分を変更する必要があります。以下の例では、ガウス密度$ f(x | \ mu、\ sigma ^ 2)$を使用して関数$ g(x)$の平均値を計算します。
$$ \ int g(x )f(x | \ mu、\ sigma ^ 2)dx $$
ゼロ分散をプラグインすると、これはデルタ関数になります:$$ \ int g(x)f(x | \ mu、 0)dx = \ int g(x)\ delta(x- \ mu)dx = g(\ mu)$$
コードはこれを認識できる必要があります。認識できない場合、失敗します。
これを修正する1つの方法は、驚くほど簡単です。ゼロではなく、非常に小さい値の$ \ sigma $をガウス分布に接続します。状況に応じて適切な$ \ sigma $を選択する必要があります。小さすぎると指数が爆発し、積分が機能しないか、精度が低くなります。これは、デルタ関数の既知のガウス近似になります:$$ \ delta(x)= \ lim _ {\ sigma \ to 0} \ mathcal N(0、 \ sigma)$$
コメント
- 失敗するかどうか"失敗する"はその機能仕様に依存する必要があります。確率密度の連続バージョンを返すことだけを目的としている場合、ディラックのデルタには平均以外のすべての場所で密度が定義されているため、常にゼロを返す関数は正しいです。一方、この関数が最尤推定を計算するための尤度計算の一部として呼び出されている場合、それを成功させる実装はありません。実行できるのはエラー条件を発生させることだけです。
- @ whuber、浮動ポイント形式は正の無限大をサポートします。したがって、彼はPDFを無限大に設定することができました。問題'は、不連続性のために、それでも彼の尤度最適化ルーチンが機能しないことです。したがって、私は' PDFを使用するコードを変更する必要があると言っています。彼は' PDFだけをいじるだけでは逃げられません
- 上記の追加コメントに詳細を投稿しました。 ' Aksakalは正しいと思います。メソッドを使用するコードを変更する必要があります。
NormalDist
をどのように使用するつもりですか?