Моя цель состоит в том, чтобы случайным образом генерировать хорошо выглядящие непрерывные функции, то есть хорошо выглядящие функции, которые можно восстановить с их графиков.
По сути, я хочу сгенерировать случайные данные временных рядов за 1 секунду с 1024 выборками в секунду.Если я случайным образом выберу 1024 значения, график выглядит очень шумным, и из него нельзя извлечь ничего значимого.В конце я приложил графики двух синусоид, один с частотой 3 Гц, а другой с частотой 100 Гц.Косинус 3 Гц я считаю хорошей функцией, потому что я могу извлечь временные ряды, посмотрев на график.Но синусоида с частотой 100 Гц вредна для меня, поскольку я не могу восстановить серию времени из сюжета.Таким образом, в вышеупомянутом смысле добродетели временных рядов я хочу случайным образом генерировать хорошо выглядящие непрерывные функции / временные ряды.
Метод, который я собираюсь использовать, выглядит следующим образом (язык Python):
(1) Выберите 32 точки по оси X от 0 до 1, используя x=linspace(0,1,32)
.
(2) Для каждой из этих 32 точек выберите случайное значение, используя y=np.random.rand(32)
.
(3) Затем мне нужен метод интерполяции или подбора кривой, который принимает в качестве входных данных (x, y) и выводитнепрерывная функция, которая выглядела бы примерно так: func=curve_fit(x,y)
(4) Я могу получить временные числа путем выборки из функции func
Ниже приведены мои вопросы:
1) Какой метод подгонки кривой или интерполяции лучше всего использовать?Они также должны быть доступны в Python.
2) Есть ли лучший способ генерировать хорошо выглядящие функции, без использования подгонки кривой или интерполяции.
![A Cosine wave with frequency of 3Hz](https://i.stack.imgur.com/vqDuB.jpg)
![A Cosine wave with frequency of 100Hz](https://i.stack.imgur.com/8C67x.jpg)
Редактировать
Вот код, который я использую в настоящее время для генерации случайных временных рядовдлины 1024. В моем случае мне нужно масштабировать функцию от 0 до 1 по оси Y.Следовательно, для меня 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()