征:有没有计算样本协方差一个内置的方式(Eigen: Is there an inbuilt way

2019-07-20 17:15发布

我正在使用C ++的本征库:我目前计算的协方差矩阵自己如下:

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;
    }
}

是否有一个内置/更优化的方式与本征库做到这一点? 例如,如果我保存在我的数据MatrixXd其中每行是一个观察和每一列的特征?

谢谢

Answer 1:

当每一行是一个观测值,则可以使用用于样本协方差矩阵的基质制剂上维基百科如图所示( http://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance#Sample_covariance )

这是相当容易的特征矩阵乘法等方面来写它是否会是更好的性能并不明显对我来说,我怀疑优化器会做一个很好的工作(一定要使用至少-02)。 这可能是值得尝试和分析它。



Answer 2:

使用本征表达式将利用SIMD和缓存优化的算法,所以是应该肯定会更快,而且在任何情况下,更简单的写:

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

此外,假定“数据”为双[21]一个typedef,然后可以使用地图<>功能来查看的std ::向量作为本征对象:

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


文章来源: Eigen: Is there an inbuilt way to calculate sample covariance