【问题标题】:Mathnet errors when trying to solve a multiple regression equation尝试求解多元回归方程时出现 Mathnet 错误
【发布时间】:2015-03-09 10:24:21
【问题描述】:

我有以下代码,我正在尝试使用 2 种不同的方法来求解多元回归方程。数组太长而无法列出,但每个数组的计数都匹配 5704 行。当我尝试运行代码时出现以下错误

// 在 MathNet.Numerics.dll 中发生“System.ArgumentException”类型的未处理异常

附加信息:矩阵必须是正定的。

double[] p = Fit.MultiDim(
                new[] { shortRatingList.ToArray(), mediumRatingList.ToArray(), longRatingList.ToArray() },
                weekReturnList.ToArray(),
                intercept: true);

// 在 MathNet.Numerics.dll 中发生“System.ArgumentException”类型的未处理异常

附加信息:矩阵尺寸必须一致:3x5705。

                double[] q = MultipleRegression.QR(
                new[] { shortRatingList.ToArray(), mediumRatingList.ToArray(), longRatingList.ToArray() },
                weekReturnList.ToArray(),
                intercept: true);

【问题讨论】:

  • @MitchWheat 我在这个网站上发帖是因为我不知道如何解决这些异常

标签: c# math math.net mathnet-numerics


【解决方案1】:

问题中的代码 sn-p 使用 3 个样本点(每个样本点有 5704 个值)计算回归,因此它期望 weekReturnList 的长度为 3。

但是,如果 weekReturnList 的长度也为 5704,并且您的数据实际上代表 5704 个数据点,每个数据点有 3 个值(短、中、长),那么您需要转置输入。

我假设按列而不是数据点组织数据在实践中很常见,因此我们应该考虑在Fit 类中为这个用例添加一个快捷功能。

与此同时,您可以使用以下方法,通过从列数组而不是行数组创建设计矩阵来转置输入:

MultipleRegression.NormalEquations(
    Matrix<double>.Build.DenseOfColumnArrays(shortRatingList, mediumRatingList, longRatingList),
    Vector<double>.Build.Dense(weekReturnList));

【讨论】:

  • 这会为每个样本点生成系数吗?我认为我正确使用了该术语
  • 这将找到使 5704 个数据样本的误差最小化的 3 个系数,例如 p1*short + p2*medium + p3*long ~= weekReturn。这有任何意义吗?你实际上并没有指定你想要回归的模型;)
  • 刚刚注意到您要求提供截距项(因此需要 4 个系数)。使用该函数执行此操作的最简单方法是首先插入一个全一个向量(例如Generate.Repeat(5704, 1.0)),然后再插入其他 3 个。
  • 我在一个学校项目中使用多元回归,老实说,我几乎不知道它是什么以及如何去做。我对线性回归要好得多。实际上,由于我看到的示例,我在那里只有拦截术语。我的项目应该做的是根据不同的数据提出 3 种不同的方法来对股票进行评分,然后尝试得出预期回报。我希望我能清楚地看到
  • 看来我们走对了,expectedWeekReturn = p1*shortRating + p2*mediumRating + p3*longRating 其中 p 参数是 NormalEquations 函数返回的 3 个结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2011-04-19
相关资源
最近更新 更多