所以,我有问题。我需要对 CALP(级联自适应线性预测器)错误进行动画处理。我正在使用 liber matplotlib (动画类)来解决我的任务,但是当我尝试计算新系数 CALP 时,我的程序锁定在时刻
aa = aa - lmd1 * dEda(y, previus_data_1, previus_data_2)
,aa 是全局变量。但是,如果我尝试计算 aa = lmd1 * dEda(y, previus_data_1, previus_data_2)
我的程序运行良好。下面我展示了我的代码。预先感谢。
# Filter coefficients
aa = 0.01
bb = 0.01
# Learning rate
lmd1 = 0.0000001
lmd2 = 0.0000001
# ЛWorksheets for storing graph values
xdata, ydata = [], []
def E(y, a, b):
return (y - a*aa - bb)**2
def dEda(y, a, b):
return (2 * (y - a*aa - b*bb) * a)
def dEdb(y, a, b):
return (2 * (y - a*aa - bb) * 1)
%matplotlib inline
# Бесконечный цикл генерации значений (генератор потому что используется yield)
def data_gen():
for cnt in itertools.count():
# aa = aa - lmd1 * dEda(data[cnt+1], previus_data_1, previus_data_2)
# bb = bb - lmd2 * dEdb(data[cnt+1], previus_data_1, previus_data_2)
# previus_data_2 = copy.deepcopy(previus_data_1)
# previus_data_1 = copy.deepcopy(data[cnt+1])
# err = E(data[cnt+1], previus_data_1, previus_data_2)
yield cnt, data[cnt+1]
# Инициализация визуализации
def init():
#Задаем минимальные и максимлаьные значения по осям х и у
ax.set_ylim(30000, -30000)
ax.set_xlim(0,100)
#Очищаем все данные в слистах если они присутствуют
del xdata[:]
del ydata[:]
#Задаем начальное значение построения графика
line.set_data(xdata, ydata)
return line,
# Функция выполнения (передаем данные и разбиваем их)
def run(data):
# update the data
t, y = data
xmin, xmax = ax.get_xlim()
# aa = aa - lmd1 * dEda(y, previus_data_1, previus_data_2)
# bb = bb - lmd2 * dEdb(y, previus_data_1, previus_data_2)
# previus_data_2 = copy.deepcopy(previus_data_1)
# previus_data_1 = copy.deepcopy(y)
err = E(y, previus_data_1, previus_data_2)
xdata.append(t)
ydata.append(err)
# Проверяем, если данные больше чем заданное значение,
# то изменяем размер рисунка
if t >= xmax:
ax.set_xlim(xmin, 2*xmax)
ax.figure.canvas.draw()
# задаем значения новые и возвращаем
line.set_data(xdata, ydata)
return line,
%matplotlib notebook
previus_data_1 = 0
previus_data_2 = 0
fig, ax = plt.subplots(figsize = (9, 6))
line, = ax.plot([], [], lw=2)
ax.grid()
ani = animation.FuncAnimation(fig, run, data_gen, init_func=init)
................................
我的问题解决了。我犯了一个错误,忘记将变量指定为全局变量。但现在,我只需将向量权重和向量延迟信号发送到函数即可。
谢谢大家!!