I want to use singular value decomposition on large sparse matrices (18,000 x 8,000) and while the built-in LinearAlgebra function does the trick, it does not operate on the SparseMatrix type. My current solution is just converting it into a dense matrix and then calling the function, but as expected, it takes a long time.
Is there an existing package or option to use SVD with a sparse matrix or maybe only get the Kth largest Uk Sk V’k from an input?
Thanks in advance!
You could use PROPACK.jl, it works if A
is a SparseMatrixCSC or a linear operator.
1 Like
I’m not sure it provides a function to compute the SVD, however you may want to check SuiteSparse.
I downloaded the package and did the setup but I’m getting this strange error below. Not really sure why since I’m following the documentation steps.
(TextHW2) julia> train_mat.dtm |> typeof
SparseArrays.SparseMatrixCSC{Int64, Int64}
(TextHW2) julia> train_mat.dtm |> size
(18000, 7666)
(TextHW2) julia> tsvd(train_mat.dtm; k = 1)
ERROR: MethodError: no method matching eps(::Int64)
Closest candidates are:
eps() at float.jl:831
eps(::AbstractFloat) at float.jl:827
eps(::T) where T<:Dates.TimeType at C:\Users\aledo\.julia\juliaup\julia-1.8.1+0.x64\share\julia\stdlib\v1.8\Dates\src\types.jl:444
...
Stacktrace:
[1] tsvd(A::SparseArrays.SparseMatrixCSC{Int64, Int64}; kwargs::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:k,), Tuple{Int64}}})
@ PROPACK C:\Users\aledo\.julia\packages\PROPACK\0cIiC\src\PROPACK.jl:216
[2] top-level scope
@ REPL[102]:1
(TextHW2) julia>
Your matrix has an integer data type. I don’t think SuiteSparse is capable of handling that.
1 Like
Should I convert its contents to floats (eg 1 → 1.0) then?
That did the trick, thank you!