如何随机生成连续函数

时间:2019-06-11 07:59:28

标签: python random interpolation curve-fitting curve

我的目标是随机生成外观连续的函数,这些函数可以从其图中恢复。

基本上,我想生成1秒的随机时间序列数据,每秒1024个样本。如果我随机选择1024个值,则该图看起来非常嘈杂,并且无法从中提取任何有意义的信息。最后,我附加了两个正弦曲线的图,一个正弦波的频率为3Hz,另一个正弦波的频率为100Hz。我认为3Hz余弦是一个很好的函数,因为我可以通过查看曲线图来提取时间序列。但是100 Hz正弦波对我不利,因为我无法从绘图中恢复时间序列。因此,按照上述时间序列优度的含义,我想随机生成美观的连续函数/时间序列。

我正在考虑使用的方法如下(python语言):

(1)使用x=linspace(0,1,32)在0到1之间的x轴上选择32个点。

(2)使用y=np.random.rand(32)为这32个点中的每一个选择一个随机值。

(3)然后,我需要一种插值法或曲线拟合方法,该方法将(x,y)作为输入并输出一个看起来像func=curve_fit(x,y)的continuos函数

(4)我可以通过func函数进行采样来获取时间序列

以下是我的问题:

  

1)我能找到的最佳曲线拟合或插值方法是什么   采用。它们也应该在python中可用。

     

2)是否有更好的方法来生成美观的函数,   而不使用曲线拟合或插值。

A Cosine wave with frequency of 3Hz

A Cosine wave with frequency of 100Hz

修改

这是我当前用于生成长度为1024的随机时间序列的代码。就我而言,我需要在y轴上将函数缩放为0到1之间。因此对我来说,l = 0,h = 0。如果不需要缩放,则只需在每个函数中取消注释一行即可随机缩放。

import numpy as np
from scipy import interpolate
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

## Curve fitting technique
def random_poly_fit():
    l=0
    h=1
    degree = np.random.randint(2,11)
    c_points = np.random.randint(2,32)
    cx = np.linspace(0,1,c_points)
    cy = np.random.rand(c_points)
    z = np.polyfit(cx, cy, degree)
    f = np.poly1d(z)
    y = f(x)
    # l,h=np.sort(np.random.rand(2))
    y = MinMaxScaler(feature_range=(l,h)).fit_transform(y.reshape(-1, 1)).reshape(-1)
    return y

## Cubic Spline Interpolation technique
def random_cubic_spline():
    l=0
    h=1
    c_points = np.random.randint(4,32)
    cx = np.linspace(0,1,c_points)
    cy = np.random.rand(c_points)
    z = interpolate.CubicSpline(cx, cy)
    y = z(x)
    # l,h=np.sort(np.random.rand(2))
    y = MinMaxScaler(feature_range=(l,h)).fit_transform(y.reshape(-1, 1)).reshape(-1)
    return y

func_families = [random_poly_fit, random_cubic_spline]
func = np.random.choice(func_families)
x = np.linspace(0,1,1024)
y = func()
plt.plot(x,y)
plt.show()

1 个答案:

答案 0 :(得分:1)

添加sincosine信号

from numpy.random import randint
x= np.linspace(0,1,1000)
for i in range(10):    
    y = randint(0,100)*np.sin(randint(0,100)*x)+randint(0,100)*np.cos(randint(0,100)*x)
    y = MinMaxScaler(feature_range=(-1,1)).fit_transform(y.reshape(-1, 1)).reshape(-1)
    plt.plot(x,y)
plt.show()

输出:

enter image description here

卷积sincosine信号

for i in range(10):    
    y = np.convolve(randint(0,100)*np.sin(randint(0,100)*x), randint(0,100)*np.cos(randint(0,100)*x), 'same')
    y = MinMaxScaler(feature_range=(-1,1)).fit_transform(y.reshape(-1, 1)).reshape(-1)
    plt.plot(x,y)
plt.show()

输出:

enter image description here