【问题标题】:Efficient way to compute the correlation between each pair of columns in a matrix with Nan values?计算矩阵中每对列与 Nan 值之间相关性的有效方法?
【发布时间】:2018-03-10 20:34:20
【问题描述】:

假设我有一个n-by-m 矩阵X,我想得到一个m-by-m 相关矩阵Y,其中每个元素Yij 是第 ith 列和第 jth 列之间的相关性。 但是,X 矩阵在随机位置包含许多 NaN 值。 直接的双循环方法是:

Y = nan(m,m);
for i = 1:1:m
    for j = i:1:m
        subset = intersect(find(~isnan(X(:,i))),find(~isnan(X(:,j))));
        Y(i,j) = corr(X(subset,i),X(subset,j));
    end  
end

但这太慢了。有没有更有效的方法?

【问题讨论】:

  • 这个问题定义不足。值与 NaN 的相关性是什么? NaN 与 NaN 的相关性是什么? (0, 0, 0, … 0) 与 (NaN,…NaN) 的相关性是否小于 (1000, 1000, 1000, …, 1000) 与 (NaN,…NaN) 的相关性?我建议了解您的数据问题,解决它,然后关联,而不仅仅是计算没有意义的某事
  • @MarcusMüller 如果您仔细检查我上面的代码,您会发现它已经回答了您的问题。您给出的示例最终应该以 NaN 的相关性结束。

标签: matlab performance matrix nan correlation


【解决方案1】:

这是一个使用矩阵乘法的矢量化解决方案:

function Y = cornan(X)
    nans = isnan(X);
    nnans=~nans;
    X(nans)=0;
    sX=nnans.'*X;
    n=nnans.'*nnans;
    sX2=X.'*X;
    Y = (n.*sX2-sX.'.*sX)./sqrt((sX.^2-bsxfun(@times,n,diag(sX2).')).*(sX.'.^2-bsxfun(@times,n,diag(sX2))));
end

或者从 MATLAB R2016b / Octave 开始,这可以更短:

function Y = cornan(X)
    nans = isnan(X);
    nnans=~nans;
    X(nans)=0;
    sX=nnans.'*X;
    n=nnans.'*nnans;
    sX2=X.'*X;
    Y = (n.*sX2-sX.'.*sX)./sqrt((sX.^2-n.*diag(sX2).').*(sX.'.^2-n.*diag(sX2)));
end

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多