【Numpy学習記録】np.cov詳細

29467 ワード

編の前に書く
確率論と統計学において,共分散は2つの変数の全体誤差を測定するために用いられる.一方,分散は共分散の特殊な場合,すなわち2つの変数が同じ場合である.その定義の数学的形式は,Cov(X,Y)=E[(X−E(X))(Y−E(Y))]=E[X Y]−E[X]E[Y]Cov(X,Y)=E[(X−E(X)(Y−E(Y))]=E[XY]−E[X]E[Y]Cov(X,Y)=E[(X−E(X)(Y)]=E[XY]−E[X]E[Y]Cov(X,Y)=E[(X−E(X)](Y−E(Y)=E[XY]−E[X]E[Y]である.
きょうぶんさんすうがくけいしき
  • 式c o v(X,Y)=Σi=1 n(X i−X)ˉ ) ( Y i − Y ˉ ) n − 1 cov(X,Y) =\frac{\sum_{i=1}^n(X_i-\bar{X})(Y_i-\bar{Y})}{n-1} cov(X,Y)=n−1∑i=1n​(Xi​−Xˉ)(Yi​−Yˉ)​
  • 結果形式
  • C = ( c o v ( 1 , 1 ) c o v ( 1 , 2 ) c o v ( 1 , 3 ) ⋯ c o v ( 1 , n ) c o v ( 2 , 1 ) c o v ( 2 , 2 ) c o v ( 2 , 3 ) ⋯ c o v ( 2 , n ) c o v ( 3 , 1 ) c o v ( 3 , 2 ) c o v ( 3 , 3 ) ⋯ c o v ( 3 , n ) ⋮ ⋮ ⋮ ⋱ ⋮ c o v ( n , 1 ) c o v ( n , 2 ) c o v ( n , 3 ) ⋯ c o v ( n , n ) ) C =\begin{pmatrix}\color{#F00}{cov(1,1)} &\color{#0F0}{cov(1,2)} &\color{#F0F}{cov(1,3)} &\cdots & cov(1,n)\\\color{#0F0}{cov(2,1)} &\color{#F00}{cov(2,2)} & cov(2,3) &\cdots & cov(2,n)\\\color{#F0F}{cov(3,1)} & cov(3,2) &\color{#F00}{cov(3,3)} &\cdots & cov(3,n)\\\vdots &\vdots&\vdots &\ddots &\vdots\\cov(n,1) & cov(n,2) & cov(n,3) &\cdots &\color{#F00}{cov(n,n)}\end{pmatrix} C=⎝⎜⎜⎜⎜⎜⎛​cov(1,1)cov(2,1)cov(3,1)⋮cov(n,1)​cov(1,2)cov(2,2)cov(3,2)⋮cov(n,2)​cov(1,3)cov(2,3)cov(3,3)⋮cov(n,3)​⋯⋯⋯⋱⋯​cov(1,n)cov(2,n)cov(3,n)⋮cov(n,n)​⎠⎟⎟⎟⎟⎟⎞​
    きょうぶんさんコードけいしき
    関数プロトタイプ:def cov(m,y=None,rowvar=True,bias=False,ddof=None,fweights=None,aweights=None)
  • m:1次元または2次元の配列で、デフォルトでは各行は変数(属性)を表し、各列は観測
  • を表す.
  • y:mと同じ形式のデータのセット
  • rowvar:デフォルトはTrueで、各行は変数(属性)を表し、各列は観測を表す.Falseの場合、逆
  • bias:デフォルトはFalseで、標準化時にn-1で割る.逆にnです.ここでnは観測数
  • である
  • ddof:タイプはintであり、その値がNoneでない場合、biasパラメータの役割は無効になります.ddof=1の場合、fweightsパラメータとaweightsパラメータが指定されている場合でも、オフセットなし推定(n-1で除算)が返されます.ddof=0の場合、単純平均値が返されます.
  • frequency weights:1次元配列は、観測ごとに繰り返される回数(観測に重みを与えることに相当)
  • を表す.
  • analytic weights:観測ベクトルの重みを表す1次元配列.「重要」とされる観察では、これらの相対的な重みは通常大きく、あまり重要ではないと考えられる観察では、これらの相対的な重みは小さい.ddof=0の場合、重み配列を使用して確率を観測ベクトルに割り当てることができます.

  • コードの例
    きほんしよう
    import numpy as np
    
    #         ,        
    #     cov(T, S, M)
    T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
    S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
    M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
    X = np.vstack((T, S, M))
    # X        
    #          ,     
    print(np.cov(X))
    
    # [[ 47.71969697 122.9469697  129.59090909]
    #  [122.9469697  370.08333333 374.59090909]
    #  [129.59090909 374.59090909 399.        ]]
    

      ポイント:共分散行列は、異なるサンプル間ではなく、異なる次元間の共分散を計算します.サンプルマトリクスを取得するには、まず行が何を表しているのか、列が何を表しているのかを明確にします.
    fweights
     frequency weights:観測ごとに繰り返される回数(観測に重みを与えることに相当)を表す1次元配列
    T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
    S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
    M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
    X = np.vstack((T, S, M))
    print(np.cov(X, None, True, False, fweights=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]))
    #          
    # [[ 47.71969697 122.9469697  129.59090909]
    #  [122.9469697  370.08333333 374.59090909]
    #  [129.59090909 374.59090909 399.        ]]
    
    
    T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
    S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
    M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
    X = np.vstack((T, S, M))
    print(np.cov(X, None, True, False, fweights=[2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]))
    #     ,        X      [9,39,38].T
    # [[ 45.6025641  121.55769231 128.43589744]
    #  [121.55769231 381.42307692 389.30769231]
    #  [128.43589744 389.30769231 415.76923077]]
    
    
    T = np.array([9, 9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
    S = np.array([39, 39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
    M = np.asarray([38, 38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
    X = np.vstack((T, S, M))
    print(np.cov(X, None, True, False))
    #            ~
    # [[ 45.6025641  121.55769231 128.43589744]
    #  [121.55769231 381.42307692 389.30769231]
    #  [128.43589744 389.30769231 415.76923077]]
    
    

    aweights
    残念ながら、しばらくその計算方法が分かりません.時間があれば、ソースコードの計算方法をよく見てから、修正します.
    注意事項
    パラメータy
    T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
    S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
    M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
    X = np.vstack((T, S, M))
    
    #       ,            ,      m, y,               ,hhh
    print(np.cov(X[0:1], X[1:]))
    
    # [[ 47.71969697 122.9469697  129.59090909]
    #  [122.9469697  370.08333333 374.59090909]
    #  [129.59090909 374.59090909 399.        ]]
    

    分散との区別
    >>> a = [1,2,3,4]  #  a      
    >>> import numpy as np
    >>> np.cov(a)  #       
    array(1.66666667)
    >>> np.var(a)  #       
    1.25
    
        cov(a)   var(a)   
    >>> 1.666666666666666667*3/4
    1.25
    >>>