R 中的 chol() 函数不断返回上三角(我需要下三角)
chol() function in R keeps returning Upper Triangular (I need Lower Triangular)
我正在尝试使用 chol()
函数在 R 中获取以下矩阵的下三角 Cholesky 分解。但是,它一直返回上三角分解,我似乎无法找到获得下三角分解的方法,即使在查看了文档之后也是如此。以下是我正在使用的代码 -
x <- matrix(c(4,2,-2, 2,10,2, -2,2,5), ncol = 3, nrow = 3)
Q <- chol(x)
Q
# [,1] [,2] [,3]
# [1,] 2 1 -1.000000
# [2,] 0 3 1.000000
# [3,] 0 0 1.732051
我基本上需要找到满足 QQ' = X
的矩阵 Q
。感谢您的帮助!
我们可以使用t()
将生成的上三角转置为下三角:
x <- matrix(c(4,2,-2, 2,10,2, -2,2,5), ncol = 3, nrow = 3)
R <- chol(x) ## upper tri
L <- t(R) ## lower tri
all.equal(crossprod(R), x) ## t(R) %*% R
# [1] TRUE
all.equal(tcrossprod(L), x) ## L %*% t(L)
# [1] TRUE
但是,我想有这样疑问的不只是你一个人。所以我会详细说明这一点。
chol.default
从 R 碱基调用 LAPACK 例程 dpotrf
进行非透视 Cholesky 分解,并调用 LAPACK 例程 dpstrf
进行透视 Cholesky 分解。这两个 LAPACK 例程都允许用户选择是使用上三角还是下三角,但是 R 禁用下三角选项并且仅禁用 returns 上三角。查看源码:
chol.default
#function (x, pivot = FALSE, LINPACK = FALSE, tol = -1, ...)
#{
# if (is.complex(x))
# stop("complex matrices not permitted at present")
# .Internal(La_chol(as.matrix(x), pivot, tol))
#}
#<bytecode: 0xb5694b8>
#<environment: namespace:base>
// from: R_<version>/src/modules/lapack.c
static SEXP La_chol(SEXP A, SEXP pivot, SEXP stol)
{
// ...omitted part...
if(!piv) {
int info;
F77_CALL(dpotrf)("Upper", &m, REAL(ans), &m, &info);
if (info != 0) {
if (info > 0)
error(_("the leading minor of order %d is not positive definite"),
info);
error(_("argument %d of Lapack routine %s had invalid value"),
-info, "dpotrf");
}
} else {
double tol = asReal(stol);
SEXP piv = PROTECT(allocVector(INTSXP, m));
int *ip = INTEGER(piv);
double *work = (double *) R_alloc(2 * (size_t)m, sizeof(double));
int rank, info;
F77_CALL(dpstrf)("U", &m, REAL(ans), &m, ip, &rank, &tol, work, &info);
if (info != 0) {
if (info > 0)
warning(_("the matrix is either rank-deficient or indefinite"));
else
error(_("argument %d of Lapack routine %s had invalid value"),
-info, "dpstrf");
}
// ...omitted part...
return ans;
}
如您所见,它将 "Upper" 或 "U" 传递给 LAPACK。
之所以上三角因子在统计中更常见,是因为我们在最小二乘计算中经常将Cholesky分解与QR分解进行比较,而后者只有return的上三角。要求 chol.default
始终 return 上三角提供代码重用。例如,chol2inv
函数用于查找最小二乘估计的未缩放协方差,我们可以将 chol.default
或 qr.default
的结果提供给它。有关详细信息,请参阅 。
我正在尝试使用 chol()
函数在 R 中获取以下矩阵的下三角 Cholesky 分解。但是,它一直返回上三角分解,我似乎无法找到获得下三角分解的方法,即使在查看了文档之后也是如此。以下是我正在使用的代码 -
x <- matrix(c(4,2,-2, 2,10,2, -2,2,5), ncol = 3, nrow = 3)
Q <- chol(x)
Q
# [,1] [,2] [,3]
# [1,] 2 1 -1.000000
# [2,] 0 3 1.000000
# [3,] 0 0 1.732051
我基本上需要找到满足 QQ' = X
的矩阵 Q
。感谢您的帮助!
我们可以使用t()
将生成的上三角转置为下三角:
x <- matrix(c(4,2,-2, 2,10,2, -2,2,5), ncol = 3, nrow = 3)
R <- chol(x) ## upper tri
L <- t(R) ## lower tri
all.equal(crossprod(R), x) ## t(R) %*% R
# [1] TRUE
all.equal(tcrossprod(L), x) ## L %*% t(L)
# [1] TRUE
但是,我想有这样疑问的不只是你一个人。所以我会详细说明这一点。
chol.default
从 R 碱基调用 LAPACK 例程 dpotrf
进行非透视 Cholesky 分解,并调用 LAPACK 例程 dpstrf
进行透视 Cholesky 分解。这两个 LAPACK 例程都允许用户选择是使用上三角还是下三角,但是 R 禁用下三角选项并且仅禁用 returns 上三角。查看源码:
chol.default
#function (x, pivot = FALSE, LINPACK = FALSE, tol = -1, ...)
#{
# if (is.complex(x))
# stop("complex matrices not permitted at present")
# .Internal(La_chol(as.matrix(x), pivot, tol))
#}
#<bytecode: 0xb5694b8>
#<environment: namespace:base>
// from: R_<version>/src/modules/lapack.c
static SEXP La_chol(SEXP A, SEXP pivot, SEXP stol)
{
// ...omitted part...
if(!piv) {
int info;
F77_CALL(dpotrf)("Upper", &m, REAL(ans), &m, &info);
if (info != 0) {
if (info > 0)
error(_("the leading minor of order %d is not positive definite"),
info);
error(_("argument %d of Lapack routine %s had invalid value"),
-info, "dpotrf");
}
} else {
double tol = asReal(stol);
SEXP piv = PROTECT(allocVector(INTSXP, m));
int *ip = INTEGER(piv);
double *work = (double *) R_alloc(2 * (size_t)m, sizeof(double));
int rank, info;
F77_CALL(dpstrf)("U", &m, REAL(ans), &m, ip, &rank, &tol, work, &info);
if (info != 0) {
if (info > 0)
warning(_("the matrix is either rank-deficient or indefinite"));
else
error(_("argument %d of Lapack routine %s had invalid value"),
-info, "dpstrf");
}
// ...omitted part...
return ans;
}
如您所见,它将 "Upper" 或 "U" 传递给 LAPACK。
之所以上三角因子在统计中更常见,是因为我们在最小二乘计算中经常将Cholesky分解与QR分解进行比较,而后者只有return的上三角。要求 chol.default
始终 return 上三角提供代码重用。例如,chol2inv
函数用于查找最小二乘估计的未缩放协方差,我们可以将 chol.default
或 qr.default
的结果提供给它。有关详细信息,请参阅