Я пытаюсь построить Матрицу корреляции Однако, когда я проверяю результаты, они не совпадают.
>>> from pyspark.sql.functions import corr
>>> df.agg(corr("A", "B")).show()
+----------------------------------+
|corr(A, B)|
+----------------------------------+
| 0.9942345980360309|
+----------------------------------+
с этим
>>> from pyspark.mllib.stat import Statistics
>>> f2=df[["A", "B"]].rdd.map(lambda row: row[0:])
>>> Statistics.corr(f2, method="pearson")
array([[ 1., nan],
[nan, 1.]])
«копейщик» выглядит хорошо
>>> Statistics.corr(f2, method="spearman")
array([[1. , 0.99339392],
[0.99339392, 1. ]])
Я вижу, что sql functions
дает корреляцию, которая кажется разумной, однако mllib
дает NaN
, которая кажется неправильной.Что я тут не так делаю?Документы говорят, что оба дают корреляцию Пирсона.
Нан появляется, когда Std Dev равен 0 .Однако здесь значения сигмы не равны 0:
>>> df[["A"]].describe().show()
...
| mean| 0.3052428786040861|
| stddev|0.06058014576499576|
>>> df[["B"]].describe().show()
...
| mean| 0.2867470019556179|
| stddev|0.05866565613026769|