Pythonの正規分布の例を使って説明します。
def norm_pdf(x, mu=0, v=1, p=1):
"""Returns un-normalized probability density of normal distribution at x.
mu: mean
v: variance
p: precision (inverse of variance)
"""
# if they specify v
return 2.71828**(-(x-mu)**2/v/2)
# if they specify p
return 2.71828**(-(x-mu)**2*p/2)
これは、ユーザーが分散v
or精度(逆分散)p
を指定できるようにする必要があることを意味しますが、両方を指定することはできません。このようなことに対処する適切な方法は何ですか? Numpyのようなライブラリがこれらの場合に使用するエチケットは何ですか?通常、関数をオーバーロードしたいのですが、v
とp
は同じ型なので、それほど単純ではありません。
明確にするために、2つの関数を作成します。
norm_pdf_from_variance(x, mu, variance)
および
norm_pdf_from_precision(x, mu, precision)
。
彼らは一般的な「プライベート」関数を呼び出して計算を行うことができます。
代替案は、単一の値vとブール値isPrecision
ですが、これは良くない混乱した考えです。明確にするために行きます。
2つの異なるメソッドを作成する代わりに( ser949300の回答 のように)、メソッドのオーバーロードとカスタムタイプを使用して、渡される「数値」が何を意味するかを明確にすることができます。実用的なのはpythonに暗黙の型があるためですが、おそらく可能です。ここでは疑似C#にあります:
double norm_pdf(double x, double mu=0, Variance v)
{
return 2.71828**(-(x-mu)**2/ v.Value /2);
}
double norm_pdf(double x, double mu=0, Precision p)
{
return 2.71828**(-(x-mu)**2* p.Value /2);
}
数値をVarianceまたはPrecisionのカスタムタイプ、つまりexplicitに置き換える方法を確認してください。式自体で、ラッパータイプから値を抽出します(さまざまな言語では、そのための構文が異なるため、暗黙的または明示的になる可能性があります)。
それを呼び出すには、ベース値からそのカスタムタイプのインスタンスを作成します。繰り返しになりますが、構文は言語によって少し異なる場合があります。
double norm_from_precision = norm_pdf(myX, mu, new Precision(0.9112));
double norm_from_variance = norm_pdf(myX, mu, new Variance(0.9112));
タイプ自体は非常に単純です。一部の言語では、いわゆる「 newtypes 」の構文が優れていますが、次のようになる場合があります。
public class Variance
{
public double Value {get;}
public Variance (double value)
{
Value = value;
}
}
オーバーロードなどでこれを行うにはいくつかの良い方法があります。しかし、それが実際にどのように行われるかについての質問に答えるために、numpyまたは任意の統計ライブラリからランダムなサンプル関数を見ることができます。
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.random.normal.html
"出力形状。指定された形状が(m、n、k)の場合、m * n * kサンプルが描画されます。サイズがNone(デフォルト)の場合、locとscaleが両方ともスカラーの場合、単一の値が返されますそれ以外の場合は、np.broadcast(loc、scale).sizeサンプルが描画されます。 "
数学者は70年代のようにプログラムし、a
、b
、x
などの単一の文字変数を多数使用し、入力に基づいて条件付きロジックを実行し、これだけを説明しますドキュメントで。
最初にチェックする入力の1つを選択し、入力されている場合は2番目を無視します。