私は、平均と分散の両方が独立変数の線形関数として定義されている正規分布を使用してデータセットをモデル化する方法を調査しています。
N〜(f(x)、g(x))のようなもの。
私はこのようなランダムなサンプルを生成します:
def draw(x):
return norm(5 * x + 2, 3 *x + 4).rvs(1)[0]
だから、私の分布のパラメーターとして5、2、4を取得したいと思います。
私はサンプルを生成します:
smp = np.zeros((100,2))
for i in range(0, len(smp)):
smp[i][0] = i
smp[i][1] = draw(i)
尤度関数は次のとおりです。
def lh(p):
p_loc_b0 = p[0]
p_loc_b1 = p[1]
p_scl_b0 = p[2]
p_scl_b1 = p[3]
l = 1
for i in range(0, len(smp)):
x = smp[i][0]
y = smp[i][1]
l = l * norm(p_loc_b0 + p_loc_b1 * x, p_scl_b0 + p_scl_b1 * x).pdf(y)
return -l
したがって、モデルで使用される線形関数のパラメーターは、p 4変数ベクトルで与えられます。
scipy.optimizeを使用すると、非常に低いxtolを使用してMLEパラメーターを解くことができ、すでにソリューションを開始点として提供しています。
fmin(lh, x0=[2,5,3,4], xtol=1e-35)
これはうまくいきません:
Warning: Maximum number of function evaluations has been exceeded.
array([ 3.27491346, 4.69237042, 5.70317719, 3.30395462])
xtolをより高い値に上げても効果はありません。
だから私は実際のソリューションから遠く離れた開始ソリューションを使ってみます:
>>> fmin(lh, x0=[1,1,1,1], xtol=1e-8)
Optimization terminated successfully.
Current function value: -0.000000
Iterations: 24
Function evaluations: 143
array([ 1., 1., 1., 1.])
それは私に考えさせます:
PDFは、主に平均の周りにクラスター化されており、平均から数標準偏差だけ離れた非常に低い勾配を持っています。これは、数値的手法にはあまり良くないはずです。
では、勾配が解からゼロに非常に近い関数で、このような数値推定をどのように行うのでしょうか。