特征:是否有一种内置的方法来计算样本协方差

时间:2013-02-28 14:56:48

标签: c++ statistics eigen

我在C ++中使用Eigen库:我目前正在计算协方差矩阵,如下所示:

Eigen::MatrixXd covariance_matrix = Eigen::MatrixXd::Constant(21, 21, 0);
data mean = calc_mean(all_data)
for(int j = 0; j < 21; j++){
    for(int k = 0; k < 21; k++){
        for(std::vector<data>::iterator it = all_data.begin(); it!= all_data.end(); it++){
            covariance_matrix(j,k) += ((*it)[j] - mean[j]) * ((*it)[k] - mean[k]);
        }
        covariance_matrix(j,k) /= all_data.size() - 1;
    }
}

是否有内置/更优化的方法来使用Eigen库?例如,如果我将数据存储在MatrixXd中,其中每行是一个观察点,每列都是一个要素?

由于

2 个答案:

答案 0 :(得分:50)

使用Eigen表达式将利用SIMD和缓存优化算法,所以是的,它肯定会更快,无论如何,编写起来要简单得多:

MatrixXd centered = mat.rowwise() - mat.colwise().mean();
MatrixXd cov = (centered.adjoint() * centered) / double(mat.rows() - 1);

此外,假设“data”是double [21]的typedef,那么你可以使用Map&lt;&gt;将std :: vector视为特征对象的功能:

Map<Matrix<double,Dynamic,21,RowMajor> > mat(&(all_data[0][0], all_data.size(), 21);

答案 1 :(得分:7)

当每一行都是观察时,您可以使用维基百科(http://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance#Sample_covariance

上显示的样本协方差矩阵的矩阵公式

Sample covariance, source: wikipedia article linked above

这对于特征矩阵乘法等来说相当容易写。对我而言,它是否会更加高效并不明显,我怀疑优化器必须做得非常好(确保至少使用 - O2)。可能值得尝试和分析它。