Как случайным образом генерировать непрерывные функции - PullRequest
0 голосов
/ 11 июня 2019

Моя цель состоит в том, чтобы случайным образом генерировать хорошо выглядящие непрерывные функции, то есть хорошо выглядящие функции, которые можно восстановить с их графиков.

По сути, я хочу сгенерировать случайные данные временных рядов за 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

A Cosine wave with frequency of 100Hz

Редактировать

Вот код, который я использую в настоящее время для генерации случайных временных рядовдлины 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()

1 Ответ

1 голос
/ 11 июня 2019

Добавить 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()

Выход:

enter image description here

свертка 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()

Выход:

enter image description here

...