【问题标题】:Numpy: how to generate a random noisy curve resembling a "training curve"Numpy:如何生成类似于“训练曲线”的随机噪声曲线
【发布时间】:2018-01-15 09:05:48
【问题描述】:

我想知道如何生成一些随机数据,其图类似于“训练曲线”。训练曲线是指来自学习模型的一系列训练损失值。这些通常在开始时具有较大的值和方差,并且随着时间的推移收敛到具有非常小的方差的某个值。它看起来有点像嘈杂的指数曲线。

这是我最接近生成类似于训练曲线的随机数据的方法。问题是曲线不像真实损失曲线那样变平或收敛,并且在较平的部分有太多的方差。

import numpy as np
import matplotlib.pyplot as plt

num_iters = 2000
rand_curve = np.sort(np.random.exponential(size=num_iters))[::-1]
noise  = np.random.normal(0, 0.2, num_iters)
signal = rand_curve + noise
noisy_curve = signal[signal > 0]
plt.plot(noisy_curve, c='r', label='random curve')

这是一个实际的训练损失曲线供参考。

我对概率分布知之甚少,不知道这是否是一个愚蠢的问题。我只想生成一条随机曲线,以便其他人可以使用数据数组来帮助我解决我在matplotlib 中遇到的关于对数图的另一个问题。

【问题讨论】:

  • 实际上,你的曲线给我留下了深刻的印象......“实际”曲线可能代表了我用模拟退火之类的方法所做的工作,但我认为大多数算法都会已经杀死了迭代过程,直到它像那样平缓了这么久?
  • @roganjosh 哦,谢谢!我认为您对大多数算法在收敛后终止训练是正确的,但是我无法使用香草框架训练器来完成我的任务,因此这条曲线来自更天真的训练循环。使用简单的pyplot.plot(loss) 很难看到,但实际上它仍然非常轻微地减少,直到大约 1500 次迭代。使用对数 y 轴或 polyfit,您可以更好地看到这一点。

标签: python numpy


【解决方案1】:

这里是如何使用噪声的伽马分布的说明

x = np.arange(2000)
y = 0.00025 + 0.001 * np.exp(-x/100.) + scipy.stats.gamma(3).rvs(len(x))*(1-np.exp(-x/100))*2e-5

您可以在此处调整参数,以减少噪音等

【讨论】:

    【解决方案2】:

    似乎您可以为噪声值添加一个阻尼器,该阻尼器与给定值沿 x 轴的距离成正比。这意味着,在这种情况下,曲线越平坦,方差就会越小。比如:

    import numpy as np
    import matplotlib.pyplot as plt
    
    num_iters = 2000
    rand_curve = np.sort(np.random.exponential(size=num_iters))[::-1]
    noise  = np.random.normal(0, 0.2, num_iters)
    
    index = 0
    for noise_value in  np.nditer(noise):
        noise[index] = noise_value - index 
        index = index + 1
    
    signal = rand_curve + noise
    noisy_curve = signal[signal > 0]
    plt.plot(noisy_curve, c='r', label='random curve')
    

    因此我认为沿着 X 走得越远噪声值应该越低,它应该达到你想要的结果!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2019-05-31
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多