web-dev-qa-db-ja.com

PythonおよびNumpyを使用した共分散の計算

Python Numpy関数covで共分散を計算する方法を見つけようとしています。2つの1次元配列を渡すと、2x2の結果のマトリックスが返されます。私は統計が得意ではありませんが、そのような状況での共分散は単一の数字であると信じています。 This は私が探しているものです。

def cov(a, b):

    if len(a) != len(b):
        return

    a_mean = np.mean(a)
    b_mean = np.mean(b)

    sum = 0

    for i in range(0, len(a)):
        sum += ((a[i] - a_mean) * (b[i] - b_mean))

    return sum/(len(a)-1)

それは機能しますが、使用方法がわかれば、Numpyバージョンの方がはるかに効率的だと思います。

誰も私が書いたようなNumpy cov関数を実行させる方法を知っていますか?

おかげで、

デイブ

48
Dave

abが1次元シーケンスの場合、numpy.cov(a,b)[0][1]cov(a,b)と同等です。

np.cov(a,b)によって返される2x2配列の要素は

cov(a,a)  cov(a,b)

cov(a,b)  cov(b,b)

(ここでも、covは上で定義した関数です。)

98
unutbu

説明してくれたunutbuに感謝します。デフォルトでは、numpy.covはサンプルの共分散を計算します。母集団の共分散を取得するには、次のように合計N個のサンプルで正規化を指定できます。

Covariance = numpy.cov(a, b, bias=True)[0][1]
print(Covariance)

またはこのように:

Covariance = numpy.cov(a, b, ddof=0)[0][1]
print(Covariance)
19
Osian