2016-12-12 6 views
1

Я пытаюсь вычислить выборочную ковариацию данных.Ковариация не является положительной.

код, который я написал это:

def calcCov(x): 
    m, n = x.shape 

    mean = np.mean(x, axis=0) 
    cov = np.zeros((n, n)) 
    for j in range(0, n): 
     for k in range(0, n): 
      sum = 0 
      for i in range(0, m): 
       sum += (x[i, j] - mean[j])*(x[i, k] - mean[k]) 
      cov[j, k] = sum/(m - 1.0) 

    return cov 

Это не самый эффективный способ сделать это, но это просто и является прямой копией https://en.wikipedia.org/wiki/Sample_mean_and_covariance#Sample_covariance в меру моих знаний.

Ковариантная матрица всегда положительная полуопределенная. Но когда я вычисляю собственные значения (с np.eig), иногда вижу отрицательные собственные значения.

, например код

data = np.random.rand(2, 2) 
print data 
cov = calcCov(data) 
eigvals, eigvec = np.linalg.eig(cov) 
print cov 
print eigvals 

печатает выход

[[ 0.12873309 0.92079275] 
[ 0.90018866 0.73197021]] 
[[ 0.29757185 -0.0728341 ] 
[-0.0728341 0.01782698]] 
[ 3.15398823e-01 -3.46944695e-18] 

как математик, который очень тревожным. Почему это происходит? простые числовые ошибки? я сделал ошибку в моем подсчете ковариации?

ответ

4

Во-первых, я хотел бы предложить использовать функцию ковариации Numpy, так как это будет более эффективным: https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.cov.html

Учитывая «отрицательных» собственных у вас есть е-18, было бы справедливо считать его 0 до численного ошибка.

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