Math.Net C# 的多项式阶数 3-5
Polynomial order 3-5 with Math.Net C#
我有 X 和 Y 的数组。使用 Excel 我能够获得 3-5 阶的某些多项式拟合。我决定编写一个代码,如果 GoodnessOfFit.RSquared(New)/GoodnessOfFit.RSquared(Previous)< 1.05
将 select 匹配的最低阶,然后我停止 select 选择 Previous
模型的订单。
令我惊讶的是 R^2 从 2 阶下降到 3 阶(R^2 = 0.35 vs R^2 = 0.21)。检查系数并将数据绘制到相同的 excel 文件中。很惊讶如何脱线。检查 "RosettaCode" polyfit 的解决方案,也看不到结果甚至接近 Excel 预测的结果。
有解决问题的方法吗?
示例数据集:
double[] Y = new double[] { 0.1599, 0.1585, 0.1499, 0.1506, 0.1494, 0.1494, 0.1494, 0.1494, 0.1619, 0.1619, 0.1604, 0.1604, 0.1479, 0.1479, 0.1604, 0.1738, 0.1623, 0.1553, 0.1431, 0.126, 0.1259, 0.1259, 0.1254, 0.1436 };
double[] X = new double[] { 1495981908, 1495983810, 1495985705, 1495987307, 1495987689, 1495988066, 1495988452, 1495988820, 1495989206, 1495989589, 1495989972, 1495990357, 1495990747, 1495991122, 1495991499, 1495991876, 1495992255, 1495992629, 1495993009, 1495993378, 1495993758, 1495994134, 1495994533, 1495994913 };
已解决。 Math.Net 很好地计算系数,但是在我的例子中,X 应该从 UnixTimeStamp 转换为更小的数字,例如:
_Min = X.Min();
_X = new double[X.Length];
for (int i = 0; i < X.Length; i++)
_X[i] = X[i] - _Min;
我有 X 和 Y 的数组。使用 Excel 我能够获得 3-5 阶的某些多项式拟合。我决定编写一个代码,如果 GoodnessOfFit.RSquared(New)/GoodnessOfFit.RSquared(Previous)< 1.05
将 select 匹配的最低阶,然后我停止 select 选择 Previous
模型的订单。
令我惊讶的是 R^2 从 2 阶下降到 3 阶(R^2 = 0.35 vs R^2 = 0.21)。检查系数并将数据绘制到相同的 excel 文件中。很惊讶如何脱线。检查 "RosettaCode" polyfit 的解决方案,也看不到结果甚至接近 Excel 预测的结果。
有解决问题的方法吗?
示例数据集:
double[] Y = new double[] { 0.1599, 0.1585, 0.1499, 0.1506, 0.1494, 0.1494, 0.1494, 0.1494, 0.1619, 0.1619, 0.1604, 0.1604, 0.1479, 0.1479, 0.1604, 0.1738, 0.1623, 0.1553, 0.1431, 0.126, 0.1259, 0.1259, 0.1254, 0.1436 };
double[] X = new double[] { 1495981908, 1495983810, 1495985705, 1495987307, 1495987689, 1495988066, 1495988452, 1495988820, 1495989206, 1495989589, 1495989972, 1495990357, 1495990747, 1495991122, 1495991499, 1495991876, 1495992255, 1495992629, 1495993009, 1495993378, 1495993758, 1495994134, 1495994533, 1495994913 };
已解决。 Math.Net 很好地计算系数,但是在我的例子中,X 应该从 UnixTimeStamp 转换为更小的数字,例如:
_Min = X.Min();
_X = new double[X.Length];
for (int i = 0; i < X.Length; i++)
_X[i] = X[i] - _Min;