python - TypeError: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс, почему? - PullRequest
0 голосов
/ 01 апреля 2020

Я запускаю scipy.optimize.minimize, чтобы минимизировать следующую функцию,

def gas_midas_ll(params, low_freq, hi_freq, lag='beta', dist='normal', outer=False):
   T = low_freq[0]
   nx = hi_freq[1]
   omega = params[0]
   A1 = params[1]
   A2 = params[2]
   B = params[3]
   phi1 = params[4]
   phi2= params[5]

   f = np.ones((T+1,1)) ## <--- this is where I think the Traceback ends
   s1 = np.ones((T+1,1))
   s2 = np.ones((nx,T+1))
   f[0] = omega/(1-B)
   low_freq = np.append(0,low_freq).reshape((T+1,1))
   hi_freq = np.c_[np.zeros((nx,1)),hi_freq]

   s2[:,0:1] = hi_freq[:,0:1]**2 - f[0]

   if dist == 'normal':
      s1[0] = low_freq[0]**2 - f[0]

      if lag == 'beta':
         for t in range(1,T+1):
               f[t] = omega + A1*s1[t-1] + A2*np.sum(beta_lag(phi1,phi2,hi_freq)*s2[:,t-1:t]) + B*f[t-1]
               s1[t] = low_freq[t]**2 - f[t]
               s2[:,t:t+1] = hi_freq[:,t:t+1]**2 - f[t]

      elif lag == 'almon':
         phi = np.array((phi1,phi2)).reshape((2,1))
         for t in range(1,T+1):
               f[t] = omega + A1*s1[t-1] + A2*np.sum(almon_q(phi,hi_freq)*s2[:,t-1:t]) + B*f[t-1]
               s1[t] = low_freq[t]**2 - f[t]
               s2[:,t:t+1] = hi_freq[:,t:t+1]**2 - f[t]

      f = f[1:]
      s1 = s1[1:]
      s2 = s2[:,1:]
      low_freq = low_freq[1:]
      hi_freq = hi_freq[:,1:]

      constants = (1/2)*np.log(2*np.pi)

      ll = -((low_freq**2)/(2*f)) - constants - (1/2)*np.log(f)

   elif dist == 't':
      v = params[6]
      s1[0] = ((v+1)*low_freq[0]**2)/((v-2)+(low_freq[0]**2)/f[0]) - f[0]

      if lag == 'beta':
         for t in range(1,T+1):
               f[t] = omega + B*f[t-1] + A1*s1[t-1] + A2*np.sum(beta_lag(phi1,phi2,hi_freq)*s2[:,t-1:t])
               s1[t] = ((v+1)*low_freq[t]**2)/((v-2)+(low_freq[t]**2)/f[t]) - f[t]
               s2[:,t:t+1] = hi_freq[:,t:t+1]**2 - f[t]

      elif lag == 'almon':
         phi = np.array((phi1,phi2)).reshape((2,1))
         for t in range(1,T+1):
               f[t] = omega + B*f[t-1] + A1*s1[t-1] + A2*np.sum(almon_q(phi,hi_freq)*s2[:,t-1:t])
               s1[t] = ((v+1)*low_freq[t]**2)/((v-2)+(low_freq[t]**2)/f[t]) - f[t]
               s2[:,t:t+1] = hi_freq[:,t:t+1]**2 - f[t]

      f = f[1:]
      s1 = s1[1:]
      s2 = s2[:,1:]
      low_freq = low_freq[1:]
      hi_freq = hi_freq[:,1:]

      delta = (1/2)*(np.log(v-2)+np.log(np.pi))
      G1 = np.log(special.gamma((v+1)/2))
      G2 = np.log(special.gamma(v/2))
      constants = G1 - G2 - delta

      ll = constants - (1/2)*np.log(f) - ((v+1)/2)*np.log(1+(low_freq**2)/(f*(v-2)))

   if outer == True:
      return -ll
   else:
      return -np.sum(ll)

Я получаю сообщение об ошибке,

Traceback (most recent call last):

  File "C:\Users\***\SpyderProjects\SeminarW1920\draft5.py", line 320, in <module>
    bounds=gas_midas_nbounds_beta)

  File "C:\Users\***\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py", line 618, in minimize
    constraints, callback=callback, **options)

  File "C:\Users\***\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 399, in _minimize_slsqp
    fx = func(x)

  File "C:\Users\***\Anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 327, in function_wrapper
    return function(*(wrapper_args + args))

  File "C:\Users\***\SpyderProjects\SeminarW1920\likelihoodFunctions2.py", line 153, in gas_midas_ll
    f = np.ones((T+1,1))

  File "C:\Users\***\Anaconda3\lib\site-packages\numpy\core\numeric.py", line 207, in ones
    a = empty(shape, dtype, order)

TypeError: only integer scalar arrays can be converted to a scalar index

Что мне говорит, что ошибка, когда Вызов np.ones ()? Но я не понимаю, почему? У меня есть похожие функции, которые я также минимизирую с помощью scipy.optimize.minimize, и ни одна из них не генерирует подобные ошибки. Может быть, ошибка в другом месте, а сообщение об ошибке указывает не в правильном направлении?

...