Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 稀疏矩阵的单值分解_Matrix_Clojure_Svd - Fatal编程技术网

Matrix 稀疏矩阵的单值分解

Matrix 稀疏矩阵的单值分解,matrix,clojure,svd,Matrix,Clojure,Svd,我有一个比较大的矩阵,我想计算它的单值分解。使用core.matrix的直接linear/svd函数(使用:vectorz实现)不幸地导致了内存不足异常——我的机器对于开发机器的内存相对较少(8GB,Java堆空间设置为最大5GB) 矩阵的维数为[422,23069],并且相对稀疏(约1.74%的值为非零),因此我下一次尝试是将矩阵转换为稀疏矩阵: (def sparse-fs (matrix/sparse-matrix fs)) Java代码中的ArrayOutOfBoundsExcepti

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

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

(def sparse-fs (matrix/sparse-matrix fs))
Java代码中的
ArrayOutOfBoundsException
,这一点出人意料地失败了。我可以通过先创建稀疏矩阵,然后设置非零值来解决此问题:

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协议显然没有实现:

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, 
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
我目前对如何从这里取得进展没有任何想法,如果有任何关于如何将我的矩阵(和svd计算)放入我相对较小的内存的输入,我将不胜感激

更新: 协议问题来自于我仍然试图使用
clojure.core.matrix/sparse-matrix
,我显然不理解它的用途。相反,我可以使用
新稀疏数组
,该数组生成一个实现
AMatrix
的实例,并为其实现分解协议:

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, 
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
时,我又回到了内存不足错误:

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
1。由java.lang.OutOfMemoryError引起
Java堆空间
DoubleArrays.java:724 mikera.vectorz.util.DoubleArrays/createStorage
Matrix.java:45 mikera.matrixx.Matrix/
Matrix.java:56 mikera.matrixx.Matrix/create
Matrix.java:653 mikera.matrixx.Matrix/createIdentity
java:174 mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/handleU
java:155 mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow/getU
BidiagonalRow.java:115 mikera.matrixx.decompose.impl.bidiagonal.BidiagonalRow//u decompose
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//u 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 clj有关


有其他选择吗?

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

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

您可以尝试使用“Colt”代替吗?我知道这不是你想要的,但是他们有稀疏矩阵支持和SVD实现。你能试着用“柯尔特”来代替吗?我知道这不是你想要的,但是他们有稀疏矩阵支持和SVD实现。