У меня есть два набора данных с миллионами значений y.(Они расположены в хронологическом порядке, поэтому значения X были опущены, поскольку они становятся просто индексом.)
>>> print(f'{y_one[0:16]}...{y_one[-1]}')
[0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 5, 6, 5]...302
>>> print(f'{y_two[0:16]}...{y_two[-1]}')
[0, -1, 0, 1, 2, 1, 2, 1, 2, 3, 2, 1, 2, 3, 2, 1]...88
Оба набора данных генерируются случайным образом, и следует предположить, что они должны коррелироваться только друг с другомтак часто, как позволяет случайность.(Они оба по сути случайные блуждания, либо прибавляют одно, либо вычитают одно из предыдущих значений y).
>>> plt.plot(y_one[:80000])
>>> plt.show()
>>> plt.plot(y_two[:80000])
>>> plt.show()
Моя задача состоит в том, чтобы проанализировать эти две строки и определить, коррелированы ли они больше, чем допустил бы шанс.Если они коррелируют больше, чем предполагают случайные монеты, тогда что-то произошло, чтобы сделать их коррелированными, и мне нужно вызвать событие в ответ.
Дело в том ... Я не знаю, с чего начать.Поскольку я читал об обнаружении корреляции, я, конечно, узнал о коэффициенте корреляции Пирсона.Я узнал о его слабостях;что для точного определения корреляции мои данные должны быть несколько линейными или монотонными.
Как вы можете видеть, поскольку оба этих набора данных являются (предположительно) случайными блужданиями, они обычно не являются монотонными.Изображения выше показывают только первые 80 тысяч точек данных, и они почти по всей плате.
Так что Пирсона недостаточно;особенно потому, что они могут быть несколько коррелированы для 10k или некоторого другого x-количества наблюдений, а затем вообще потерять их корреляцию.Эта 10-тысячная корреляция внутри миллионов точек данных ничего не значит для Пирсона.Это теряется в шуме.Но если этих «моментов» корреляции больше, чем должно быть, мне нужно знать об этом - это то, что я ищу.
Это почти как если бы мне нужно «исчисление корреляции Пирсона».'как и мне, мне нужно сделать скользящие окна каждого размера, чтобы скользить по наборам данных и вычислять их коэффициенты Пирсона для каждого возможного x-количества наблюдений в строке.Если бы я сделал это и записал свои выводы, я мог бы взвесить каждое значение Пирсона по величине окна, а затем усреднить их, чтобы получить общий балл.Но с миллионами наблюдений делать это явно слишком сложно с вычислительной точки зрения: с 1 миллионом наблюдений мне понадобится 1 миллион скользящих окон, самое маленькое - 2 размера, а самое большое - 1 миллион;это означало бы, что мне придется рассчитать около 500 000 000 000 коэффициентов корреляции Пирсона.
Все это усугубляется тем фактом, что подавляющее большинство того, с чем я имею дело, - это шум.Но я знаю, что должен быть хороший способ измерить точную корреляцию между двумя наборами данных, достаточно сложный для работы с этими ограничениями, но я не знаю, что это и где искать.Я пытаюсь измерить малейшие отклонения от случайности (конечно, есть порог детализации, ниже которого мне наплевать, но он довольно близок к случайности).
Кто-нибудь сталкивался с такой проблемой?до?Что ты предлагаешь?Я смотрю не в том месте?Возможно, вместо прямой корреляции я должен вместо этого подогнать эти точки данных к функции (полиномиальной кривой), а затем сравнить две функции.Как вы думаете?
Любой совет будет оценен, спасибо!
Ps.Я работаю в Python, если вы не можете сказать, но я был бы рад получить совет на любом языке о том, как сделать это вычисление.