Отладка ошибки в "Statistics.corr" в библиотеке mlib - PullRequest
0 голосов
/ 16 апреля 2019

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

Ниже приведен простой пример для вычисления корреляции между двумя массивами:

  x=[-18,-18,-18,-17.95,-17.9,-17.95,-18,-18,-18,-18,-17.95,-17.9,-18,-18.1,-18.05,-18,-18,-18,-18.05,-18.1,-18.1,-18.1,-18.05,-18,-18,-18,-18.05,-18.1,-18.1,-18.1]

  x=np.asarray(x)

  x=sc.parallelize(x)

  x.count()
     30

  y=[4.10E-07,3.65E-07,3.20E-07,3.20E-07,3.20E-07,3.15E-07,3.10E-07,3.30E-07,3.45E-07,3.60E-07,4.60E-07,5.60E-07,6.35E-07,7.10E-07,6.80E-07,6.50E-07,5.20E-07,3.90E-07,4.15E-07,4.40E-07,5.05E-07,5.70E-07,4.90E-07,4.10E-07,3.50E-07,2.90E-07,2.85E-07,2.80E-07,3.40E-07,4.00E-07]
  y=np.asarray(y)

  y=sc.parallelize(y)

  y.count()
     30

 In [172]: pearson=Statistics.corr(x,y,method='pearson')
 2019-04-16 16:16:41 WARN  PearsonCorrelation:66 - Pearson 
  correlation matrix contains NaN values.

 In [173]: pearson
 Out[173]: nan

 In [174]: spearman=Statistics.corr(x,y,method='spearman')

  In [175]: spearman
  Out[175]: -0.21201144954413315

Следует отметить, что фактическое значение корреляции Пирсона для входа составляет -0,1945

1 Ответ

0 голосов
/ 17 апреля 2019

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

import numpy as np
from sklearn.preprocessing import normalize
from pyspark.mllib.stat import Statistics

x=[-18,-18,-18,-17.95,-17.9,-17.95,-18,-18,-18,-18,-17.95,-17.9,-18,-18.1,-18.05,-18,-18,-18,-18.05,-18.1,-18.1,-18.1,-18.05,-18,-18,-18,-18.05,-18.1,-18.1,-18.1]

x=normalize(x).reshape(-1,1)
x=sc.parallelize(x)

y=[4.10E-07,3.65E-07,3.20E-07,3.20E-07,3.20E-07,3.15E-07,3.10E-07,3.30E-07,3.45E-07,3.60E-07,4.60E-07,5.60E-07,6.35E-07,7.10E-07,6.80E-07,6.50E-07,5.20E-07,3.90E-07,4.15E-07,4.40E-07,5.05E-07,5.70E-07,4.90E-07,4.10E-07,3.50E-07,2.90E-07,2.85E-07,2.80E-07,3.40E-07,4.00E-07]
y=normalize(y).reshape(-1,1)
y=sc.parallelize(y)

Statistics.corr(x,y,method='pearson')

Out[16]: -0.1945022009093267

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

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