Рубрики
Без рубрики

Нахождение корреляций в нелинейных данных

Автор оригинала: Peter Gleeson.

С точки зрения сигнализации, мир – шумное место. Для того, чтобы понять что-либо, мы должны быть избирательными с нашим вниманием.

Мы, люди, в течение миллионов лет естественного отбора, становятся довольно хорошими при фильтрации фоновых сигналов. Мы учимся связывать определенные сигналы с определенными событиями.

Например, представьте, что вы играете в настольный теннис в оживленном офисе.

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

Чтобы предсказать движение мяча, ваш мозг должен многократно пробудить текущую позицию мяча и оценить его будущую траекторию. Более продвинутыми игроками также примут во внимание любой спин своего противника, обращенного к выстрелу.

Наконец, чтобы сыграть свой собственный выстрел, вам нужно учитывать позицию своего противника, ваша собственная позиция, скорость мяча и любого спина, которую вы намереваетесь применять.

Все это включает в себя удивительное количество подсознательного дифференциального исчисления. Мы берем это как должное, что, вообще говоря, наша нервная система может сделать это автоматически (по крайней мере, после немного практики).

Так же впечатляюще – это то, как человеческий мозг дифференцируют важность каждому из множества конкурирующих сигналов, которые он получает. Положение мяча, например, считается более актуальным, чем, скажем, разговор проходит позади вас, или дверь, открывающую перед вами.

Это может звучать настолько очевидно, что кажется недостойным заявленным, но это завет на то, насколько мы хорошо мы учимся делать точные прогнозы из шумных данных.

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

К счастью, существуют статистические и вычислительные методы, которые можно использовать для выявления шаблонов в шумных, сложных данных.

Корреляция 101.

Вообще говоря, когда мы говорим о «корреляции» между двумя переменными, мы имеем в виду их «родство» в некотором смысле.

Коррелированные переменные – это те, которые содержат информацию друг о друге. Чем сильнее корреляция, тем больше одна вариабель говорит нам о другом.

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

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

Это сказано, корреляция Разрешить для прогнозов о одной переменной, сделанной на основе другого. Существует несколько методов, которые могут быть использованы для оценки корреляционной невы для линейных, так и для нелинейных данных. Давайте посмотрим, как они работают.

Мы пройдем через математику и реализацию кода, используя Python и R. Код для примеров этой статьи можно найти здесь Отказ

Коэффициент корреляции Пирсона

Что это?

Коэффициент корреляции Пирсона (PCC, или Pearson’s R ) – широко используемая линейная корреляционная мера. Часто первым преподается во многих курсах начальной статистики. Математически говоря, он определяется как «ковариация между двумя векторами, нормированными продуктом их стандартных отклонений».

Расскажи мне больше …

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

Посмотрим, что это реализовано в Python:

def mean(x):
    return sum(x)/len(x)

def covariance(x,y):
    calc = []
    for i in range(len(x)):
        xi = x[i] - mean(x)
        yi = y[i] - mean(y)
        calc.append(xi * yi)
    return sum(calc)/(len(x) - 1)
    
a = [1,2,3,4,5] ; b = [5,4,3,2,1]
print(covariance(a,b))

Ковариация рассчитывается путем приема каждой пары переменных и вычитая их соответствующие средства от них. Затем умножьте эти два значения вместе.

  • Если они оба выше среднего (или как ниже), то это даст положительное число, потому что A, а также а также.
  • Если они находятся на разных сторонах своих средств, то это производит отрицательное число (потому что).

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

Если пары имеют тенденцию как к той же стороне своих соответствующих средств, ковариация будет положительным числом. Если у них есть тенденция быть на противоположных сторонах своих средств, ковариация будет отрицательным числом. Чем сильнее эта тенденция, тем больше абсолютное значение ковариации.

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

Сначала может показаться, что ковариация является достаточной мерой «родственной среды» между двумя переменными. Однако посмотрите на график ниже:

Похоже, есть сильные отношения между переменными, верно? Так почему же ковариация настолько низкая, примерно примерно 0,00003?

Ключ здесь состоит в том, чтобы осознать, что ковариация зависит от масштаба. Посмотри на х и y Оси – в значительной степени все точки данных падают между диапазоном 0,015 и 0,04. Ковариация также будет близок к нулю, поскольку он рассчитывается путем вычитания средств от каждого индивидуального наблюдения.

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

В Python:

import math

