Nano Hash - криптовалюты, майнинг, программирование

Разложение QR отличается в lm и biglm?

Я пытаюсь восстановить матрицу R из разложения QR, используемого в biglm. Для этого я использую часть кода в vcov.biglm и помещаю его в функцию следующим образом:

qr.R.biglm <- function (object, ...) {
    # Return the qr.R matrix from a biglm object
    object$qr <- .Call("singcheckQR", object$qr)
    p <- length(object$qr$D)
    R <- diag(p)
    R[row(R) > col(R)] <- object$qr$rbar
    R <- t(R)
    R <- sqrt(object$qr$D) * R
    dimnames(R) <- list(object$names, object$names)
    return(R)
}

В частности, я пытаюсь получить тот же результат, что и при использовании qr.R из базового пакета, который используется для QR-декомпозиций класса "qr", например, содержащихся в классе lm (lm$qr). Код базовой функции выглядит следующим образом:

qr.R <- function (qr, complete = FALSE) {
    if (!is.qr(qr)) 
        stop("argument is not a QR decomposition")
    R <- qr$qr
    if (!complete) 
        R <- R[seq.int(min(dim(R))), , drop = FALSE]
    R[row(R) > col(R)] <- 0
    R
}

Мне удается получить тот же результат для выборочной регрессии, за исключением знаков.

x <- as.data.frame(matrix(rnorm(100 * 10), 100, 10))
y <- seq.int(1, 100)
fit.lm <- lm("y ~ .", data =  cbind(y, x))
R.lm <- qr.R(fit.lm$qr)

library(biglm)
fmla <- as.formula(paste("y ~ ", paste(colnames(x), collapse = "+")))
fit.biglm <- biglm(fmla, data = cbind(y, x))
R.biglm <- qr.R.biglm(fit.biglm)

Сравнивая оба, становится ясно, что совпадают абсолютные значения, но не знаки.

mean(abs(R.lm) - abs(R.biglm) < 1e-6)
[1] 1
mean(R.lm - R.biglm < 1e-6)
[1] 0.9338843

Я не могу понять, почему это так. Я хотел бы иметь возможность получить тот же результат для матрицы R, что и lm из biglm.


Ответы:


1

Разница между двумя матрицами R заключается в том, что biglm, по-видимому, выполняет свои повороты таким образом, что все диагональные элементы R положительны, в то время как lm (или, на самом деле, подпрограммы, которые она вызывает) накладывает нет такого ограничения. (У той или иной стратегии не должно быть численного преимущества, поэтому разница только в условности, AFAIKT.)

Вы можете сделать результаты lm идентичными результатам biglm, наложив это дополнительное ограничение самостоятельно. Я бы использовал матрицу отражения, которая умножает столбцы либо на 1, либо на -1, чтобы все диагональные элементы оказались положительными:

## Apply the necessary reflections
R.lm2 <- diag(sign(diag(R.lm))) %*% R.lm

## Show that they did the job
mean(R.lm2 - R.biglm < 1e-6)
# [1] 1
06.11.2012
  • Спасибо, Джош. Это полезно. Однако я пытаюсь решить противоположную проблему: как сделать так, чтобы матрица biglm R соответствовала матрице lm R? Если это возможно. 06.11.2012
  • @ user3327 -- Хорошо. Наверное, я неправильно понял последнее предложение вашего поста. Я не смогу больше помочь, но оставлю это на случай, если кому-то еще будет интересно... Просто из любопытства, почему вас волнует, что знаки столбцов двух R-матриц совпадают? 06.11.2012
  • Спасибо, Джош. Просто чтобы дать немного больше информации: я пытаюсь заменить lm на biglm в каком-то существующем коде, так как у меня есть большой набор данных, для которого я хочу выполнить регрессию, и я не смогу использовать lm. Моя программа использует эту матрицу R дальше по линии, и было бы неплохо, если бы я мог просто извлечь ту же матрицу, а не придумывать новую формулу. Если до этого дойдет, так тому и быть :-) просто решил сначала поспрашивать. 06.11.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..