来自 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 的内容都在我头顶上方两层楼左右,因此您可能需要以基本的方式拼写出来。
根本问题是我在多个数据集上运行这个例程
我需要一些有关内部噪声和方差的数据质量指示。
谢谢!
我假设您要计算最小二乘拟合的 R² 系数。
线性最小二乘
首先,让我们回顾一下您正在做的事情。在你的 Dsolution
向量中有两个系数(我们称它们为 a
和 b
,它们是你的 x
和 [=15= 之间的仿射模型的估计参数])。这意味着对于每个 x[i]
,您的模型对相应 y[i]
的估计是 estimated_y[i] = a * x[i] + b
。
a
和b
是通过最小化观测值y[i]
与其估计值a*x[i] + b
之差的平方和来计算的,也称为残差。事实证明,你可以通过解决一个线性问题来简单地做到这一点,这就是为什么你使用 Eigen 的 solve()
来找到它们。
计算 R²
现在我们要计算 R²,它是您适合度“好”程度的指标。
如果我们遵循上面链接的维基百科的定义,要计算 R²,您需要:
- 计算观测值的平均值
y_avg
- 计算总平方和,即观察值与其平均值之间的平方差之和(这类似于方差,但您不除以数字样品)
- 通过对每个
y
的预测值和观察值之间的差异平方求和来计算 残差平方和总和
那么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
,然后计算与观测值的差值,使用平方范数计算差平方和。
我有一些 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 的内容都在我头顶上方两层楼左右,因此您可能需要以基本的方式拼写出来。
根本问题是我在多个数据集上运行这个例程 我需要一些有关内部噪声和方差的数据质量指示。
谢谢!
我假设您要计算最小二乘拟合的 R² 系数。
线性最小二乘
首先,让我们回顾一下您正在做的事情。在你的 Dsolution
向量中有两个系数(我们称它们为 a
和 b
,它们是你的 x
和 [=15= 之间的仿射模型的估计参数])。这意味着对于每个 x[i]
,您的模型对相应 y[i]
的估计是 estimated_y[i] = a * x[i] + b
。
a
和b
是通过最小化观测值y[i]
与其估计值a*x[i] + b
之差的平方和来计算的,也称为残差。事实证明,你可以通过解决一个线性问题来简单地做到这一点,这就是为什么你使用 Eigen 的 solve()
来找到它们。
计算 R²
现在我们要计算 R²,它是您适合度“好”程度的指标。
如果我们遵循上面链接的维基百科的定义,要计算 R²,您需要:
- 计算观测值的平均值
y_avg
- 计算总平方和,即观察值与其平均值之间的平方差之和(这类似于方差,但您不除以数字样品)
- 通过对每个
y
的预测值和观察值之间的差异平方求和来计算 残差平方和总和
那么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
,然后计算与观测值的差值,使用平方范数计算差平方和。