Нормализованная кросс-корреляция в Python

В последние дни я изо всех сил пытался вычислить степени свободы двух пар векторов (x и y), следуя ссылке Челтона (1983), которая:

степени свободы по Челтону (1983)

и я не могу найти правильный способ вычислить нормализованную функцию взаимной корреляции с помощью np.correlate, Я всегда получаю вывод, что он не находится между -1, 1.

Есть ли простой способ нормализовать функцию взаимной корреляции для вычисления степеней свободы двух векторов?

Статья по теме ncbi.nlm.nih.gov/pmc/articles/PMC6147431 Все ссылки есть.

sherdim 24.05.2019 21:28

Вот хороший ответ: stackoverflow.com/q/13439718/987846

kakyo 31.12.2020 07:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
19
2
28 313
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Хороший вопрос. Прямого пути нет, но вы можете «нормализовать» входные векторы перед использованием np.correlate, как это, и разумные значения будут возвращены в диапазоне [-1,1]:

Здесь я определяю корреляцию, как это обычно определяется в учебниках по обработке сигналов.

c'_{ab}[k] = sum_n a[n] conj(b[n+k])

КОД: Если a и b - векторы:

a = (a - np.mean(a)) / (np.std(a) * len(a))
b = (b - np.mean(b)) / (np.std(b))
c = np.correlate(a, b, 'full')

Использованная литература:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html

https://en.wikipedia.org/wiki/Cross-correlation

Я пробовал, но теперь он получает значения до 2, не остается <2. Ничего страшного, если это произойдет?

El pocho la pantera 05.09.2019 23:46

Вы можете разместить здесь, в комментариях, пример этого?

seralouk 04.10.2019 17:36

@makis, почему вы умножаете стандартное отклонение на len (a) в своем примере кода?

Ron U 18.12.2019 10:43

@RonU len(a) означает Nscipy doc или Документ Matlab, что эквивалентно max(len(a), len(b)). Итак, c = np.correlate(normalized_a, normalized_b, 'full') / max(len(a), len(b)) может быть более понятным.

jkjk 28.04.2020 10:34

a = np.dot(abs(var1),abs(var2),'full')

b = np.correlate(var1,var2,'full')

c = b/a

Это моя идея: но это нормализует 0-1

Функция numpy.corrcoef делает это напрямую, вычисляя ковариационную матрицу x и y, а затем нормализуя ее на стандартное отклонение x и стандартное отклонение y.

https://numpy.org/doc/stable/reference/generated/numpy.corrcoef.html#numpy.corrcoef

Это коэффициент корреляции Пирсона, который имеет диапазон +/- 1.

Другие вопросы по теме