Почему мой ноутбук ломается, когда я запускаю цикл for и что за исправление? - PullRequest
0 голосов
/ 27 сентября 2019

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

  1. Данные столбца поступают в фильтр
  2. Отфильтрованные данные столбца (xhat) помещаются в другой DataFrame (отфильтрованный)
  3. Отфильтрованные данные столбца (xhat) используются для создания визуала.

Я создал цикл for для итерации по данным столбца, но когда я запускаю ячейку, я вырываю ноутбук,Когда он не падает, я получаю это предупреждение:

C:\Users\perso\Anaconda3\envs\learn-env\lib\site-packages\ipykernel_launcher.py:45: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).

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

    '''A Python implementation of the example given in pages 11-15 of "An
Introduction to the Kalman Filter" by Greg Welch and Gary Bishop,
University of North Carolina at Chapel Hill, Department of Computer
Science, TR 95-041,
https://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf'''

# by Andrew D. Straw
import numpy as np
import matplotlib.pyplot as plt
# dataframe created to hold filtered data
filtered = pd.DataFrame()

# intial parameters
for column in data:
    n_iter = len(data.index) #number of iterations equal to sample numbers
    sz = (n_iter,) # size of array
    z =  data[column] # observations
    Q = 1e-5 # process variance

# allocate space for arrays
    xhat=np.zeros(sz)      # a posteri estimate of x
    P=np.zeros(sz)         # a posteri error estimate
    xhatminus=np.zeros(sz) # a priori estimate of x
    Pminus=np.zeros(sz)    # a priori error estimate
    K=np.zeros(sz)         # gain or blending factor
    R = 1.0**2 # estimate of measurement variance, change to see effect

    # intial guesses
    xhat[0] = z[0]
    P[0] = 1.0

    for k in range(1,n_iter):
        # time update
        xhatminus[k] = xhat[k-1]
        Pminus[k] = P[k-1]+Q

        # measurement update
        K[k] = Pminus[k]/( Pminus[k]+R )
        xhat[k] = xhatminus[k]+K[k]*(z[k]-xhatminus[k])
        P[k] = (1-K[k])*Pminus[k]
        # add new data to created dataframe
        filtered.assign(a = [xhat])
        #create visualization of noise reduction
        plt.rcParams['figure.figsize'] = (10, 8)
        plt.figure()
        plt.plot(z,'k+',label='noisy measurements')
        plt.plot(xhat,'b-',label='a posteri estimate')
        plt.legend()
        plt.title('Estimate vs. iteration step', fontweight='bold')
        plt.xlabel('column data')
        plt.ylabel('Measurement')

1 Ответ

0 голосов
/ 27 сентября 2019

Это кажется довольно простой ошибкой.Предупреждение указывает на то, что вы пытались построить больше цифр, чем текущий предел, до создания предупреждения (параметр, который вы можете изменить, но который по умолчанию установлен на 20).Это потому, что на каждой итерации цикла for вы создаете новую фигуру.В зависимости от размера n_iter вы открываете потенциально сотни или тысячи цифр.Каждый из этих рисунков требует ресурсов для генерации и отображения, поэтому вы создаете очень большую нагрузку на ресурсы в вашей системе.Либо он обрабатывается очень медленно из-за ошибки, либо полностью падает.В любом случае, решение состоит в том, чтобы построить меньше цифр.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...