MathNet Numerics-多项式拟合,求拟合结果的R^2值

在MathNet.Numerics中,可以使用GoodnessOfFit.RSquared方法来计算多项式拟合的R值。该方法需要传入两个参数,分别是原始的Y点和使用拟合出来的线计算的Y点(即Ytest)。R值越接近1,说明拟合出来的曲线跟原曲线就越接近。下面是一个示例代码:

double[] Y = { 1, 2, 3, 4, 5 }; 
double[] X = { 1, 2, 3, 4, 5 }; 
double[] coefficients = Fit.Polynomial(X, Y, 2);
double[] Ytest = new double[Y.Length]; 
for (int i = 0; i < Y.Length; i++) 
{ 
Ytest[i] = Polynomial.Evaluate(X[i], coefficients); 
} 
double RSquared = GoodnessOfFit.RSquared(Y, Ytest);
————————————————
版权声明:本文为CSDN博主「Little tortoise」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43786608/article/details/134016747

其中,Fit.Polynomial方法用于进行多项式拟合,第一个参数是X点,第二个参数是Y点,第三个参数是多项式的次数。Polynomial.Evaluate方法用于计算拟合出来的线在某个X点的Y值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C#中解曲线拟合相关系数R^2可以使用以下步骤: 1. 定义数据点的X和Y数组:假设我们有n个数据点,可以定义两个数组x和y来存储它们的。 ```csharp double[] x = {1, 2, 3, 4, 5}; double[] y = {1.5, 2.5, 3.5, 4.5, 5.5}; ``` 2. 使用Polyfit函数拟合数据点:Polyfit函数可以用于拟合数据点的多项式函数。在C#中,可以使用MathNet.Numerics库中的Polyfit函数来实现。该函数返回一个多项式系数数组,该系数可以用于计算拟合函数的。 ```csharp using MathNet.Numerics.LinearRegression; double[] coefficients = Fit.Polynomial(x, y, degree); ``` 其中,degree表示拟合多项式的次数。 3. 计算R^2:R^2表示拟合函数与原始数据点之间的相关性。可以使用以下公式计算R^2: ```csharp double[] yFit = new double[x.Length]; for (int i = 0; i < x.Length; i++) { // 计算拟合函数的 yFit[i] = coefficients.Select((c, j) => c * Math.Pow(x[i], j)).Sum(); } double yMean = y.Sum() / y.Length; double ssTotal = y.Select(yi => Math.Pow(yi - yMean, 2)).Sum(); double ssResidual = y.Select((yi, i) => Math.Pow(yi - yFit[i], 2)).Sum(); double rSquared = 1 - (ssResidual / ssTotal); ``` 在上述代码中,我们首先计算拟合函数的yFit数组。然后,我们计算原始数据点的平均yMean、总平方和ssTotal和残差平方和ssResidual。最后,我们使用R^2公式计算R^2。 完整的代码如下: ```csharp using MathNet.Numerics.LinearRegression; double[] x = {1, 2, 3, 4, 5}; double[] y = {1.5, 2.5, 3.5, 4.5, 5.5}; int degree = 2; double[] coefficients = Fit.Polynomial(x, y, degree); double[] yFit = new double[x.Length]; for (int i = 0; i < x.Length; i++) { yFit[i] = coefficients.Select((c, j) => c * Math.Pow(x[i], j)).Sum(); } double yMean = y.Sum() / y.Length; double ssTotal = y.Select(yi => Math.Pow(yi - yMean, 2)).Sum(); double ssResidual = y.Select((yi, i) => Math.Pow(yi - yFit[i], 2)).Sum(); double rSquared = 1 - (ssResidual / ssTotal); Console.WriteLine("R^2 = " + rSquared); ``` 输出结果为: ``` R^2 = 0.9642857142857143 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值