В последние дни я изо всех сил пытался вычислить степени свободы двух пар векторов (x и y), следуя ссылке Челтона (1983), которая:
степени свободы по Челтону (1983)
и я не могу найти правильный способ вычислить нормализованную функцию взаимной корреляции с помощью np.correlate, Я всегда получаю вывод, что он не находится между -1, 1.
Есть ли простой способ нормализовать функцию взаимной корреляции для вычисления степеней свободы двух векторов?
Вот хороший ответ: stackoverflow.com/q/13439718/987846






Хороший вопрос. Прямого пути нет, но вы можете «нормализовать» входные векторы перед использованием 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. Ничего страшного, если это произойдет?
Вы можете разместить здесь, в комментариях, пример этого?
@makis, почему вы умножаете стандартное отклонение на len (a) в своем примере кода?
@RonU len(a) означает Nscipy doc или Документ Matlab, что эквивалентно max(len(a), len(b)). Итак, c = np.correlate(normalized_a, normalized_b, 'full') / max(len(a), len(b)) может быть более понятным.
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.
Статья по теме ncbi.nlm.nih.gov/pmc/articles/PMC6147431 Все ссылки есть.