def stDev(x):
    variance = 0
    for i in x:
        variance += (i - mean(x) ** 2) / len(x)
    return math.sqrt(variance)
    
def Pearsons(x,y):
    cov = covariance(x,y)
    return cov / (stDev(x) * stDev(y))

Причина, по которой это сделано, потому что стандартное отклонение вектора является квадратный корень его дисперсии. Это означает, что если две векторы идентичны, то умножение их стандартных отклонений будет равна их дисперсии.

Достаточно гриппов, ковариация двух одинаковых векторов также равна их дисперсии.

Следовательно, максимальное значение COVARICCE между двумя векторами может принимать, равен продукту их стандартных отклонений, которые возникают, когда векторы идеально коррелируют. Именно это связано с коэффициентом корреляции между -1 и +1.

Какой путь делают стрелки?

Помимо того, что намного кручевая способ определения PCC из двух векторов происходит от линейной алгебры.

Во-первых, мы центрируем векторы, вычитая их средства от их отдельных ценностей.

a = [1,2,3,4,5] ; b = [5,4,3,2,1]

a_centered = [i - mean(a) for i in a]
b_centered = [j - mean(b) for j in b]

Теперь мы можем использовать тот факт, что векторы можно рассматривать как «стрелки», указывающие в данном направлении.

Например, в 2-D вектор [1,3] может быть представлен в виде стрелки, указывающего 1 блок вдоль оси X и 3 блока вдоль оси Y. Аналогичным образом, вектор [2,1] можно представить в виде стрелки, направленного на 2 единицы вдоль оси x и 1 блок вдоль оси Y.

Точно так же мы можем представлять наши данные векторов в виде стрелок в N -мерное пространство (хотя не пытайся визуализацию, когда N > 3 …)

Угол θ между этими стрелками может быть разработан с помощью Точечный продукт из двух векторов. Это определяется как:

Или, в Python:

def dotProduct(x,y):
    calc = 0
    for i in range(len(x)):
        calc += x[i] * y[i]
    return calc

Точечный продукт также может быть определен как:

