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

У меня возникли проблемы при создании этого набора данных для моей диссертации из следующего дистрибутива .

Моя попытка привела к созданию этого набора данных который выглядит более независимым.Я не могу определить, где я иду не так.Может ли кто-нибудь помочь мне?

Вот код:

# Non-linear dependence without correlation
import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform(-0.5, 0.5, 500)

def y_samples(x):
    y = []
    for i in x:
        if np.abs(i) <= 1/6:
            y.append(np.random.normal(0, 1/9))
        else:
            y.append(0.5 * np.random.normal(1, 1/9) + 0.5 * np.random.normal(-1, 1/9))
    return y    

y = y_samples(x)

plt.scatter(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

Спасибо!

1 Ответ

0 голосов
/ 04 июня 2019

Вы неправильно обрабатываете случай |x| > 1/6, возможно, скорее из-за неправильного понимания математики, чем из-за неправильного понимания кода. Выражение

0.5 * np.random.normal(1, 1/9) + 0.5 * np.random.normal(-1, 1/9)

дает нормальное распределение с центром в нуле, не бимодальное распределение с центрами в -1 и 1.

Исправление становится очевидным, если вы лучше поняли математику: замените оскорбительный расчет на что-то вроде

np.random.normal(1.0, 1.0/9.0) if np.random.random() > 0.5 else np.random.normal(-1.0, 1.0/9.0)

(1/9 оценивается в 0 в Python2 , который я использовал для тестирования.)

...