web-dev-qa-db-ja.com

Python numpy.corrcoef()RuntimeWarning:true_divide c / = stddev [:, None]で無効な値が見つかりました

corrcoefからのnumpyは、定数リストがcorrcoef()関数に渡されるとRuntimeWarningをスローするようです。たとえば、次のコードは警告をスローします:

import numpy as np
X = [1.0, 2.0, 3.0, 4.0]
Y = [2, 2, 2, 2]
print(np.corrcoef(X, Y)[0, 1])

警告:

/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py:3003: RuntimeWarning: invalid value encountered in true_divide
  c /= stddev[:, None]

リストの1つが定数の場合にこのエラーがスローされる理由と、定数リストが関数に渡されたときにこのエラーを回避する方法を誰かが説明できますか?.

10

相関とは、2つのベクトルが変化するときに、2つのベクトルが互いにどれだけうまく追跡するかの尺度です。 1つのベクトルが変化しない場合、相互の変化を追跡することはできません。

OPのコメントで述べたように、ピアソンの積率相関係数の は、XYの共分散を標準偏差の積で割ります。この例では、Yの分散はゼロなので、その標準偏差もゼロです。そのため、true_divideエラー-ゼロで除算しようとしています。

注:ゼロの問題を回避するために、エンジニアリングの観点から、Yのエントリの1つに非常に少量(たとえば、マシンイプシロンのすぐ上の値)を追加するのは魅力的であるように見えるかもしれません。部門の問題。しかし、それは統計的に実行可能ではありません。 1e-15は、追加する値に応じて、相関係数を大幅に混乱させます。

次の2つのケースの違いを考慮してください。

X = [1.0, 2.0, 3.0, 4.0]

tiny = 1e-15

# add tiny amount to second element
Y1 = [2., 2.+tiny, 2., 2.]
np.corrcoef(X, Y1)[0, 1] 
-0.22360679775

# add tiny amount to fourth element
Y2 = [2., 2., 2., 2.+tiny]
np.corrcoef(X, Y2)[0, 1]
0.67082039325

これは統計学者には明白かもしれませんが、質問の性質を考えると、関連する警告のように思えます。

16
andrew_reece