2015-08-19 4 views
3

Интересно, имеет ли MATLAB набор инструментов для общей матричной операции с разреженными матрицами.corr() с разреженной матрицей - 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

+0

Я не знаю о какой-либо функции, выполняющей это. В случае, если Matlab этого не выполнил, наиболее вероятно, что после использования corr малочисленны матрицы (примеры: 'corr (rand (10))', 'corr (toeplitz ([2,1,0,0,0,0, 0,0,0,0])) '). Если вы хотите реализовать это, то это нормально. Однако вы можете подумать о наличии критериев, в которых вы предполагаете, что корреляция равна нулю. Подумайте, что полностью заполненная разреженная матрица занимает примерно в три раза больше полной матрицы. Кроме того, пример, который вы показываете, не является случаем, когда разреженный рекомендуется использовать 's = sprand (10,10, .2); F = полная (кв); [Г, р] = корр (ы) ' – patrik

ответ

0

Cmon ppl, давайте сделаем математику! Пусть x - случайный вектор. Запись в корреляционной матрице КОРР (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]'. Затем мы можем аппроксимировать населения Moments E[x*x'] с образцом моментов (т.е. X'*X/n и mean(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) может быть более эффективным, потому что X разрежен.

Смежные вопросы