2014-03-06 53 views
0

所以我有一個成本函數,我試圖從scipy.optimize fmin_ncg最小化。如果我只運行一次,似乎工作正常,但我也編寫了一個自舉腳本,對數據進行重新採樣,並重復最小化成本函數以計算置信區間。經過自舉腳本的幾次迭代後,我得到下面的錯誤。這不是很豐富。有誰知道它可能來自哪裏?Unsupported操作數TypeError與fmin_ncg

Traceback (most recent call last): 
    File "bootstrap.py", line 97, in <module> 
    main(rat, cluster_parameter.main) 
    File "bootstrap.py", line 83, in main 
    t, i = estimator(resampled_data, RAT_CLUSTERS[rat]) 
    File "/home/matthew/Dropbox/Work/vocalization_analysis/cluster_parameter.py", line 176, in main 
    args=(included_clusters,jumps), avextol=1e-5) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1252, in fmin_ncg 
    callback=callback, **opts) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1365, in _minimize_newtoncg 
    update = alphak * pk 
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float' 

我不太確定要發佈此問題的相關代碼。這裏的成本函數

def cost(x, *args): 
theta = x[0] 
b = x[1] 
included_clusters = args[0] 
jumps = args[1] 

h = [(n,SLOPES[n](theta)) for n in included_clusters] 
h = OrderedDict(h) 
bisecting_slopes = find_bisector(h) 
vertices = polygon_vertices(bisecting_slopes, included_clusters) 
cluster = poly_cluster(jumps[:,0:2], vertices) 
cost = 0 
for c in h.keys(): 
    idx = find(cluster==c) 
    l = len(jumps[idx,0:2]) 
    print(l) 
    for j in jumps[idx,0:2]: 
     x = (j[0]/h[c] + j[1] - b)/(h[c] + 1/h[c]) 
     y = h[c] * x + b 
     cost += (((j[0] - x)**2 + (j[1]-y)**2))/l 

#print('b='+str(b)) 
#print('theta='+str(theta)) 
#print('cost='+str(cost)) 
return cost 

和這裏是它的衍生

def dcost(x, *args): 
theta = x[0] 
b = x[1] 
included_clusters = args[0] 
jumps = args[1] 

h = [(n, SLOPES[n](theta)) for n in included_clusters] 
h = OrderedDict(h) 
dh = [(n, DSLOPES[n](theta)) for n in included_clusters] 
dh = OrderedDict(dh) 
bisecting_slopes= find_bisector(h) 
vertices = polygon_vertices(bisecting_slopes, included_clusters) 
cluster = poly_cluster(jumps[:,0:2], vertices) 

dcost_theta = 0 
dcost_b = 0 
for c in h.keys(): 
    idx = find(cluster==c) 
    l = len(jumps[idx,0:2]) 
    for j in jumps[idx,0:2]: 
     x = (j[0]/h[c] + j[1] - b)/(h[c] + 1/h[c]) 
     y = h[c] * x + b 
     dx_theta = ((h[c]**2 + 1) * (j[1] - b) * dh[c] - 
      2 * (j[0] + (j[1] - b) * h[c]) * h[c] * dh[c])/(h[c]**2 + 1)**2 
     dy_theta = ((h[c]**2 + 1) * (j[0] * dh[c] + 2 * (j[1] - b) * h[c] * dh[c]) 
      - 2 * (j[0] * h[c] + (j[1] - b) * h[c]**2) * h[c] * dh[c])/(h[c]**2 + 1)**2 
     dx_b = -h[c]/(h[c]**2 + 1) 
     dy_b = -h[c]**2/(h[c]**2 + 1) 

     dcost_theta += (2 * (j[0] - x) * dx_theta 
      + 2 * ((j[1] - b) - y) * dy_theta)/l 

     dcost_b += (2 * (j[0] - x) * dx_b 
      + 2 * ((j[1] - b) - y) * dy_b)/l 

return np.array([dcost_theta, dcost_b]) 

而且,這裏是我的主要功能。它只是調用fmin_ncg。

def main(jumps, included_clusters = range(NUM_CLUSTERS)): 
theta_min, b_min = fmin_ncg(f=cost, x0=[0,0], fprime=dcost, 
args=(jumps, included_clusters), avextol=1e-5, disp=0) 

return theta_min, b_min 

如果你想看看該程序的其餘部分,你可以在這裏https://github.com/mdornfe1/vocalization_analysis/blob/error_analysis/cluster_parameter.py這裏https://github.com/mdornfe1/vocalization_analysis/blob/error_analysis/bootstrap.py

+0

你有什麼Scipy版本? IIRC,這是一個已修復的錯誤。但是,如果是這樣,失敗是由於fmin_ncg沒有找到可接受的下降方向 - 升級Scipy在這裏不會幫助你,因爲該算法然後報告它未能收斂到可接受的解決方案。我會仔細檢查派生函數的正確性,因爲錯誤的漸變將導致此類問題。 –

+0

我有scipy版本0.12.0。我可以再次檢查,但我覺得派生函數是正確的。當我運行bootstrap算法時,我多次調用fmin_ncg。直到我第30次或第40次調用錯誤時纔會發生。 – mdornfe1

+0

我建議你編輯主代碼,使其具有前導空白並顯示更多可讀。另外,顯示如何從命令行調用它。 – sabbahillel

回答

0

就您而言,這似乎是重要的說法。

File "bootstrap.py", line 97, in <module> 
    main(rat, cluster_parameter.main) 

這意味着,他的錯誤是不你定義的函數發生,但,當你試圖獲得的參數中你的主要發生。請顯示主要以及您如何致電該計劃。看起來好像你有無效的論點。作爲設置的一部分,argparse(或optparse,如果你有Python 2.6.7)可能會有用。

+0

我將主要功能添加到原始帖子。它所做的就是所謂的fmin_ncg。 – mdornfe1

相關問題