来自 colPivHouseholderQr().solve 的拟合相关性

correlation of a fit from colPivHouseholderQr().solve

我有一些 C++ 代码正在获取一堆 X、Y 值并执行 线性拟合

Eigen::Matrix<float, Eigen::Dynamic, 2> DX;
Eigen::Matrix<float, Eigen::Dynamic, 1> DY;

For 遍历数据值(稍作编辑,因为我的数据源 比简单数组复杂一点):

{
    DX(i,0) = x[i];
    DX(i,1) = 1;
    DY(i,0) = y[i];
}

然后

Eigen::Vector2f Dsolution = DX.colPivHouseholderQr().solve(DY);

// linear solution  is in Dsolution[0] and Dsolution[1]

我需要那个计算的相关系数。 如何获得?

大多数 Eigen 的内容都在我头顶上方两层楼左右,因此您可能需要以基本的方式拼写出来。

根本问题是我在多个数据集上运行这个例程 我需要一些有关内部噪声和方差的数据质量指示。

谢谢!

我假设您要计算最小二乘拟合的 系数。

线性最小二乘

首先,让我们回顾一下您正在做的事情。在你的 Dsolution 向量中有两个系数(我们称它们为 ab,它们是你的 x 和 [=15= 之间的仿射模型的估计参数])。这意味着对于每个 x[i],您的模型对相应 y[i] 的估计是 estimated_y[i] = a * x[i] + b

ab是通过最小化观测值y[i]与其估计值a*x[i] + b之差的平方和来计算的,也称为残差。事实证明,你可以通过解决一个线性问题来简单地做到这一点,这就是为什么你使用 Eigen 的 solve() 来找到它们。

计算 R²

现在我们要计算 R²,它是您适合度“好”程度的指标。

如果我们遵循上面链接的维基百科的定义,要计算 R²,您需要:

  1. 计算观测值的平均值y_avg
  2. 计算总平方和,即观察值与其平均值之间的平方差之和(这类似于方差,但您不除以数字样品)
  3. 通过对每个 y
  4. 的预测值和观察值之间的差异平方求和来计算 残差平方和总和

那么R²就是1 - (sum_residuals_squares / sum_squares)

本征码

让我们看看如何使用 Eigen 做到这一点:

float r_squared(const MatrixX2f& DX, const VectorXf& DY, const Vector2f& model)
{
    // Compute average
    const float y_avg = DY.mean();

    // Compute total sum of squares
    const int N = DX.rows();
    const float sum_squares = (DY - (y_avg * VectorXf::Ones(N))).squaredNorm();

    // Compute predicted values
    const VectorXf estimated_DY = DX * model;

    // Compute sum of residual squared
    const float sum_residuals_square = (DY - estimated_DY).squaredNorm();

    return 1 - (sum_residuals_square / sum_squares);

}

两个平方和表达式中使用的技巧是使用 平方范数 函数,因为向量的平方范数是其分量的平方和。我们做了两次,因为我们有两个平方和要计算。

在第一种情况下,我们创建了一个大小为 N 的向量,其中充满了我们乘以 y_avg 的向量,得到一个元素全部为 y_avg 的向量。然后 DY 的每个元素减去该向量将是 y[i] - y_avg,我们计算平方范数以获得总平方和。

在第二种情况下,我们首先使用您的线性模型计算预测的 y,然后计算与观测值的差值,使用平方范数计算差平方和。