Ручное вычисление ковариационной матрицы отличается от метода numpy

#python #numpy #matrix

#python #numpy #матрица

Вопрос:

Учитывая, что существует матрица n выборок с m объектами, я вычисляю ковариационную матрицу объектов вручную, так что это должно быть m m . Это может быть сделано с помощью numpy, для небольшого примера,

 arr_x = np.array([[ 1,  4],
                  [ 4, 10],
                  [ 3,  6],
                  [ 5, 11],
                  [ 2,  4]])
print(np.cov(arr_x, rowvar=False)) 

>>> [[ 2.5  5. ]
     [ 5.  11. ]]
 

Я могу получить ту же ковариационную матрицу, выполнив

 mean_x = np.mean(arr_x, 0)
np.dot(arr_x.T-mean_x[:, None],(arr_x.T-mean_x[:, None]).T)/(arr_x.shape[0] - 1)

>>> [[ 2.5,  5. ]
     [ 5. , 11. ]]
 

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

 a = np.random.randint(0, 255, (5000, 200))
mean_a = np.mean(a, 0)
by_hand = np.dot(a.T-mean_a[:, None],(a.T-mean_a[:, None]).T)/(a.shape[0] - 1)
numpy_cov = np.cov(a, rowvar=False)
print((by_hand == numpy_cov).all())
 

Что я делаю не так или есть лучший способ получить ковариационную матрицу вручную?

Комментарии:

1. np.abs((by_hand - numpy_cov)).mean() таким 2.58e-16 образом, разница незначительна.