生成随机波函数。

6
我需要在matplotlib中生成一条随机曲线。
我的x值范围为1到1000,例如。我不想生成分散的随机y值,我需要一条平滑的曲线。就像某种变幅和波长不同的扭曲正弦曲线一样。
有没有现成的东西可以让我轻松地做到这一点?
1个回答

27

尝试这段代码:

import matplotlib.pyplot as pl
import numpy as np

x = np.linspace(1, 10)

def f(x):
    return np.sin(x) + np.random.normal(scale=0.1, size=len(x))

pl.plot(x, f(x))

它将提供一个带有一些噪声的正弦波:

带有噪声的正弦波

编辑:

看起来你需要一种叫做高斯随机漫步的东西。这个函数可以为你完成:

def f(x):
    y = 0
    result = []
    for _ in x:
        result.append(y)
        y += np.random.normal(scale=1)
    return np.array(result)

这是一个示例,展示了它看起来的样子(使用x = np.linspace(0, 1000, 1000)):

随机漫步

然而,它不再是关于x的函数,因此代码应该重构为生成n步随机漫步。我会把这个交给你 :)

编辑2:

如果你想得到更平滑的曲线,可以应用一个移动平均值(从这个问题借鉴):

def runningMean(x, N):
    return np.convolve(x, np.ones((N,))/N)[(N-1):]

pl.plot(x, runningMean(f(x), 10))

使用更大的窗口(N参数),结果会更加平滑。

示例:

带有运行均值的随机游走


嗨,谢谢。那不是我想要的。基础正弦波需要变化更多。我想更像股市趋势。这里的蓝线或绿线:http://www.crestmontresearch.com/docs/Inflation-PE-FAQ-640x427.jpg - user1551817
2
我现在添加了一个不同的功能,一种随机游走。 - André Laszlo
好的,非常感谢。有没有办法让它更流畅? - user1551817
2
是的,例如使用滑动平均(更新后的答案)。 - André Laszlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接