私はscipy.minimizeを使って簡単な最小化(シミュレーションされた最尤の基本的な例)を実行しようとしています。何らかの理由で初期値を返すだけです。私は間違って何をしていますか?ここでscipy minimの戻り値の初期値
は私のコードです:
import numpy as np
from scipy.optimize import minimize
# Simulated likelihood function
# Arguments:
# theta: vector representing probabilities
# sims: vector representing uniform simulated data, e.g. [0.43, 0.11, 0.02, 0.97, 0.77]
# dataCounts: vector representing counts of actual data, e.g. [4, 10, 7]
def simLogLikelihood(theta, sims, dataCounts):
# Categorise sims using theta
simCounts = np.bincount(theta.cumsum().searchsorted(sims))
# Calculate probabilities using simulated data
simProbs = simCounts/simCounts.sum()
# Calculate likelihood using simulated probabilities and actual data
logLikelihood = (dataCounts*np.log(simProbs)).sum()
return -logLikelihood
# Set seed
np.random.seed(121)
# Generate 'true' data
trueTheta = np.array([0.1, 0.4, 0.5])
dataCounts = np.bincount(np.random.choice([0, 1, 2], 1000, p=trueTheta))
# Generate simulated data (random draws from [0, 1))
sims = np.random.random(1000)
# Choose theta to maximise likelihood
thetaStart = np.array([0.33, 0.33, 0.34])
bnds = ((0, 1), (0, 1), (0, 1))
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0})
result = minimize(simLogLikelihood, x0=thetaStart, args=(sims, dataCounts), method='SLSQP', bounds=bnds, constraints=cons)
(bnds
で境界が確率は0と1の間である必要があるという事実を反映cons
での制約は、確率の合計が1にしなければならないということである。。)
、result
が含まれています
fun: 1094.7593617864004
jac: array([ 0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 5
nit: 1
njev: 1
status: 0
success: True
x: array([ 0.33, 0.33, 0.34])
をだから、ただ1回の繰り返しを行い、返します私が始めた確率のベクトル。しかし、より低い目的を有する確率の別のベクトルを見つけることは容易である。 [0.1,0.4,0.5]。何がうまくいかないのですか?
scipyではなくnumpyへの誤った参照に気付いたsaschaさんに感謝します。これらは修正されました。 – jms202