Как определить коэффициент масштабирования, чтобы ковариационная матрица имела первый элемент равный 1?

У меня есть данные, которые мне нужно центрировать и масштабировать, чтобы они были сосредоточены вокруг начала координат. Затем данные необходимо повернуть так, чтобы направление максимальной дисперсии находилось на оси x. Затем вычисляется среднее значение данных и ковариация. Мне нужно, чтобы первый элемент ковариационной матрицы был равен 1. Я думаю, что это делается путем настройки коэффициента масштабирования, но я не могу понять, каким должен быть коэффициент масштабирования.

Для центрирования данных я убираю среднее, а для поворота использую SVD, но масштабирование по-прежнему моя проблема.

signature = numpy.loadtxt(name, comments = '%', usecols = (0,cols-1))
signature = numpy.transpose(signature)

#SVD to get D so that data can be scaled by 1/(highest singular value in D)
U, D, Vt = numpy.linalg.svd( signature , full_matrices=0)
cs = utils.centerscale(signature, scale=False)
signature = cs[0]
#plt.scatter(cs[0][0],cs[0][1],color='r')

#SVD so that data can be rotated so that direction of most variance is on x-axis
U, D, Vt = numpy.linalg.svd( signature , full_matrices=0)
cs = utils.centerscale(signature, center=False, scalefactor=D[0])
U, D, Vt = numpy.linalg.svd( cs[0] , full_matrices=0)
D = numpy.diag(D)
norm = numpy.dot(D,Vt)

Ниже приведены примеры результатов среднего и cov для norm (в тестовых примерах используется res).

**********************************************************************
Failed example:
print numpy.mean(res, axis=1)
Expected:
[  7.52074907e-18  -6.59917722e-18]
Got:
[ -1.22008884e-17   2.41126563e-17]
**********************************************************************
Failed example:
print numpy.cov(res, bias=1)
Expected:
[[  1.00000000e+00   9.02112676e-18]
 [  9.02112676e-18   1.40592827e-01]]
Got:
[[  4.16666667e-03  -1.57698124e-19]
 [ -1.57698124e-19   5.85803446e-04]]
**********************************************************************
1 items had failures:
2 of   4 in __main__.processfile
***Test Failed*** 2 failures.

Все значения не имеют значения, кроме первого элемента ковариационной матрицы, который должен быть равен единице.

Я пытался искать везде и не могу найти ответ. Любая помощь будет оценена по достоинству.


person luke417    schedule 05.04.2012    source источник


Ответы (1)


Я не знаю, что такое или делает utils.centerscale, но если вы хотите масштабировать матрицу с постоянным коэффициентом, чтобы верхний левый член ее ковариационной матрицы был равен 1, вы можете просто разделить матрицу на квадратный корень из немасштабированный ковариационный член:

>>> import numpy
>>> numpy.random.seed(17)
>>> m = numpy.random.rand(5,4)
>>> m
array([[ 0.294665  ,  0.53058676,  0.19152079,  0.06790036],
       [ 0.78698546,  0.65633352,  0.6375209 ,  0.57560289],
       [ 0.03906292,  0.3578136 ,  0.94568319,  0.06004468],
       [ 0.8640421 ,  0.87729053,  0.05119367,  0.65241862],
       [ 0.55175137,  0.59751325,  0.48352862,  0.28298816]])
>>> c = numpy.cov(m,bias=1)
>>> c
array([[ 0.0288779 ,  0.00524455,  0.00155373,  0.02779861,  0.01798404],
       [ 0.00524455,  0.00592484, -0.00711072,  0.01006019,  0.00631144],
       [ 0.00155373, -0.00711072,  0.13391344, -0.10551922,  0.00945934],
       [ 0.02779861,  0.01006019, -0.10551922,  0.11250984,  0.00982862],
       [ 0.01798404,  0.00631144,  0.00945934,  0.00982862,  0.01444482]])
>>> numpy.cov(m/c[0][0]**0.5, bias=1)
array([[ 1.        ,  0.18161135,  0.05380354,  0.96262562,  0.62276138],
       [ 0.18161135,  0.20516847, -0.24623392,  0.3483699 ,  0.21855613],
       [ 0.05380354, -0.24623392,  4.63722877, -3.65397781,  0.32756326],
       [ 0.96262562,  0.3483699 , -3.65397781,  3.89605297,  0.34035085],
       [ 0.62276138,  0.21855613,  0.32756326,  0.34035085,  0.5002033 ]])

Но это имеет тот же эффект, что и простое деление ковариационной матрицы на верхний левый член:

>>> (numpy.cov(m,bias=1)/numpy.cov(m,bias=1)[0][0])/(numpy.cov(m/c[0][0]**0.5, bias=1))
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

В зависимости от того, что вы делаете, вас также может заинтересовать numpy.corrcoef, который вместо этого дает матрицу коэффициентов корреляции.

person DSM    schedule 05.04.2012
comment
Спасибо, это очень помогло. - person luke417; 05.04.2012