numpyとscikit-learnでcovarianceを出す関数への入力形式が異なる

scikit-learn…shape (array.shape) が [n_observations, n_features]
numpy…rowがvariable, columnがobservation

>>> import numpy
>>> from sklearn.covariance import EmpiricalCovariance, MinCovDet

>>> a = numpy.array([[99,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> numpy.cov(a)
array([[  2.35291667e+03,  -4.78333333e+01,  -4.78333333e+01],
       [ -4.78333333e+01,   1.66666667e+00,   1.66666667e+00],
       [ -4.78333333e+01,   1.66666667e+00,   1.66666667e+00]])
>>> EmpiricalCovariance().fit(a).covariance_
array([[ 1924.66666667,  -121.33333333,  -121.33333333,  -121.33333333],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667]])

つらい

また、sklearnのEmpiricalCovarianceでやった方がナイーブに実装した時と同じような行列になる

(20161024)

>>> numpy.cov(a.T, bias=True)
array([[ 1924.66666667,  -121.33333333,  -121.33333333,  -121.33333333],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667],
       [ -121.33333333,    10.66666667,    10.66666667,    10.66666667]])

普段は不偏推定量を出しているらしい。bias=Trueにすると最尤推定の分散を出力する