При расчете корреляции между двумя одинаковыми массивами корреляция, которая должна быть равна 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.