2016-08-03 6 views
0

一連のパラメーターが与えられた場合の電気生理学的データを予測するモデルの作業。このスクリプトは、実験データに最も近い予測を与えるパラメータの値を見つけようとしています。私はPython 2.7、Scipy 0.17.0、Numpy 1.10.4を実行しています。スクリプトは以下に添付されています。エラーが発生している行はepsc_sims[n,1] = r_prob*poolsizeです。ここでなぜ「ValueError:配列を持つ配列要素を設定していますか?」 Scipy.optimizationからbrute関数を使用する場合?

はスクリプトです:

import scipy.optimize as optimize 
import numpy as np 
import math 

def min_params(*params): 
    std_err = 0 
    epsc_exp = np.loadtxt('sample.txt') 
    max_pool = params[0] 
    r_prob = params[1] 
    tau_recov = params[2] 
    poolsize = epsc_exp[0,1]/r_prob 
    epsc_sims = np.copy(epsc_exp) 
    count = epsc_exp.size 

    for n in xrange(1 , count/2): 
     poolsize = poolsize - epsc_sims[n-1, 1] 
     poolsize = max_pool + (poolsize - max_pool) * math.exp((epsc_sims[n-1, 0] - epsc_sims[n,0])/tau_recov) 
     epsc_sims[n,1] = r_prob*poolsize 
     std_err += (epsc_exp[n,1] - epsc_sims[n,1])**2 

    std_err /= count 
    return std_err 

params = (1e-8, 0.2, 0.5) 
rranges = (slice(5e-9,5e-8,1e-9), slice(0.1, 0.3, 0.01), slice(0.3, 0.4, 0.01)) 
y = optimize.brute(min_params, rranges, args = params) 
print y 

そして、ここでは、トレースバック(最新の呼び出しが最後)である:

Traceback (most recent call last): 

    File "<ipython-input-25-21d343f36a44>", line 1, in <module> 
    runfile('C:/Users/brennan/Google Drive/Python Scripts/Inhibitory Model/brute.py', wdir='C:/Users/brennan/Google Drive/Python Scripts/Inhibitory Model') 

    File "D:\Python\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile 
    execfile(filename, namespace) 

    File "D:\Python\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "C:/Users/brennan/Google Drive/Python Scripts/Inhibitory Model/brute.py", line 33, in <module> 
    y = optimize.brute(min_params, rranges, args = params) 

    File "D:\Python\Anaconda2\lib\site-packages\scipy\optimize\optimize.py", line 2604, in brute 
    Jout = vecfunc(*grid) 

    File "D:\Python\Anaconda2\lib\site-packages\numpy\lib\function_base.py", line 1811, in __call__ 
    return self._vectorize_call(func=func, args=vargs) 

    File "D:\Python\Anaconda2\lib\site-packages\numpy\lib\function_base.py", line 1874, in _vectorize_call 
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) 

    File "D:\Python\Anaconda2\lib\site-packages\numpy\lib\function_base.py", line 1836, in _get_ufunc_and_otypes 
    outputs = func(*inputs) 

    File "D:\Python\Anaconda2\lib\site-packages\scipy\optimize\optimize.py", line 2598, in _scalarfunc 
    return func(params, *args) 

    File "C:/Users/brennan/Google Drive/Python Scripts/Inhibitory Model/brute.py", line 25, in min_params 
    epsc_sims[n,1] = r_prob*poolsize 

ValueError: setting an array element with a sequence. 

〜3,000行で次のように私はspikes = np.loadtxt('sample.txt')に使用するテキストファイルがフォーマットされ:

0.01108 1.223896e-08 
0.03124 6.909375e-09 
0.074 6.2475e-09 
0.07718 3.895625e-09 

これは私の最初の投稿ですので、私に必要があれば教えてくださいo何かを変更するか、より多くの情報を提供する!

答えて

0

scipy.optimizeルーチンは、最適化するパラメータのベクトルを使用して関数を呼び出します。あなたの関数はmin_params(x, *params)と呼ばれます。*paramsは、キーワード引数argsを使って関数に渡した関数のカスタム引数です。関数xを定義する方法は、関数内のparamsの最初の要素になります。 max_poolr_probtau_recovあなたはこちらに最適化したいものであることを仮定し

は物事を解決する方法である:

def min_params(params): 
    ... 
y = optimize.brute(min_params, rranges) 
関連する問題