#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
образом, разница незначительна.