corr()与稀疏矩阵 - MATLAB

3
我想知道MATLAB是否有一个工具箱可以处理稀疏矩阵的常见矩阵运算。
使用密集矩阵,我可以通过以下方法计算相关矩阵:
R = rand(10,100)
[r,p] = corr(R)

使用稀疏矩阵,我希望能够做到:

S = sprand(10,100,.2)
[r,p] = corr(S)

然而,会出现以下错误:
Error using betainc
Inputs must be real, full, and double or single.

Error in tcdf (line 70)
    p(t) = betainc(xsq(t) ./ (v(t) + xsq(t)), 0.5, v(t)/2, 'upper') / 2;

Error in corr>pvalPearson (line 720)
    p = 2*tcdf(-abs(t),n-2);

Error in corr>corrPearson (line 321)
            pval(ltri) = pvalPearson(tail, coef(ltri), n);

Error in corr (line 204)
        [coef,pval] = corrFun(rows,tail,x);

有人能帮我吗?


1
我目前不知道MATLAB中是否有可以计算稀疏矩阵相关性的函数。你可能需要自己实现。然而,Cross Validated上的这篇文章可能会提供一些见解:http://stats.stackexchange.com/questions/120513/cross-correlation-for-very-sparse-binary-data - rayryeng
我不知道有任何函数可以做到这一点。如果Matlab没有实现这个功能,那么使用corr之后很可能只有少数矩阵是稀疏的(例如:corr(rand(10))corr(toeplitz([2,1,0,0,0,0,0,0,0,0])))。如果您想要实现这个功能,那么没问题。但是您可能需要考虑一个标准,即假设相关性为零。请注意,一个完全填充的稀疏矩阵大约需要三倍于一个完整矩阵的大小。此外,您展示的示例并不是建议使用稀疏矩阵的情况s=sprand(10,10,.2); f=full(q); [r,p]=corr(s) - patrik
1个回答

0

大家加油,让我们来做些数学吧!设 x 为一个随机向量。相关矩阵 CORR(x_i, x_j) 中的一个条目如下:

CORR(x_i, x_j) = COV(x_i, x_j) / (SQRT(VAR(x_i)) *SQRT(VAR(x_j));

也就是说,为了构建我们的相关矩阵,我们需要协方差矩阵,它也给出了各自的方差。协方差的公式为:COV(x) = E[x*x'] - E[x]E[x]'。然后我们可以用样本矩(即X'*X/nmean(X))来近似总体矩E[x*x']

因此,以下是Matlab代码:

[n, k]  = size(X);
Exxprim = full(X'*X)/n; %I'm shocked if this isn't full so let's drop sparse now 
Ex   = full(mean(X))'; %same deal
COVX = (Exxprim - Ex*Ex');
STDEVX = sqrt(diag(COVX));
CORRX = COVX ./ (STDEVX * STDEVX');

如果X是稀疏的,那么使用X'*X和mean(X)可能会更有效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接