Где х это величина (или «длина») вектора х (Думаю

Как функция Python:

def magnitude(x):
    x_sq = [i ** 2 for i in x]
    return math.sqrt(sum(x_sq))

Это позволяет нам найти COS (θ), разделив точечный продукт по продукту величин двух векторов.

def cosTheta(x,y):
    mag_x = magnitude(x)
    mag_y = magnitude(y)
    return dotProduct(x,y) / (mag_x * mag_y)

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

Значение COS (θ) будет варьироваться в зависимости от угла между двумя векторами стрелки.

  • Когда угол равен нулю (точка I.e, точка векторов в то же самое направление), COS (θ) будет равным 1.
  • Когда угол составляет -180 °, (векторы указывают в точные противоположные направления), то Cos (θ) будет равен -1.
  • Когда угол составляет 90 ° (векторы указывают в совершенно не связанные направления), то Cos (θ) будет равен нулю.

Это может выглядеть знакомым – мера между +1 и -1, которая, кажется, описывает родство двух векторов? Разве это не … Pearson’s R ?

Ну – это именно то, что это такое! Учитывая данные в качестве векторов стрелки в высокомерном пространстве, мы можем использовать угол θ между ними в качестве меры сходства.

Косинус этого угла θ математически идентичны к коэффициенту корреляции Пирсона.

При рассматривании как высокомерные стрелки положительно коррелированные векторы указывают в аналогичное направление.

Отрицательно коррелированные векторы будут указывать на противоположные направления.

И незапятнанные векторы будут указывать на правых углах друг к другу.

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

Статистическая значимость?

Как и всегда в случае с частотестической статистикой, важно спросить, насколько значительна тестовая статистика, рассчитанная с данного образца фактически. Пирсон R не исключение.

К сожалению, уравновешивание доверительных интервалов по оценке PCC не совсем не просто.

Это потому, что Пирсон R связано между -1 и +1, и поэтому обычно не распространяется. Предполагаемый PCC, скажем, +0,95 имеет только столько комнат для ошибок над ним, но много места ниже.

К счастью, есть решение – с использованием трюка под названием Z-Transform Fisher:

  1. Рассчитать оценку Pearson’s R по-прежнему.
  2. Трансформировать Rz используя Z-преобразование Фишера. Это можно сделать с помощью формулы z = Arctanh ( r ), где Arctanh – это обратная гиперболическая касательная функция Отказ
  3. Теперь рассчитайте стандартное отклонение z Отказ К счастью, это просто рассчитать и дается SD z /sqrt ( n -3), где N это размер выборки.
  4. Выберите порог значений, альфа и проверьте, сколько стандартных отклонений от среднего значения это соответствует. Если мы возьмем. 95, используйте 1.96.
  5. Найти верхнюю оценку путем расчета z + (1,96 × SD Z ), а нижняя граница путем расчета Z – (1,96 × SD z ) Отказ
  6. Конвертировать их обратно в R, Использование R = Tanh ( z ), где Tanh – Гиперболическая касательная функция Отказ
  7. Если верхние и нижние границы являются одной и той же стороной ноль, у вас есть статистическая значимость!

Вот реализация Python:

r = Pearsons(x,y)
z = math.atanh(r)
SD_z = 1 / math.sqrt(len(x) - 3)
z_upper = z + 1.96 * SD_z
z_lower = z - 1.96 * SD_z
r_upper = math.tanh(z_upper)
r_lower = math.tanh(z_lower)

Конечно, при предоставлении большого набора данных многих потенциально коррелированных переменных может быть заманчиво проверить каждую паривому корреляцию. Это часто называют «данными Drudging» – расчерив данные, установленные для любых видимых отношений между переменными.

Если вы возьмете этот множественный подход сравнения, вы должны использовать более строгие пороги значимости, чтобы уменьшить риск обнаружения ложных срабатываний (то есть нахождение несвязанных переменных, которые кажутся коррелированными исключительно случайными).

Один метод для этого – использовать Коррекция Бонферрония Отказ

Маленький принт

Все идет нормально. Мы видели, как Пирсон R Может использоваться для расчета коэффициента корреляции между двумя переменными и как оценить статистическую значимость результата. Учитывая невидимый набор данных, можно начать добычу для значительных отношений между переменными.

Тем не менее, есть крупный улов – Пирсон R работает только для линейных данных.

Посмотрите на графики ниже. Они ясно показывают, что выглядит как нерактные отношения, но Пирсон R очень близко к нулю.

Причина, по которой есть потому, что переменные на этих графах имеют нелинейный отношение.

Как правило, мы можем представлять собой отношение между двумя переменными как «облако» точек разбросана по обе стороны от линии. Чем широкий разброс, «шумные» данные и более слабые отношения.

Тем не менее, Пирсон R сравнивает каждую отдельную точку данных только с одним другим (общим средством). Это означает, что он может учитывать только прямые линии. Не здорово обнаружить любые нелинейные отношения.

На графиках выше, Пирсон R Не обнаруживает, что оказывается много корреляции, чтобы поговорить.

Тем не менее, отношения между этими переменными все еще являются четко не случайными, и это делает их потенциально полезными предикторами друг друга. Как машины могут идентифицировать это? К счастью, существуют различные корреляционные меры, доступные для нас.

Давайте посмотрим на пару из них.

Корреляция расстояния

Что это?

Дистанционная корреляция несет некоторое сходство в Пирсон R , но на самом деле рассчитывается с использованием довольно разного понятия ковариации. Способ работает путем замены наших повседневных концепций ковариации и стандартного отклонения (как определено выше) с аналогами «расстояние».

Многое, как Пирсон R , «Корреляция расстояния» определяется как «дистанционное ковариация», нормированное «отклонением стандартов расстояния».

Вместо того, чтобы оценить, как два переменных, как правило, сообещают в их расстоянии от их соответствующих средств, корреляция расстояния оценивает, как они имеют тенденцию к тому, как они имеют тенденцию к вашим в зависимости от их расстояний от всех других точек.

Это открывает потенциал для лучшего захвата нелинейных зависимостей между переменными.

Тон более тонкие детали …

Роберт Браун был шотландским ботаником, родившимся в 1773 году. Во время изучения пыльцы растений под его микроскопом коричневый заметил крошечные органические частицы, связанные со случайным образом на поверхности воды, которую он использовал.

Мало могла бы он подозревал на случайное наблюдение за его именем, что его имя увековечивалось бы, чтобы его имя увековечивалось как (Re-) первооткрывателя броуновского движения.

Даже меньше могла ли он знать, что это займет почти столетие до того, как Альберт Эйнштейн будет обеспечить Объяснение к феномену – И, следовательно, доказывая существование атомов – в том же году он опубликовал документы, специальную относительность и помогли начать поле квантовой теории.

Браунское движение – это физический процесс, в результате чего частицы движутся во случайном случае из-за столкновений с окружающими молекулами.

Математика за этим процессом может быть обобщена в концепцию, известную как Weiner Process Отказ Среди прочего, процесс Weiner играет важную роль в самой известной модели математических финансов, Black-Scholes Отказ

Интересно, что Браунское движение и процесс Weiner оказываются актуальными для нелинейной меры корреляции, разработанной в середине 2000 года через работу Габора Гэкона.

Давайте пройдемся через то, как это можно рассчитать для двух векторов х и y , каждая длина N Отказ

  1. Во-первых, мы формируем N × N Расстояние матрицы для каждого из векторов. Расстояние матрицы точно так же, как диаграмма протяженности дороги в атласе – пересечение каждой строки и колонны показывает расстояние между соответствующими городами. Здесь пересечение между ряд Я и колонна J Дает расстояние между I-го и J-го элементами вектора.

2. Далее, матрицы «двухцентрированные». Это средство для каждого элемента, мы вычитаем среднее значение его ряду и среднее значение его столбца. Затем мы добавляем великое среднее значение всей матрицы.

3. С двумя центрическими матрицами мы можем рассчитать квадрат дистанционного ковариации, взяв среднее каждого элемента в Х умноженный на соответствующий элемент в Y Отказ

4. Теперь мы можем использовать аналогичный подход к поиску «дистанционной дисперсии». Помните – ковариация двух одинаковых векторов эквивалентна их дисперсии. Следовательно, дисперсия в квадрате расстояния может быть описана ниже:

5. Наконец, у нас есть все части для расчета корреляции расстояния. Помните, что стандартное отклонение (расстояние) равно квадратному корню (расстояние) дисперсии.

Если вы предпочитаете работать через код вместо математики (в конце концов, есть причина, по которой люди склонны писать программное обеспечение в одном, а не на другом …), затем проверьте реализацию R ниже:

set.seed(1234)

doubleCenter <- function(x){
  centered <- x
  for(i in 1:dim(x)[1]){
    for(j in 1:dim(x)[2]){
      centered[i,j] <- x[i,j] - mean(x[i,]) - mean(x[,j]) + mean(x)
      }
    }
  return(centered)
}

distanceCovariance <- function(x,y){
  N <- length(x)
  distX <- as.matrix(dist(x))
  distY <- as.matrix(dist(y))
  centeredX <- doubleCenter(distX)
  centeredY <- doubleCenter(distY)
  calc <- sum(centeredX * centeredY)
  return(sqrt(calc/(N^2)))
 }

distanceVariance <- function(x){
  return(distanceCovariance(x,x))
}
distanceCorrelation <- function(x,y){
  cov <- distanceCovariance(x,y)
  sd <- sqrt(distanceVariance(x)*distanceVariance(y))
  return(cov/sd)
}

# Compare with Pearson's r
x <- -10:10
y <- x^2 + rnorm(21,0,10)
cor(x,y) # --> 0.057
distanceCorrelation(x,y) # --> 0.509

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

Если вы предпочитаете не написать свои собственные методы корреляции расстояний с нуля, вы можете установить R’ | энергия Пакет , написанные очень исследователями, которые разработали метод. Методы, доступные в этих функциях вызова пакета, написанные в C, обеспечивая большую скорость преимущества.

Физическая интерпретация

Одним из более удивительных результатов, связанных с корреляцией дистанции, является то, что он несет точную эквивалентность до коричневой корреляции.

Соотношение Браунэна относится к независимости (или зависимости) двух буровых процессов. Воровняные процессы, которые зависят от зависящих от того, будут демонстрировать тенденцию к «следовать друг другу».

Простая метафора, которая поможет понять концепцию корреляции расстояния, состоит в том, чтобы открыть парк бумажных лодок, плавающих на поверхности озера.

Если нет никакого преобладающего направления ветра, то каждая лодка будет дрейфовать во случайном порядке – таким образом, что (вид), аналогично коричневому движению.

Если есть преобладающий ветер, то направление лодки дрейфуют, будут зависеть от силы ветра. Чем сильнее ветер, тем сильнее зависимость.

В сопоставимом способе некорелированные переменные можно рассматривать как лодки, дрейфующие без преобладающего ветра. Коррелированные переменные можно рассматривать как лодки, дрейфующие под воздействием преобладающего ветра. В этой метафоре ветер представляет силу отношений между двумя переменными.

Если мы позвольте преобладающему направлению ветра варьироваться в разных точках на озере, то мы можем принести понятие нелинейности в аналогию. Дистанционная корреляция использует расстояния между «лодками», чтобы вывести прочность преобладающего ветра.

Доверительные интервалы?

Доверительные интервалы могут быть установлены для оценки корреляции расстояний с использованием методики «Resampling». Простой пример – Resampling Bootstrap.

Это аккуратная статистическая хитрость, который требует от нас «восстановить» данные путем случайной выборки (с заменой) из исходного набора данных. Это повторяется много раз (например, 1000), и каждый раз, когда будет рассчитан статистика интереса.

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

Проверьте код R ниже для простой функции Bootstrap:

set.seed(1234)

bootstrap <- function(x,y,reps,alpha){
  estimates <- c()
  original <- data.frame(x,y)
  N <- dim(original)[1]
  for(i in 1:reps){
    S <- original[sample(1:N, N, replace = TRUE),]
    estimates <- append(estimates, distanceCorrelation(S$x, S$y))
  }
  u <- alpha/2 ; l <- 1-u
  interval <- quantile(estimates, c(l, u))
  return(2*(dcor(x,y)) - as.numeric(interval[1:2]))
}

# Use with 1000 reps and threshold alpha = 0.05
x <- -10:10
y <- x^2 + rnorm(21,0,10)
bootstrap(x,y,1000,0.05) # --> 0.237 to 0.546

Если вы хотите установить статистическую значимость, есть еще один доступный трюк, называемый «тестом перестановки».

Это немного отличается от метода Bootstrap, определенным выше. Здесь мы держим одну векторную постоянную и «перемешайте» другой, повторно перезаряжая. Это приближает к нулевой гипотезе – что нет зависимости между переменными.

Переменная «Shuffled» затем используется для расчета корреляции расстояния между ним и постоянной переменной. Это делается много раз, и распределение результатов сравнивается с фактической корреляцией расстояния (полученной из неразрешенных данных).

Доля результатов «смягчающих», превышающих или равную «реальному» результату, затем принимается в виде P-значения, которое можно сравнить с данным порогом значимости (например, 0,05).

Проверьте код, чтобы увидеть, как это работает:

permutationTest <- function(x,y,reps){
  estimates <- c()
  observed <- distanceCorrelation(x,y)
  N <- length(x)
  for(i in 1:reps){
    y_i <- sample(y, length(y), replace = T)
    estimates <- append(estimates, distanceCorrelation(x, y_i))
  }
  p_value <- mean(estimates >= observed)
  return(p_value)
}

# Use with 1000 reps
x <- -10:10
y <- x^2 + rnorm(21,0,10)
permutationTest(x,y,1000) # --> 0.036

Максимальный информационный коэффициент

Что это?

Максимальный информационный коэффициент (MIC) является недавним способом обнаружения нелинейных зависимостей между переменными, Разработано в 2011 году Отказ Алгоритм, используемый для расчета MIC, применяет концепции теории информации и вероятности непрерывных данных.

Дайвинг в …

Теория информации – увлекательное поле в пределах математики, которая была впервые. Claude Shannon В середине двадцатого века.

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

Чтобы понять, как это работает, сравните два распределения вероятностей ниже:

Слева входит в честные шестигранные кубицы, а справа – это распределение не так справедливых шестигранных костей.

Интуитивно, что бы вы ожидали иметь более высокую энтропию? Для чего кости – это результат наименее определенным? Давайте рассчитаем энтропию и посмотрите, как оказывается ответ.

entropy <- function(x){
  pr <- prop.table(table(x))
  H <- sum(pr * log(pr,2))
  return(-H)
}

dice1 <- 1:6
dice2 <- c(1,1,1,1,2:6)
entropy(dice1) # --> 2.585
entropy(dice2) # --> 2.281

Как вы, возможно, ожидали, более справедливые кости имеют более высокую энтропию.

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

Недобросовестные кубики дают нам дополнительную информацию – некоторые результаты гораздо чаще, чем другие – поэтому существует меньше неопределенности в результате результата.

По этому рассуждению мы можем видеть, что энтропия будет наивысшим, когда каждый результат одинаково вероятно. Этот тип распределения вероятностей называется «равномерным» распределением.

Кросс-энтропия является расширением концепции энтропии, которая учитывает второе распределение вероятностей.

crossEntropy <- function(x,y){
  prX <- prop.table(table(x))
  prY <- prop.table(table(y))
  H <- sum(prX * log(prY,2))
  return(-H)
}

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

Это различие или «расхождение», может быть определено количественно, расчет их Kullback-leibler divergence или кл-дивергенция.

KL-дивергенция двух распределений вероятностей Х и Y является:

Минимальное значение дивергенции KL между двумя распределениями равна нулю. Это происходит только тогда, когда распределения идентичны.

KL_divergence <- function(x,y){
  kl <- crossEntropy(x,y) - entropy(x)
  return(kl)
}

Одним из употреблений KL-дивергенции в контексте обнаружения корреляций является вычисление взаимной информации (Mi) двух переменных.

Взаимная информация может быть определена как «KL-дивергенция между совместным и маргинальным распределением двух случайных величин». Если они идентичны, Mi будет равен нулю. Если они совсем разные, то Mi будет положительным числом. Чем больше разных совместных и маргинальных распределений, тем выше М.И.

Чтобы понять это лучше, давайте найдя момент для пересмотра некоторых концепций вероятностей.

Совместное распределение переменных Х и Y это просто вероятность того, что они состоится. Например, если вы перевернули два монета X и Y, их совместное распределение будет отражать вероятность каждого наблюдаемого результата. Скажем, вы переворачиваете монеты 100 раз и получите результат «головы, головы» 40 раз. Совместное распределение будет отражать это.

P (x = h,/100,4

jointDist <- function(x,y){
  N <- length(x)
  u <- unique(append(x,y))
  joint <- c()
  for(i in u){
    for(j in u){
      f <- x[paste0(x,y) == paste0(i,j)]
      joint <- append(joint, length(f)/N)
    }
  }
  return(joint)
}

Маргинальное распределение – это распределение вероятности одной переменной в отсутствие любой информации о другой. Продукт двух маргинальных распределений дают вероятность двумя событиями союзника в предположении независимости.

Для приведенного листа монеты, скажем, оба монеты дают 50 головок и 50 хвостов. Их маргинальные распределения будут отражать это.

P (x = h)/100.5;/100.5

P (x = h) × 0,5 × 0,25

marginalProduct <- function(x,y){
  N <- length(x)
  u <- unique(append(x,y))
  marginal <- c()
  for(i in u){
    for(j in u){
      fX <- length(x[x == i]) / N
      fY <- length(y[y == j]) / N 
      marginal <- append(marginal, fX * fY)
    }
  }
  return(marginal)
}

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

Если монеты искренне независимы, то совместное распределение должно быть (приблизительно) одинаково для продукта маргинальных распределений. Если они каким-то образом зависят от зависимого, то будет расхождение.

В примере)>) ×). Это говорит о монетах оба земли на головах чаще, чем ожидается случайно.

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

