Я работаю над реализацией следующего уравнения:
X =(Y.T * Y + Y.T * C * Y) ^ -1
Y - матрица (n x f), а C - (n x n) - диагональная; n составляет около 300 тыс., а f будет варьироваться от 100 до 200. В рамках процесса оптимизации это уравнение будет использоваться почти 100 миллионов раз, поэтому его нужно обрабатывать очень быстро.
Y инициализируется случайным образом, а C - очень разреженная матрица, и только несколько чисел из 300k по диагонали будут отличаться от 0. Поскольку диагональные функции Numpy создают плотные матрицы, я создал C как разреженную матрицу csr. Но при попытке решить первую часть уравнения:
r = dot(C, Y)
Компьютер выходит из строя из-за ограничений памяти. Затем я решил преобразовать Y в csr_matrix и выполнить ту же операцию:
r = dot(C, Ysparse)
и этот подход занял 1,38 мс. Но это решение несколько "сложно", так как я использую разреженную матрицу для хранения плотной, интересно, насколько это эффективно.
Итак, мой вопрос в том, есть ли способ умножения разреженного C и плотного Y без необходимости превращать Y в разреженный и улучшать производительность? Если бы какой-то С мог быть представлен как диагональный плотный, не потребляя тонны памяти, возможно, это привело бы к очень эффективной работе, но я не знаю, возможно ли это.
Я ценю вашу помощь!