2014-10-23 3 views
0

Я пытаюсь реализовать алгоритм фильтра частиц в python. Я получаю эту ошибку:Python: TypeError: объект 'float' не имеет атрибута '__getitem__'

x_P_update[i] = 0.5*x_P[i] + 25*x_P[i]/(1 + x_P[i]**2) + 8*math.cos(1.2*(t-1)) +  math.sqrt(x_N)*np.random.randn() 
TypeError: 'float' object has no attribute '__getitem__' 

Мой код:

import math 
import numpy as np 
import matplotlib.pyplot as plt 

x = 0.1 #initial value 
x_N = 1 #process noise covariance in state update 
x_R = 1 #noise covariance in measurement 
T = 75 #number of iterations 
N = 10 #number of particles 

V = 2 
x_P = [None]*(N) 

for i in xrange(0, N): 
    x_P[i] = x + math.sqrt(V)*np.random.randn() 

z_out = np.array([x**2/20 + math.sqrt(x_R) * np.random.randn()]) #the actual output vector for measurement values. 
x_out = np.array([x]) #the actual output vector for measurement values. 
x_est = np.array([x]); # time by time output of the particle filters estimate 
x_est_out = np.array([x_est]) # the vector of particle filter estimates. 

x_P_update = [None]*N 
z_update = [None]*N 
P_w = [None]*N 

for t in xrange(1, T+1): 
    x = 0.5*x + 25*x/(1 + x**2) + 8*math.cos(1.2*(t-1)) + math.sqrt(x_N)*np.random.randn() 
    z = x**2/20 + math.sqrt(x_R)*np.random.randn() 
    for i in xrange(0, N): 
     #each particle is updated with process eq 
     x_P_update[i] = 0.5*x_P[i] + 25*x_P[i]/(1 + x_P[i]**2) + 8*math.cos(1.2*(t-1)) + math.sqrt(x_N)*np.random.randn() 
     #observations are updated for each particle 
     z_update[i] = x_P_update[i]**2/20 
     #generate weights 
     P_w[i] = (1/math.sqrt(2*math.pi*x_R)) * math.exp(-(z - z_update[i])**2/(2*x_R)) 

    P_w[:] = [ k/sum(P_w) for k in P_w] 
# print(np.where(np.cumsum(P_w, axis=0) >= np.random.rand())) 

    # print(index_tuple[0][1]) 
# P_w_array = np.array(list(P_w)) 
# indices = [i for i in range(len(P_w)) if np.cumsum(P_w_array) >= np.random.rand()] 
    for i in xrange(0, N): 
     index_tuple = np.where(np.random.rand() <= np.cumsum(P_w, axis=0)) 
     m = index_tuple[0][1] 
     x_P = x_P_update[m] 

    x_est = np.array([np.mean(x_P)]) 
    x_out = np.array([x_out, x]) 
    z_out = np.array([z_out, z]) 
    x_est_out = np.array([x_est_out, x_est]) 

Я использую код MatLab здесь, чтобы узнать, как реализовать этот алгоритм в Python с использованием SciPy. http://studentdavestutorials.weebly.com/particle-filter-with-matlab-code.html

Я только начал изучать питон и не могу избавиться от этой проблемы, любезно помочь.

ответ

2

Я не собираюсь проходить видеоурок и исправлять свой алгоритм, но я могу показать вам, почему вы получаете эту ошибку.

В этой строке:

x_P = x_P_update[m] 

Вы назначаете массив со значением поплавка, который затем пытается получить доступ как массив во внешнем контуре. Активировав его, вы избавитесь от вашей ошибки:

x_P[m] = x_P_update[m] 
+0

спасибо, но теперь я получаю другую ошибку. m = index_tuple [0] [1] IndexError: индекс 1 за пределами оси 0 с размером 1 –

+0

@stoned_blasphemer, что является проблемой с вашим алгоритмом. – simonzack

+1

@stoned_blasphemer вы должны исправить свой код, как показано выше, опубликовать новую проблему в качестве нового вопроса и за исключением этого ответа, так как он ответил на ваш вопрос. – wwii

Смежные вопросы