mutualInfo <- function(x,y){
  joint <- jointDist(x,y)
  marginal <- marginalProduct(x,y)
  Hjm <- - sum(joint[marginal > 0] * log(marginal[marginal > 0],2))
  Hj <- - sum(joint[joint > 0] * log(joint[joint > 0],2))
  return(Hjm - Hj)
}

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

Биннинг

Один подход состоит в том, чтобы квантовать данные (сделать переменные дискретные). Это достигается путем биннинга (присвоение точек данных на дискретные категории).

Ключевой вопрос сейчас решает, сколько бункеров для использования. К счастью, оригинальная статья на максимальном информационном коэффициенте обеспечивает предложение: попробуйте большинство из них!

То есть попробуйте отличаться различными числами бункеров и посмотреть, что производит наибольший результат взаимной информации между переменными. Это поднимает две вызовы, хотя:

  1. Сколько булочек для попытки? Технически, вы можете квантовать переменную в любое количество контейнеров, просто сделав размер корзины вечно меньше.
  2. Взаимная информация чувствительна к количеству используемых контейнеров. Как вы справедливо сравните Mi между разным номером BINS?

Первая вызов означает, что это технически невозможно попробовать все возможное количество мусорных барабанов. Тем не менее, авторы бумаги предлагают эвристический Решение (то есть решение, которое не является «гарантированным идеальным», но является довольно хорошим приближением). Они также предполагают верхний предел на количество контейнеров, чтобы попробовать.

Что касается довольно сравнения значений Mi между различными схемами для биндингов, есть простое исправление … нормализовать его! Это можно сделать, разделив каждый счет Mi на максимум, что это может теоретически принимать для этой конкретной комбинации мусорных веществ.

Совокупность биннинга, которая производит самую высокую нормализованную MI в целом, является тем, кто используется.

Высочайший нормализованный Mi затем сообщается как максимальный информационный коэффициент (или «MIC») для этих двух переменных. Давайте проверим какой-то код, который оценит микрофон из двух непрерывных переменных.

MIC <- function(x,y){
  N <- length(x)
  maxBins <- ceiling(N ** 0.6)
  MI <- c()
  for(i in 2:maxBins) {
    for (j in 2:maxBins){
      if(i * j > maxBins){
        next
      }
      Xbins <- i; Ybins <- j
      binnedX <-cut(x, breaks=Xbins, labels = 1:Xbins)
      binnedY <-cut(y, breaks=Ybins, labels = 1:Ybins)
      MI_estimate <- mutualInfo(binnedX,binnedY)
      MI_normalized <- MI_estimate / log(min(Xbins,Ybins),2)
      MI <- append(MI, MI_normalized)
    }
  }
  return(max(MI))
}

x <- runif(100,-10,10)
y <- x**2 + rnorm(100,0,10)
MIC(x,y) # --> 0.751

Приведенный выше код представляет собой упрощение метода, изложенного в исходной бумаге. Более верная реализация алгоритма доступна в R пакет Минерва Отказ В Python вы можете использовать Минепы модуль Отказ

MIC способен выбирать все виды линейных и нелинейных отношений и нашел использование в диапазоне различных приложений. Он связан между 0 и 1, с более высокими значениями, указывающими на большую зависимость.

Доверительные интервалы?

Чтобы установить доверие к оценкам микрофона, вы можете просто использовать метод загрузки, как тот, который мы смотрели на ранее.

Чтобы обобщить функцию Bootstrap, мы можем воспользоваться преимуществами функциональных возможностей программирования R, передавая технику, которую мы хотим использовать в качестве аргумента.

bootstrap <- function(x,y,func,reps,alpha){
  estimates <- c()
  original <- data.frame(x,y)
  N <- dim(original)[1]
  for(i in 1:reps){
    S <- original[sample(1:N, N, replace = TRUE),]
    estimates <- append(estimates, func(S$x, S$y))
  }
  l <- alpha/2 ; u <- 1 - l
  interval <- quantile(estimates, c(u, l))
  return(2*(func(x,y)) - as.numeric(interval[1:2]))
}

bootstrap(x,y,MIC,100,0.05) # --> 0.594 to 0.88

