многомерная корреляция в c # - PullRequest
1 голос
/ 15 января 2012

я получил два N-мерных ряда точек, каждая из которых имеет длину M .. цель состоит в том, чтобы сопоставить их и вычислить коэффициент корреляции .. используя формулы для дисперсии, ковариации и стандартного отклонения, можно рассчитать коэффициент корреляции ..

что я не понимаю, так это как адаптировать алгоритм для учета всех N измерений, а не только одного ... рассмотрим следующее ..

series A = [0, 0] [1, 1] [2, 2] [3, 3]  
series B = [0,  0] [1, -1] [2, -2] [3, -3]

если мы используем только первое измерение для корреляции, мы получим +1,00 .. если мы используем второе, мы получим -1,00 ... но мы можем видеть, что если мы рассмотрим оба измерения для корреляции, ответ не будет таким простым, как +1.00 или -1.00 ..

так что я хочу знать, как сформулировать этот тип многомерной корреляции, предпочтительно в c # ..

Не стесняйтесь просить дальнейших разъяснений или редактировать, чтобы улучшить публикацию .. =)

РЕДАКТИРОВАТЬ: серии, которые я использую, являются временными рядами запаса. Я получаю последние М выборок цен ЗАКРЫТЬ в виде серии А и начинаю сопоставлять их со всеми историческими данными в виде скользящего окна (данные [1] - данные [М + 1 ], данные [2] - данные [M + 2], данные [1000] - данные [M + 1000] и т. д.) .. смещение, где корреляция является наибольшей, является моментом времени, когда поведение цены было почти идентично текущему моменту .. проанализировав, если цена поднялась или опустилась после этого момента времени, мы можем сделать прогноз, каким образом цена может совершить движение в этот момент времени ... но я не использую только ЗАКРЫТЬ цены (1-измерение) ... я хочу определить регионы, в которых число метрик было схожим, например, ЗАКРЫТЬ, ОБЪЕМ и т. д., поэтому временной ряд имеет не одно значение для каждого индекса, а целый массив значений.

если я использую только ЗАКРЫТЬ в корреляции, я не могу гарантировать, что последовательность VOLUME этих рядов также будет аналогичной. Аналогично, если я использую VOLUME в корреляции, я не могу гарантировать, что последовательность CLOSE этих рядов также будет аналогичной. поэтому мне нужна формула для нормализованной корреляции, которая основана на некоторой метрике расстояния ... что-то вроде ^ 2 + b ^ 2 .. если значения ЗАКРЫТЫ одинаковы, то ^ 2 будет небольшим .. если значения VOLUME похожи, b ^ 2 будет маленьким .. теперь, если a ^ 2 + b ^ 2 маленькое, это означает, что и CLOSE и VOLUME похожи ..

Ранее я делал следующее:
1. используйте ЗАКРЫТЬ цены для расчета корреляции.
2. используйте VOLUME для расчета корреляции.
3. умножить эти значения вместе .. это обеспечит, что высокие значения корреляции будут означать, что как ЗАКРЫТЬ, так и ОБЪЕМ имеют сильные индивидуальные корреляции.

EDIT:

stdDevX = Sqrt (Summation ((x - Mean(x)) * (x - Mean(x)) / N)
stdDevY = Sqrt (Summation ((y - Mean(y)) * (y - Mean(y)) / N)  
corrXY = Summation ((x - Mean(x) * (y - Mean(y)) / (stdDevX * stdDevY)) / (N - 1)  

http://en.wikipedia.org/wiki/Standard_deviation
http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

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

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Из вопроса не ясно, но я думаю, что вас просят рассматривать каждую серию отдельно.Таким образом, рассматривая просто Series A как последовательность выборок из пары переменных X и Y, две переменные полностью связаны (если вы нарисовали график рассеяния, все значения были бы на прямой линии снизу)(слева направо), поэтому корреляция составляет + 1.

В отличие от этого, рассматривая просто Series B в качестве другой последовательности выборок из X и Y, на этот раз график рассеяния сновабыть прямой линией сверху вниз слева направо.Увеличение X уменьшает Y. Корреляция равна -1.

Становится более интересным, если каждая серия содержит выборки из трех переменных (например, моментальные снимки цен трех акций за определенный период времени).Вот простой пример:

<em>            X  Y  Z   X  Y   Z   X  Y   Z   X  Y   Z</em>
series C = [0, 0, 0] [1, 1, -1] [2, 2, -2] [3, 3, -3]

Здесь необходимо рассмотреть корреляцию между каждой парой переменных.В этом простом случае соотношение между X и Y равно +1, между X и Z равно -1 и между Y и Z равно -1.

Редактировать: Объединение корреляций

Предположим, у вас есть выборки из трех переменных - close , высокая и низкая - в течение двух периодов времени и хотите узнать, насколько хорошо совпадают эти два периода.Вы можете рассчитать корреляции между двумя периодами времени для каждой переменной традиционным способом.Предположим, что это дает тесную корреляцию = 0,6, высокую корреляцию = 0,3 и низкую корреляцию = 0,4.

Вам нужен какой-то методобъединение отдельных корреляций в оценку достоверности соответствия таким образом, что индивидуальные корреляции, далекие от нуля (то есть сильно коррелированные, положительно или отрицательно), вносят больший вклад в оценку, чем близкие к нулю.Простые подходы включают взятие продукта (0,6 * 0,3 * 0,4 = 0,072) или среднеквадратичное значение (sqrt ((0,6 ^ 2 + 0,3 ^ 2 + 0,4 ^ 2) / 3) = 0,4509) - вам придетсяЭксперимент, чтобы найти метод, который дает вам наиболее надежные результаты.

0 голосов
/ 15 января 2012
int GetCorrelationScore(Array[,] seriesA, Array[,] seriesB)
{
   int correlationScore = 0;

   for (var i = 0, i < seriesA.Length; i++)
   {
      if (areEqual(seriesA[i][0], seriasB[i][0], 0.5m) && areEqual(seriesA[i][1], seriasB[i][1], 0.5m))
         correlationScore++;
      else
         correlationScore--;
   }
}

bool areEqual(decimal value1, decimal value2, decimal allowedVariance)
{
   var lowValue1 = value1 - allowedVariance;
   var highValue1 = value1 + allowedVariance;

   return (lowValue1 < value2 && highValue1 > value2)
}
...