GSL и корреляция
Я использую библиотеку GSL 1.14 и оболочку ruby ( gsl) для некоторых математических вычислений. Одна вещь, которая мне нужна, это корреляция Пирсона. Но у меня проблема, когда 0 в моем массиве.
Например, у меня есть этот фрагмент кода:
x = [1,2,2,2,12]
y = [1,2,1,3,33]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> 0.9967291641974002
Но когда я пытаюсь вычислить его с помощью следующих значений массива, я получаю NaN:
x = [1,1,1]
y = [1,1,1]
or
x = [0,1,1]
y = [1,1,1]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> NaN
И когда я пытаюсь с этими значениями, это работает:
x = [0,1,1]
y = [1,0,1]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> -0.5
Кто-нибудь знает почему? это очень странно, не правда ли?
2 ответа
Я не знаю реализацию GSL, но в целом вычисление коэффициента корреляции Пирсона включает деление на оба стандартных отклонения, поэтому, если любое из них равно 0, вычисление не выполняется. Стандартное отклонение равно 0, если все векторные элементы равны. Все ваши неудачные примеры имеют один вектор с равными элементами. Надеюсь, это ответит на ваш вопрос.
Теоретически корреляция означает нахождение связи между двумя наборами данных. Она может быть положительной или отрицательной в зависимости от структуры наборов данных. Но то, что я хотел передать, это когда у вас есть 0 в качестве одного из элементов ваших наборов данных, вы не можете сопоставить количество 0 с другим ненулевым элементом другого набора данных. Вот почему он дает NaN.