我的目标是随机生成外观连续的函数,这些函数可以从其图中恢复。
基本上,我想生成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)是否有更好的方法来生成美观的函数, 而不使用曲线拟合或插值。
修改
这是我当前用于生成长度为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()
答案 0 :(得分:1)
添加sin
和cosine
信号
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()
输出:
卷积sin
和cosine
信号
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()
输出: