Создание матрицы случайных данных в Python - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать в Python матрицу 30 × 10, в которой случайно генерируются числа. Но мои числа в матрице должны соответствовать условию:

Произвольно генерировать 30 точек данных из функции синуса, где каждая точка данных (x, y) имеет вид

x = [x 0 , x 1 , x 2 , ..., x 10 ], x∈ [0, 2π]

y = sin (x) + ε, ε ∈ N (0,0,3)

Как я могу это сделатьпойти на это?

Прямо сейчас у меня есть только матрица 1 × 10

def generate_sin_data():

    x = np.random.rand()
    y = np.sin(x)
    features = [x**0, x**1, x**2, x**3, x**4,x**5, x**6, x**7, x**8, x**9,x**10]


    return x,y,features

Ответы [ 2 ]

0 голосов
/ 21 октября 2019
import numpy as np
# 30 random uniform values in [0, 2*pi)
_x = np.random.uniform(0, 2*np.pi, 30)

# matrix of 30x10:
x = np.array([
    [v ** i for i in range(10)]
    for v in _x
])

# random 30x10 normal noise:
eps = np.random.normal(0, 0.3, [30, 10])

# final result 30x10 matrix:
y = np.sin(x) + eps
0 голосов
/ 21 октября 2019

Я не уверен на 100%, что следую всему, но мы можем это сломать. Вот как вы можете сгенерировать 30 случайных чисел от 0 до 2π:

import numpy as np
x = np.random.random(30) * 2*np.pi

Здесь x - это одномерный массив из 30 чисел. Проверьте это с помощью x.shape.

Теперь, если вы добавите измерение, легко сгенерировать матрицу мощностей до 10, используя функцию вещания NumPy. Кажется, вопрос задает 11 чисел (от 0 до 10), а не 10, поэтому я сделаю это:

X = x.reshape(-1, 1) ** np.arange(0, 11)

Что reshape эффективно превращает x в вектор-столбец. Теперь проверьте X.shape, и это (30, 11), что, как я думаю, вы преследовали. Обратите внимание, что мы используем большую X для матрицы - это соглашение поможет вам отслеживать вещи. Каждый столбец X - это исходная функция, возведенная в степень от 0 до 10. (Обратите внимание, что каждый столбец состоит из одного и того же набора случайных чисел - я не уверен, что вы этого хотите?)

Если вы хотите, чтобы y был функцией x (вектор), сделайте так:

ϵ = np.random.random(30) * 0.3
y = np.sin(x) + ϵ
...