Быстрый NMF в R на разреженных матрицах

Я ищу быструю реализацию NMF для разреженных матриц в R.

Пакет R NMF состоит из ряда алгоритмов, ни один из которых не впечатляет с точки зрения времени вычислений.

NNLM::nnmf() кажется современным в R на данный момент, особенно method = "scd" и loss = "mse", реализованные как чередующиеся наименьшие квадраты, решаемые последовательным спуском по координатам. Однако этот метод довольно медленный на очень больших и очень разреженных матрицах.

Функция rsparse::WRMF очень быстрая, но это связано с тем, что только положительные значения в A используются для построчного вычисления W и H. Без коллинеарной оптимизации/штрафа за отсутствующие значения это приводит к некоторой внутренней нестабильности функции потерь и неоптимальному достижению цели.

Есть ли какой-нибудь общий метод решения NMF на разреженной матрице?

Есть ли эквивалент scikit-learn в R? См. этот вопрос

Существуют различные рабочие функции, такие как fnnls, tsnnls в R, ни одна из которых не превосходит nnls::nnls (написана на Фортране). Мне не удалось закодировать ни одну из этих функций в более быструю структуру NMF.


r nmf
person zdebruine    schedule 24.11.2020    source источник


Ответы (1)


Забыл, что даже разместил этот вопрос, но год спустя...

Я написал очень быструю реализацию NMF в RcppEigen, см. пакет RcppML R на CRAN.

install.packages("RcppML")

# for the development version
devtools::install_github("zdebruine/RcppML")

?RcppML::nmf

Это как минимум на порядок быстрее, чем NNLM::nnmf, и для сравнения, RcppML::nmf соперничает по времени выполнения с irlba::irlba SVD (хотя это совсем другой алгоритм).

Я успешно применил свою реализацию к 1,3 миллионам одиночных ячеек, содержащих 26000 генов, в 96% разреженной матрице для факторизации ранга 100 за 1 минуту. Я думаю, это очень разумно.

person zdebruine    schedule 02.08.2021