Входит ли SVD в MathNet.Numerics x86?

Мне нужно рассчитать разложение по сингулярным значениям плотной матрицы, но, похоже, оно не включено в пакет, который я использую: MathNet.Numerics x86 v2.4.0.26 загруженный из диспетчера пакетов Nuget.

Я ссылаюсь на этот вопрос Svd recomposition..

Синтаксис, включенный в связанный ответ:

 var m = DenseMatrix.OfArray(new double[,] {
   { 3, 0, 0, 0, 0 },
   { 0, 2, 4, 0, 0 },
   { 0, 4, 5, -4, 5 },
   { 0, 0, -4, -8, 12},
   { 0, 0, 5, 12, -5 }});


  var svd = m.Svd(true);  //The method Svd() doesn't seem to be available in v2.4 

  svd.U() * svd.W() * svd.VT()

Также нет svd() в списке документация.

Я ищу простой пример создания SVD DenseMatrix с использованием библиотеки MathNet.Numerics x86.

К сожалению, метод inverse() просто возвращает NaN, поэтому я надеюсь аппроксимировать обратное, используя разложение по сингулярным значениям.


person Felix Castor    schedule 18.02.2014    source источник
comment
Конечно, обычно лучше не формировать обратную матрицу.   -  person David Heffernan    schedule 19.02.2014
comment
@DavidHeffernan Я пытаюсь использовать Ковариационную матрицу и использовать ее в многомерном распределении Гаусса. думал, что нужно найти обратное. Поэтому я аппроксимирую это, используя Moore-Penrose. Есть ли способ лучше?   -  person Felix Castor    schedule 19.02.2014
comment
Обычно лучше не записывать обратную матрицу. Это, как правило, не хватает прочности.   -  person David Heffernan    schedule 19.02.2014
comment
@DavidHeffernan Это едва ли понятно. Что именно ты имеешь ввиду?   -  person Felix Castor    schedule 19.02.2014
comment
Обычно вы хотите найти A ^ -1 * x, а не само A ^ -1, и вы можете найти первое более эффективно, делая это напрямую, чем записывая обратное, а затем предварительно умножая.   -  person David Heffernan    schedule 19.02.2014
comment
johndcook.com/blog/2010/01/19 /не инвертировать-эту-матрицу   -  person David Heffernan    schedule 19.02.2014


Ответы (2)


Из документации я нашел классы для разложения по сингулярным значениям

MathNet.Numerics.LinearAlgebra. Double/Single/Generic .Factorization.Svd — это абстрактные классы.

MathNet.Numerics.LinearAlgebra. Double/Single/Generic .Factorization.DenseSvd — это реализации. Передайте свою матрицу конструктору, результаты доступны через участников.

person Ben Voigt    schedule 18.02.2014
comment
Да, я тоже это нашел, но я не уверен, как это реализовать. Когда я попытался построить объект с ним, не повезло (абстрактный класс), и нет никаких статических методов, кроме equals. - person Felix Castor; 19.02.2014
comment
Хм, похоже, что метод Solve должен быть статическим. Документация не очень хороша, IMO. Вы пробовали класс DenseSvd? У него есть конструктор. - person Ben Voigt; 19.02.2014
comment
Ты понял! это оно. DenseSvd — это именно то, что мне нужно. Добавьте это к своему ответу, и я приму его. Спасибо! - person Felix Castor; 19.02.2014

Svd() раньше был методом расширения в версии 2, который, к сожалению, доступен только при включении правое пространство имен. В вашем случае добавление следующей строки должно помочь:

using MathNet.Numerics.LinearAlgebra.Double;

Это одна из областей, которая была значительно упрощена в грядущей версии v3, где это правильный метод. Я предлагаю вам взглянуть на один из последних пакетов v3 (на момент написания этого, например, v3.0.0-alpha7).

person Christoph Rüegg    schedule 18.02.2014
comment
Мне удалось довольно легко заставить DenseSvd работать, и я попытался добавить это конкретное пространство имен, и это тоже сработало. Спасибо! - person Felix Castor; 19.02.2014