Matplotlib动画类使用全局变量时程序阻塞问题求助
问题:CALP误差动画展示时系数更新语句导致程序阻塞
我需要对CALP(级联自适应线性预测器)的误差做动画展示,使用Matplotlib的Animation类实现。但执行系数更新语句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(): #设置x轴和y轴的最小、最大值 ax.set_ylim(30000, -30000) ax.set_xlim(0,100) #若列表中有数据则清空 del xdata[:] del ydata[:] #设置绘图初始值 line.set_data(xdata, ydata) return line, # 执行函数(传入并拆分数据) def run(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)
内容的提问来源于stack exchange,提问作者Никита Сушков
相关产品推荐
相关产品推荐

