TL; DR: вопрос о умножении ТОЧНОСТЬ
Я должен умножить матрицы A
(100x8000), B
(8000x27) и C
(27x1).
Поскольку матрицы B
и C
являются постоянными, а A
- переменными, я предпочитаю рассчитывать их как: ABC = np.dot(A, np.dot(B, C))
. Однако мне интересно, что это может быть численно хуже (с точки зрения точность ), чем np.dot(np.dot(a, B), C)
.
Что может быть важно: матрицы A
и B
содержат 8000 выборок (соответственно) 100 и 27 коррелированных признаков.
Существует ли численно оптимальный (с точки зрения точность ) порядок умножения? Если да - как я могу это определить?
Особый случай
Можно предположить, что матрицы A
и B
неотрицательны.
Кроме того:
C = np.linalg.solve(cov(B, k), X)
, где X
- матрица 27x1 из 27 (возможно, коррелированных) случайных величин неизвестного распределения, cov = lambda X, k: np.dot(X.T, X) + k * np.eye(X.shape[1])
, а k
- неотрицательная константа, минимизирующая выражение:
sum((X[i, 0] - np.dot(np.dot(B[:, [i]].T, drop(B, i)),
np.linalg.solve(cov(drop(B, i), k),
np.delete(X, i, axis=0))) **2
for i in range(27))
Функция drop()
определяется как lambda X, i: np.delete(X, i, axis=1)
.
Еще более особый случай
Можно предположить, что np.cov(B.T, B)
является ковариационной матрицей X
, которая следует многомерному распределению Гаусса.