求数学网格矩阵

时间:2015-08-27 18:33:22

标签: c# statistics covariance mathdotnet mathnet

我正在使用MathNet Numerics矩阵并试图找出矩阵的协方差。

我们如何找到矩阵的协方差?

我们有方法在Statistics命名空间下找到两个IEnumerable之间的协方差。

http://numerics.mathdotnet.com/api/MathNet.Numerics.Statistics/Statistics.htm

但我不知道如何使用它来寻找矩阵。

例如:在matlab / octave

enter image description here

C#中的方式相同。我们怎样才能实现?

2 个答案:

答案 0 :(得分:2)

我认为Math.NET中没有任何方法可以模仿Matlab / Octave中的cov函数,但您可以轻松编写自己的函数:

public static Matrix<double> GetCovarianceMatrix(Matrix<double> matrix)
{
    var columnAverages = matrix.ColumnSums() / matrix.RowCount;
    var centeredColumns = matrix.EnumerateColumns().Zip(columnAverages, (col, avg) => col - avg);
    var centered = DenseMatrix.OfColumnVectors(centeredColumns);
    var normalizationFactor = matrix.RowCount == 1 ? 1 : matrix.RowCount - 1;
    return centered.TransposeThisAndMultiply(centered) / normalizationFactor;
}

答案 1 :(得分:0)

您可以使用Accord.Statistics nuget包中的Tools.Covariance()方法。 http://accord-framework.net/docs/html/M_Accord_Statistics_Tools_Covariance.htm
要做这样的事情:

using Accord.Statistics;
public void CalculateMatrixCovariance()
{
    var matrix = new double[,] {
        {3,5},
        {9,10}};

    var covMatrix = matrix.Covariance();

    Console.WriteLine(covMatrix[0,0] + " " + covMatrix[0, 1]);
    Console.WriteLine(covMatrix[1,0] + " " + covMatrix[1, 1]);
}