Резюме

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

Шум

set.seed(123)

# Noise
x0 <- rnorm(100,0,1)
y0 <- rnorm(100,0,1)
plot(y0~x0, pch = 18)

cor(x0,y0)
distanceCorrelation(x0,y0)
MIC(x0,y0)
  • Пирсон R = – 0,05.
  • Расстояние.157.
  • Mic.097.

Простая линейная

# Simple linear relationship
x1 <- -20:20
y1 <- x1 + rnorm(41,0,4)
plot(y1~x1, pch =18)

cor(x1,y1)
distanceCorrelation(x1,y1)
MIC(x1,y1)
  • Пирсон R = + 0,95
  • Расстояние.95.
  • Mic.89.

Простое квадратичное

# y ~ x**2
x2 <- -20:20
y2 <- x2**2 + rnorm(41,0,40)
plot(y2~x2, pch = 18)

cor(x2,y2)
distanceCorrelation(x2,y2)
MIC(x2,y2)
  • Пирсон R = + 0,003
  • Расстояние.474.
  • Mic.594.

Тригонометрический

# Cosine
x3 <- -20:20
y3 <- cos(x3/4) + rnorm(41,0,0.2)
plot(y3~x3, type='p', pch=18)

cor(x3,y3)
distanceCorrelation(x3,y3)
MIC(x3,y3)
  • Пирсон R = – 0,035.
  • Расстояние.382.
  • Mic.484.

Круг

# Circle

n <- 50
theta <- runif (n, 0, 2*pi)
x4 <- append(cos(theta), cos(theta))
y4 <- append(sin(theta), -sin(theta))
plot(x4,y4, pch=18)

cor(x4,y4)
distanceCorrelation(x4,y4)
MIC(x4,y4)
  • Пирсон R <0,001.
  • Расстояние.234.
  • Mic.218.

Спасибо за прочтение!