Python: корреляция Пирсона между двумя (одинаковыми / не идентичными) массивами возвращается из диапазона значений - PullRequest
1 голос
/ 23 мая 2019

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

Я использую numpy для расчета ковариации и стандартного отклонения.

import numpy as np

a = [1 , 2 , 3 , 4]
covariance = np.cov(a,a)[0][1]
stddeviation = (np.std(a))
correlation = covariance / (stddeviation * stddeviation)

covariance = 1.6666666666666665

stddeviation = 1.118033988749895

correlation = 1.333333333333333

, тогда как диапазон корреляции равен [-1,1], поэтому значение выше должно быть ниже 1.

Отредактировано :

Когда я использую UDF для этого на фрейме данных pyspark с добавлением bias = True в функции np.cov ().Я все еще получаю корреляцию за пределами диапазона.

df = sc.parallelize(
    [([0.0, 0.0, 0.0, 0.0, 0.066, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
      ,[0.0, 0.0, 0.0, 0.0, 0.02, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
     ) , ([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.411666666666666, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
          , [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.01, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
         ) , ([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.2733333333333332, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
              , [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.29, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]
).toDF(["array1" , "array2"])
@psf.udf (FloatType())
def calc_cov(val1 , val2):
    import numpy as np
    val = np.cov(val1 , val2 , bias = True)[0][1]
    return float(val)

@psf.udf (FloatType())
def calc_std_dev(val1):
    import numpy as np
    val = np.std(val1)
    return float(val)

df = df.withColumn(
    "covariance" , psf.round(calc_cov(psf.col("array1") , psf.col("array2")) , 4)
).withColumn(
    "sd_feat1" , psf.round(calc_std_dev(psf.col("array1")) , 4)
).withColumn(
    "sd_feat2" , psf.round(calc_std_dev(psf.col("array2")) , 4)
).withColumn(
    "correlation" , psf.round(psf.col("covariance") / (psf.col("sd_feat1")*psf.col("sd_feat2")) , 4)
).withColumn(
    "pearson_dist" , psf.round(int(1) - (psf.col("correlation")) , 4)
)

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

...