Производит ли scipy.stats разные случайные числа для разного компьютерного оборудования? - PullRequest
0 голосов
/ 04 марта 2019

У меня проблема с тем, что я получаю разные случайные числа на разных компьютерах, несмотря на

  • scipy.__version__ == '1.2.1' на всех компьютерах
  • numpy.__version__ == '1.15.4' на всех компьютерах
  • random_state seed фиксируется на одном и том же номере (42) в каждом вызове функции, который генерирует случайные числа для воспроизводимых результатов

Код немного сложен для полной публикации здесь,но я заметил, что результаты начинают конкретно расходиться, когда выборка из многомерного нормального :

import numpy as np
from scipy import stats
seed = 42
n_sim = 1000000
d = corr_mat.shape[0] # corr_mat is a 15x15 correlation matrix, numpy.ndarray
# results diverge from here across different hardware
z = stats.multivariate_normal(mean=np.zeros(d), cov=corr_mat).rvs(n_sim, random_state=seed)

corr_mat является корреляционной матрицей (см. Приложение ниже) и одинакова для всех компьютеров.

Два разных компьютера, на которых мы тестируем:

Компьютер 1


  • ОС: Windows 7
  • Процессор: Intel (R) Xeon® CPU E5-2623 v4 @ 2.60 ГГц 2.60 ГГц (2 процессора)
  • ОЗУ: 64 ГБ
  • Тип системы: 64-разрядная

Компьютер 2


  • ОС: Windows 7
  • Процессор: Intel (R) Xeon (R) ПроцессорE5-2660 v3 @ 2,10 ГГц 2,10 ГГц (2 процессора)
  • Оперативная память: 64 ГБ
  • Тип системы: 64-разрядная

Приложение

corr_mat
>>> array([[1.  , 0.15, 0.25, 0.25, 0.25, 0.25, 0.1 , 0.1 , 0.1 , 0.25, 0.25,
        0.25, 0.1 , 0.1 , 0.1 ],
       [0.15, 1.  , 0.  , 0.  , 0.  , 0.  , 0.15, 0.05, 0.15, 0.15, 0.15,
        0.  , 0.15, 0.15, 0.15],
       [0.25, 0.  , 1.  , 0.25, 0.25, 0.25, 0.2 , 0.  , 0.2 , 0.2 , 0.2 ,
        0.25, 0.2 , 0.2 , 0.2 ],
       [0.25, 0.  , 0.25, 1.  , 0.25, 0.25, 0.2 , 0.  , 0.2 , 0.2 , 0.2 ,
        0.25, 0.2 , 0.2 , 0.2 ],
       [0.25, 0.  , 0.25, 0.25, 1.  , 0.25, 0.2 , 0.  , 0.2 , 0.2 , 0.2 ,
        0.25, 0.2 , 0.2 , 0.2 ],
       [0.25, 0.  , 0.25, 0.25, 0.25, 1.  , 0.2 , 0.  , 0.2 , 0.2 , 0.2 ,
        0.25, 0.2 , 0.2 , 0.2 ],
       [0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 1.  , 0.15, 0.25, 0.25, 0.25,
        0.2 , 0.25, 0.25, 0.25],
       [0.1 , 0.05, 0.  , 0.  , 0.  , 0.  , 0.15, 1.  , 0.15, 0.15, 0.15,
        0.  , 0.15, 0.15, 0.15],
       [0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 1.  , 0.25, 0.25,
        0.2 , 0.25, 0.25, 0.25],
       [0.25, 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 1.  , 0.25,
        0.2 , 0.25, 0.25, 0.25],
       [0.25, 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 1.  ,
        0.2 , 0.25, 0.25, 0.25],
       [0.25, 0.  , 0.25, 0.25, 0.25, 0.25, 0.2 , 0.  , 0.2 , 0.2 , 0.2 ,
        1.  , 0.2 , 0.2 , 0.2 ],
       [0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
        0.2 , 1.  , 0.25, 0.25],
       [0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
        0.2 , 0.25, 1.  , 0.25],
       [0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
        0.2 , 0.25, 0.25, 1.  ]])

1 Ответ

0 голосов
/ 04 марта 2019

Ниже приводится обоснованное предположение, которое я не могу проверить, поскольку у меня нет нескольких машин.

Выборка из коррелированной мультинормальной обычно выполняется путем выборки из некоррелированной стандартной нормали, а затем умножения на «квадрат».корень "ковариационной матрицы.Я получаю образец, довольно похожий на тот, который производит Сципи, с начальным значением 42 и вашей ковариационной матрицей, если вместо ковариации использовать identity(15), а затем умножить на l*sqrt(d), где l,d,r = np.linalg.svd(covariance)

SVD - это Iпредположим, достаточно сложный, чтобы объяснить небольшие различия между платформами.

Как этот снежный ком может превратиться во что-то существенное?

Я думаю, что виноват ваш выбор ковариационной матрицы, поскольку она имеет неуникальные собственные значения.Как следствие, SVD не является уникальным, поскольку собственные пространства с заданным множественным собственным значением могут вращаться.Это может значительно усилить небольшую числовую разницу.

Было бы интересно посмотреть, сохранятся ли наблюдаемые различия, если вы тестируете с другой ковариационной матрицей с уникальными собственными значениями.

Edit :

Для справки, вот что я попробовал для вашего меньшего (6D) примера:

>>> cm6 = np.array([[1,.5,.15,.15,0,0], [.5,1,.15,.15,0,0],[.15,.15,1,.25,0,0],[.15,.15,.25,1,0,0],[0,0,0,0,1,.1],[0,0,0,0,.1,1]])
>>> ls6,ds6,rs6 = np.linalg.svd(cm6)
>>> np.random.seed(42)
>>> cs6 = stats.multivariate_normal(cov=cm6).rvs()
>>> np.random.seed(42)
>>> is6 = stats.multivariate_normal(cov=np.identity(6)).rvs()
>>> LS6 = ls6*np.sqrt(ds6)
>>> np.allclose(cs6, LS6@is6)
True

Поскольку вы сообщаете, что проблема не исчезает с уникальными собственными значениями, вот однабольше возможностейВыше я использовал svd для вычисления собственных векторов / значений, что нормально, поскольку cov симметричен.Что произойдет, если вместо этого мы будем использовать eigh?

>>> de6,le6 = np.linalg.eigh(cm6)
>>> LE6 = le6*np.sqrt(de6)
>>> cs6
array([-0.00364915, -0.23778611, -0.50111166, -0.7878898 , -0.91913994,
        1.12421904])
>>> LE6@is6
array([ 0.54338614,  1.04010029, -0.71379193, -0.88313042, -0.60813547,
        0.26082989])

Они разные.Зачем?Во-первых, eigh упорядочивает собственные пространства наоборот:

>>> ds6
array([1.7 , 1.1 , 1.05, 0.9 , 0.75, 0.5 ])
>>> de6
array([0.5 , 0.75, 0.9 , 1.05, 1.1 , 1.7 ])

Это исправляет?Почти.

>>> LE6[:, ::-1]@is6
array([-0.00364915, -0.23778611, -0.50111166, -0.7878898 , -1.12421904,
        0.91913994])

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

Так что даже для уникальных собственных значений мы можем получить большие различия из-за неоднозначностей в (1) порядке собственных пространств и (2) знакесобственных векторов.

...