- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含数万行和数万列的方阵,除了大量的 0
之外,只有几个 1
,所以我使用 Matrix
包以有效的方式将其存储在 R 中。 base::matrix
对象无法处理那么多的单元格,因为我的内存不足。
我的问题是我需要此类矩阵的逆以及Moore-Penrose广义逆,但我目前无法计算它们。
我尝试过的:
solve
产生 LU.dgC(a) 中的错误:cs_lu(A) 失败:接近奇异 A(或内存不足)
错误MASS::ginv
与 Matrix
类不兼容矩阵
转换为例如bigmemory::big.matrix
,而后者无论如何都不能与 MASS::ginv
一起使用如果我尝试计算矩阵的 Choleski 分解,以便稍后调用 Matrix::chol2inv
,我会收到以下错误消息:
Error in .local(x, ...) :
internal_chm_factor: Cholesky factorization failed
In addition: Warning message:
In .local(x, ...) :
Cholmod warning 'not positive definite' at file ../Cholesky/t_cholmod_rowfac.c, line 431
基于related question ,我还尝试了单个节点上的 pbdDMAT
包,但是 pbdDMAT::chol
在文件 .. 处产生了 Cholmod 错误“内存不足”。/Core/cholmod_memory.c,第 147 行
错误消息
简而言之,问题:除了使用 matrix
类之外,还有什么方法可以计算这种稀疏矩阵的逆矩阵和 Moore-Penrose 广义逆矩阵吗?拥有大量 RAM 的计算机?
快速可重现的示例:
library(Matrix)
n <- 1e5
m <- sparseMatrix(1:n, 1:n, x = 1)
m <- do.call(rBind, lapply(1:10, function(i) {
set.seed(i)
m[-sample(1:n, n/3), ]
}))
m <- t(m) %*% m
一些描述(感谢 Gabor Grothendieck):
> dim(m)
[1] 100000 100000
> sum(m) / prod(dim(m))
[1] 6.6667e-05
> table(rowSums(m))
0 1 2 3 4 5 6 7 8 9 10
5 28 320 1622 5721 13563 22779 26011 19574 8676 1701
> table(colSums(m))
0 1 2 3 4 5 6 7 8 9 10
5 28 320 1622 5721 13563 22779 26011 19574 8676 1701
以及一些错误消息:
> Matrix::solve(m)
Error in LU.dgC(a) : cs_lu(A) failed: near-singular A (or out of memory)
> base::solve(m)
Error in asMethod(object) :
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
> MASS::ginv(m)
Error in MASS::ginv(m) : 'X' must be a numeric or complex matrix
赏金的目标是找到一种方法,用小于 8Gb 的 RAM 计算 m
的 Moore-Penrose 广义逆(速度和性能并不重要) )。
最佳答案
如果你的 1 很少,那么你的矩阵在任何列和任何行中都可能不超过一个 1,在这种情况下,广义逆等于转置:
library(Matrix)
set.seed(123)
n <- 1e5
m <- sparseMatrix(sample(1:n, n/10), sample(1:n, n/10), x = 1, dims = c(n, n))
##############################################################################
# confirm that m has no more than one 1 in each row and column
##############################################################################
table(rowSums(m)) # here 90,000 rows are all zero, 10,000 have a single one
## 0 1
## 90000 10000
table(colSums(m)) # here 90,000 cols are all zero, 10,000 have a single one
## 0 1
## 90000 10000
##############################################################################
# calculate generalized inverse
##############################################################################
minv <- t(m)
##############################################################################
# check that when multiplied by minv it gives a diagonal matrix of 0's and 1's
##############################################################################
mm <- m %*% minv
table(diag(mm)) # diagonal has 90,000 zeros and 10,000 ones
## 0 1
## 90000 10000
diag(mm) <- 0
range(mm) # off diagonals are all zero
## [1] 0 0
修订改进了演示。
关于r - 大稀疏矩阵的 Moore-Penrose 广义逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825511/
这是我感兴趣的测试: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35h3.htm 如何将这段代码改编成接受数值向量并返回指定要删除
我使用 TensorFlow 1.12 基于 Material 进行语义(图像)分割。使用多项式交叉熵损失函数,这会产生不错的结果,尤其是考虑到我使用的训练数据量稀疏,mIoU 为 0.44: 然而,
AFAIK,在 Hindley-Milner 类型系统中使用的统一可以通过在构造函数位置允许类型变量并在这种情况下放宽 arity 约束来推广以统一更高级的类型: f a ~ T a1 b1 f ~
在阅读 article 时在 Javascript 中实现通用 curry 时,我偶然发现了这段代码。 function curry(fn) { return (...xs) => { i
我想使用 C++14 中引入的广义 lambda 捕获(有关解释,请参阅 Move capture in lambda)。但是,我的代码的其余部分是 C++11 友好的。我想按照以下方式做一些事情 #
我正在尝试实现 this paper 中介绍的广义 Hough 变换在 MATLAB 中。我也试过使用 this document理解算法。我一直在研究如何计算梯度角以找到要在 R 表中使用的 Φ。
假设我们有这样一段代码: std::vector> tasks; 然后我们添加这样的任务: tasks.push_back([]() { // ... } 这行得通。但现在我们要添加该任务:
问题:为什么会打印出以下内容: ChildB___Parent of ChildB ChildB___Parent of ChildB 而不是我认为它应该打印出来的: ChildA___Parent
W3C 推荐 RDF 1.1 概念和抽象语法 defines多么广义 RDF 三元组 是(即,一个非标准三元组,其中每个主语/谓语/宾语都可以是 IRI/bnode/文字)。 关于它的可能用途,它给出
我是一名优秀的程序员,十分优秀!