首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稀疏矩阵的单值分解

稀疏矩阵的单值分解
EN

Stack Overflow用户
提问于 2016-12-08 07:46:55
回答 1查看 235关注 0票数 1

我有一个比较大的矩阵,我想要计算单值分解。不幸的是,使用core.matrix的直接core.matrix函数(使用:vectorz实现)会导致内存不足的异常--我的机器对于开发机器的内存相对较少(8GB,Java堆空间设置为最大5GB)。

矩阵具有维数[422, 23069],且相对稀疏(~1.74%的值为非零),因此我的下一次尝试是将矩阵转换为sparse-matrix

代码语言:javascript
复制
(def sparse-fs (matrix/sparse-matrix fs))

令人惊讶的是,这在ArrayOutOfBoundsException代码中失败了。我可以通过首先创建一个稀疏矩阵,然后设置非零值来解决这个问题:

代码语言:javascript
复制
user> (def sparse-fs (matrix/sparse-matrix [422 23069]))
#'user/sfs
user> (count
        (map-indexed
          (fn [row line]
           (map-indexed
            (fn [col val]
              (when (not (= val 0.0))
                (matrix/mset! sparse-fs row col val)))))
        fs))
422

但是,在这个稀疏矩阵上调用linear/svd也失败了,因为svd的协议显然没有实现:

代码语言:javascript
复制
user> (def svd-fs (linear/svd sparse-fs))
CompilerException java.lang.IllegalArgumentException: No implementation of method: :svd of protocol: 
#'clojure.core.matrix.protocols/PSVDDecomposition found for class: mikera.vectorz.Vector2, 

我目前没有关于如何从这里取得进展的想法,我希望能有任何关于如何将我的矩阵(和svd计算)放入我相对较小的内存的输入。

更新:协议问题来自于我仍然试图使用clojure.core.matrix/sparse-matrix,这显然是我不明白的用途。相反,我可以使用new-sparse-array来生成一个实现AMatrix的实例,该实例实现了分解协议:

代码语言:javascript
复制
user> (def foo-sparse (matrix/sparse-matrix [422 23069]))
#'user/foo-sparse
user> (type foo-sparse)
mikera.vectorz.Vector2
user> (matrix/dimensionality foo-sparse)
1
user> (def foo-sparse (matrix/new-sparse-array [422 23069]))
#'user/foo-sparse
user> (matrix/dimensionality foo-sparse)
2
user> (type foo-sparse)
mikera.matrixx.impl.SparseRowMatrix

不幸的是,当我在这个矩阵上调用linear/svd时,我又回到了内存不足的错误:

代码语言:javascript
复制
1. Caused by java.lang.OutOfMemoryError
   Java heap space

         DoubleArrays.java:  724  mikera.vectorz.util.DoubleArrays/createStorage
               Matrix.java:   45  mikera.matrixx.Matrix/<init>
               Matrix.java:   56  mikera.matrixx.Matrix/create
               Matrix.java:  653  mikera.matrixx.Matrix/createIdentity
        BidiagonalRow.java:  174  mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/handleU
        BidiagonalRow.java:  155  mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/getU
        BidiagonalRow.java:  115  mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/_decompose
        BidiagonalRow.java:   78  mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/decompose
           Bidiagonal.java:   21  mikera.matrixx.decompose.Bidiagonal/decompose
        SvdImplicitQr.java:  177  mikera.matrixx.decompose.impl.svd.SvdImplicitQr/bidiagonalization
        SvdImplicitQr.java:  154  mikera.matrixx.decompose.impl.svd.SvdImplicitQr/_decompose
        SvdImplicitQr.java:   89  mikera.matrixx.decompose.impl.svd.SvdImplicitQr/decompose
                  SVD.java:   31  mikera.matrixx.decompose.SVD/decompose
            matrix_api.clj:  334  mikera.vectorz.matrix-api/eval26238/fn
            protocols.cljc: 1150  clojure.core.matrix.protocols$eval21076$fn__21077$G__21067__21084/invoke
               linear.cljc:  105  clojure.core.matrix.linear$svd/invoke

我怀疑这可能与vectorz 问题18稀疏矩阵上的运算不会产生稀疏结果有关。

有其他选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-06 16:35:33

我可以通过使用svd实现来解决:clatrix计算中的内存问题。Clatrix不支持稀疏矩阵,但似乎在svd计算中使用的内存较少。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41034312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档