Я в поиске решателя, который я могу использовать в R для решения довольно больших (n = p = 15000 с 0,2% ненулевых элементов в моей матрице дизайна X) разреженных линейных систем, подверженных либо положительным, либо рамочным ограничениям для подобранныхКоэффициенты.
После добавления штрафа регуляризации регрессии гребня (путем увеличения строки по X с диагональной матрицей с sqrt(lambda)
по диагонали) я могу довольно эффективно решить такую систему, используя Градиент сопряжения наименьших квадратов Эйгена в Rcpp (примерно 500 мс для n = p = 15000).Но это игнорирует ограничения позитивности, которые я хотел бы применить, и в итоге я получаю некоторые коэффициенты, которые в итоге оцениваются как отрицательные.Я мог бы обрезать их, но это было бы неидеальным решением.
Итак, мой вопрос - кто-нибудь знает о разреженном решателе в R, который допускает неотрицательность и / или рамочные ограничения для подобранных коэффициентов - в идеале итеративный, который позволил бы мне предоставить начальные значения и которыйне будет явным образом формировать нормальные уравнения, так как они будут довольно большими (и XTX не редкий, но X есть; решение квадратичного программирования, например, с использованием пакета R osqp
, поэтому также не достаточно хорошо, поскольку оно формирует XTX явно;простая плотная подгонка nnls
, которая использует активный набор алгоритмов, также занимает более часа при n = p = 15000, что было бы слишком медленным для меня).
В терминах линейных решателей, оптимизированных для разреженных систем с ограничениями положительности на других языках, я встречал NNLS_SBB (C ++ и Matlab) и Tsnnls (C ++) и с коробкойограничения, которые я видел, есть решатель наименьших квадратов, отражающий ограниченную наименьших квадратов Python (реализован в scipy.optimize.lsq_linear ) (аналогично lsqlin от Matlab).Кто-нибудь случайно узнал о хорошем R-порте любого из них?Я также видел, что в R есть функция NNLM * nnlm , которая может решать неотрицательные наименьшие квадраты с помощью координатного алгоритма, который в принципе может быть хорошим, но кажется, что он не может принимать разреженную матрицу проектирования (созданиеX плотнее, сначала требуется 85 с, чтобы решить мою систему с n = p = 15000, что для меня слишком медленно). Этот метод , где nnls
переформулирован как отдельный класс SVM, также может быть многообещающим, хотя он не поставляется с кодом.
В качестве альтернативы, есть ли очевидный способ реализации неотрицательностиили рамочные ограничения в рамках градиента сопряжения наименьших квадратов Эйгена?Я мог бы оценить свои коэффициенты после добавления штрафа гребня (назовем их бета), а затем обрезать (или, может быть, изменить масштаб ??) мои коэффициенты, чтобы они находились в допустимом диапазоне, указанном в моих ограничениях блока, а затем использовать адаптивный гребень
с адаптивным штрафомвесим 1/(beta^2+eps)
с небольшим eps
и затем повторяем это до сходимости.Хотя будет ли это приемлемым методом (это будет похоже на то, как подходят L0 штрафные регрессионные модели )?И лучше всего будет отсечение или изменение масштаба коэффициентов, чтобы они оставались в допустимом диапазоне (отсечение привело бы к очень большому штрафу за коэффициенты, которые на 1-й итерации оказываются отрицательными, так что эти коэффициенты никогда не могли бы войти в окончательную модель, изменение масштаба будетчастично исправить это).Или были бы лучшие и более эффективные методы?
Использование спуска координат блока, оптимизация различных блоков переменных отдельно с использованием плотного подбора nnls
, могло бы быть другим вариантом (это было бы похоже на решение спуска координат nnlm, но используя блоки переменных одновременно и используя nnls, чтобы соответствовать каждой подзадаче).Но тогда возникает вопрос, как построить эти блоки и что делать с термином перехвата (может быть, в первой итерации включить это в каждый блок переменных ??).