首页 > 解决方案 > 在c ++中是否有类似python的“corr”之类的函数来查找列的成对相关性?在使用 Armadillo/Mlpack 时?

问题描述

我需要获取此代码(Python)


corr = X.corr()

进入 C++,其中 X 是一个巨大的数据集,在我的情况下超过 10x10,接近 450x30。所以有很多列来计算相关性。我正在使用 C++ 和 Armadillo/Mlpack。

我在 stackoverflow 上找到了另一个解决方案,有人推荐使用

arma::vec result = arma::conv(a, arma::reverse(a));

因为这应该与 MATLAB 中的 xcorr 相同,本质上与此相同? https://numpy.org/doc/stable/reference/generated/numpy.correlate.html

但我需要这个:https ://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html

对于数据中的每个#i & #i+1 列,是否可以选择在循环中运行“xcorr”解决方案?

或者有没有更好的方法在 C++ 中使用与“.corr”相同的内容?

提前致谢。

标签: pythonc++pandascorrelation

解决方案


我倾向于使用 R 中的犰狳,因此它被包装在 R 上下文中,尽管简单的示例函数是纯 C++。正如文档将告诉您的那样,“矩阵上的矩阵”也可以返回各自的成对相关性。在这里,为简单起见,它只有两列。不出所料,R 得到相同的数字:

代码(带有 R 胶水和示例)

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
double mycorr(const arma::vec & x, const arma::vec & y) {
    return arma::as_scalar(arma::cor(x, y));
}

/*** R
set.seed(123)
x <- rnorm(100)
y <- rnorm(100)
cor(x,y)
mycorr(x,y)
*/

输出(来自 R)

> Rcpp::sourceCpp("~/git/stackoverflow/68749299/answer.cpp")

> set.seed(123)

> x <- rnorm(100)

> y <- rnorm(100)

> cor(x,y)
[1] -0.0495321

> mycorr(x,y)
[1] -0.0495321
> 

推荐阅读