Соотнесите один набор векторов с другим в NumPy? - PullRequest
4 голосов
/ 28 апреля 2009

Допустим, у меня есть набор векторов (показания датчика 1, показания датчика 2, показания датчика 3 - сначала индексированные по метке времени, а затем по идентификатору датчика), которые я хотел бы соотнести с отдельным набором векторы (температура, влажность и т. д. - все они индексируются сначала по метке времени, а затем по типу).

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

Другими словами, я бы хотел увидеть:

> a.shape 
(365,20)

> b.shape
(365, 5)

> correlations = magic_correlation_function(a,b)

> correlations.shape
(20, 5)

Ура, / YGA

P.S. Меня попросили добавить пример.

Вот что я хотел бы увидеть:

$ In [27]:  x
$ Out[27]: 
array([[ 0,  0,  0],
       [-1,  0, -1],
       [-2,  0, -2],
       [-3,  0, -3],
       [-4,  0.1, -4]])

$ In [28]: y
$ Out[28]: 
array([[0, 0],
       [1, 0],
       [2, 0],
       [3, 0],
       [4, 0.1]])

$ In [28]: magical_correlation_function(x, y)
$ Out[28]: 
array([[-1.        ,  0.70710678,  1.        ]
       [-0.70710678,  1.        ,  0.70710678]])

Пс2: упс, неправильно расшифровал мой пример. Извините все. Исправлено сейчас.

Ответы [ 3 ]

2 голосов
/ 28 апреля 2009

Самое простое, что я смог найти, это использовать пакет scipy.stats

In [8]: x
Out[8]: 
array([[ 0. ,  0. ,  0. ],
       [-1. ,  0. , -1. ],
       [-2. ,  0. , -2. ],
       [-3. ,  0. , -3. ],
       [-4. ,  0.1, -4. ]])
In [9]: y
Out[9]: 
array([[0. , 0. ],
       [1. , 0. ],
       [2. , 0. ],
       [3. , 0. ],
       [4. , 0.1]])

In [10]: import scipy.stats

In [27]: (scipy.stats.cov(y,x)
          /(numpy.sqrt(scipy.stats.var(y,axis=0)[:,numpy.newaxis]))
          /(numpy.sqrt(scipy.stats.var(x,axis=0))))
Out[27]: 
array([[-1.        ,  0.70710678, -1.        ],
       [-0.70710678,  1.        , -0.70710678]])

Это не числа, которые вы получили, но вы перепутали свои строки. (Элемент [0,0] должен быть 1.)

Более сложное, но чисто крошечное решение:

In [40]: numpy.corrcoef(x.T,y.T)[numpy.arange(x.shape[1])[numpy.newaxis,:]
                                 ,numpy.arange(y.shape[1])[:,numpy.newaxis]]
Out[40]: 
array([[-1.        ,  0.70710678, -1.        ],
       [-0.70710678,  1.        , -0.70710678]])

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

Если вы собираетесь интенсивно использовать numpy, ознакомьтесь с правилами трансляции и индексации . Они помогут вам подтолкнуть как можно больше до уровня C.

1 голос
/ 29 апреля 2009

Будет ли это делать то, что вы хотите?

correlations = dot(transpose(a), b)

Примечание: если вы сделаете это, вы, вероятно, захотите сначала стандартизировать или отбелить a и b, например, что-то эквивалентное этому:

a = sqrt((a - mean(a))/(var(a)))
b = sqrt((b - mean(b))/(var(b)))
0 голосов
/ 28 апреля 2009

Как сказал Дэвид, вы должны определить корреляцию, которую вы используете. Я не знаю ни одного определения корреляции, которое дает разумные числа при корреляции пустых и непустых сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...