矩阵必须是正定的(Math.Net C#库)

时间:2017-11-04 20:46:36

标签: c# statistics mathnet

我在使用C#的Math.Net数字库时遇到了一个奇怪的问题。我的代码直到最近一直工作得很好(据我所知,没有任何改变)但我现在从它试图计算多元回归的行的标题中得到错误消息。

每个列表都有493个双值,所以有谁知道我可以做些什么来解决这些问题?

        ...
        cmp     byte [cs:escpressed], 1
        ...

3 个答案:

答案 0 :(得分:0)

“矩阵不正定”可能意味着您的独立方程少于n个,这反过来意味着您没有n个独立数据,这可能意味着您的数据在某种程度上存在缺陷(例如,它们被错误地读取)而且它们实际上都是相同或类似的东西。)

也许您可以编辑问题以显示您正在使用的数据。也许你开始时的数据少于n个。

答案 1 :(得分:0)

只需为那些像我这样就从您的学校时代起就不记得线性代数或高级统计信息的人添加解决方案即可。

  1. 如果还没有,请在Excel中应用“ Analysis ToolPak”加载项
  2. 将自变量和因变量粘贴到工作表中
  3. 转到数据->数据分析->回归
  4. 提供所需范围并进行回归
  5. 在回归结果中,您会发现一个或多个p值或t-stats返回div / 0或NUM错误。
  6. 从对MathNet回归的调用中删除这些自变量,然后再次运行。

这应该解决它。

然后我继续添加一个迭代的try和catch,它将根据特定情况删除自变量,然后再次运行。

IHTH

答案 2 :(得分:-1)

我通过快速切换不同的方程来解决这个问题,看看哪一个返回了正确的答案,并没有抛出这个异常。以下是我对这个问题的解决方案,希望能帮助其他人。

public Vector<double> CalculateWithQR(Matrix<double> x, Vector<double> y)
    {
        Vector<double> result = null;

        try
        {
            result = MultipleRegression.QR(x, y);

            // check for NaN and infinity
            for (int i = 0; i < result.Count; i++)
            {
                var value = result.ElementAt(i);

                if (Double.IsNaN(value) || Double.IsInfinity(value))
                {
                    return null;
                }
            }
        }
        catch (Exception ex)
        {
        }

        return result;
    }

    public Vector<double> CalculateWithNormal(Matrix<double> x, Vector<double> y)
    {
        Vector<double> result = null;

        try
        {
            result = MultipleRegression.NormalEquations(x, y);

            // check for NaN and infinity
            for (int i = 0; i < result.Count; i++)
            {
                var value = result.ElementAt(i);

                if (Double.IsNaN(value) || Double.IsInfinity(value))
                {
                    return null;
                }
            }
        }
        catch (Exception ex)
        {
        }

        return result;
    }

    public Vector<double> CalculateWithSVD(Matrix<double> x, Vector<double> y)
    {
        Vector<double> result = null;

        try
        {
            result = MultipleRegression.Svd(x, y);

            // check for NaN and infinity
            for (int i = 0; i < result.Count; i++)
            {
                var value = result.ElementAt(i);

                if (Double.IsNaN(value) || Double.IsInfinity(value))
                {
                    return null;
                }
            }
        }
        catch (Exception ex)
        {
        }

        return result;
    }

    public Vector<double> FindBestMRSolution(Matrix<double> x, Vector<double> y)
    {
        Vector<double> result = null;

        try
        {
            result = CalculateWithNormal(x, y);

            if (result != null)
            {
                return result;
            }
            else
            {
                result = CalculateWithSVD(x, y);

                if (result != null)
                {
                    return result;
                }
                else
                {
                    result = CalculateWithQR(x, y);

                    if (result != null)
                    {
                        return result;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }

        return result;
    }