我在python中使用matplotlib.pyplot。考虑y轴是真实的值,称为"排名损失" x轴是迭代次数(1000)。然后我绘制每次迭代中算法的2次运行的平均排名损失。
有谁知道为什么我会得到这个奇怪的粗图而不是一条线?
非常感谢您提前
命令是:
fig = plt.figure()
fig.suptitle('Batch-GD', fontsize=20)
plt.xlabel('Iteration', fontsize=18)
plt.ylabel('Avg ranking loss', fontsize=16)
plt.grid(True)
plt.xlim(0, iter)
plt.plot(avg_loss)
fig.savefig('GD_with_ini.jpg')
plt.show()
答案 0 :(得分:3)
这里发生的事情可能是,你的线密度太高,以至于线条重叠的方式是显示平面而不是线本身。
如果我们采取例如10000点并使曲线以非常高的频率振荡,我们得到了类似的行为。放大显示实际上有一条线。
重现情节的代码:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset
x = np.linspace(0,1000,num=10000)
y = np.sin(x*100.)*x/5000.+np.exp(-x/60.)+np.sin(x/50.)*0.016
plt.plot(x,y)
###### show inset ####
ax = plt.gca()
axins = inset_axes(ax, 2,2, loc=1)
axins.plot(x,y)
axins.set_xlim(400, 410)
axins.set_ylim(-0.1, 0.17)
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
plt.show()
然后,解决方案可以计算某种滚动平均值。 E.g:
def running_mean(x, N):
cumsum = np.cumsum(np.insert(x, 0, 0))
return (cumsum[N:] - cumsum[:-N]) / N
N=300
cumsum = running_mean(y, N)
ax.plot(x[N//2:-N//2+1], cumsum, c="orange")
axins.plot(x[N//2:-N//2+1], cumsum, c="orange")