@@ -112,6 +112,7 @@ def test_ledoit_wolf():
112112 lw = LedoitWolf (assume_centered = True )
113113 lw .fit (X_centered )
114114 shrinkage_ = lw .shrinkage_
115+
115116 score_ = lw .score (X_centered )
116117 assert_almost_equal (ledoit_wolf_shrinkage (X_centered ,
117118 assume_centered = True ),
@@ -186,6 +187,38 @@ def test_ledoit_wolf():
186187 assert (lw .precision_ is None )
187188
188189
190+ def _naive_ledoit_wolf_shrinkage (X ):
191+ # A simple implementation of the formulas from Ledoit & Wolf
192+
193+ # The computation below achieves the following computations of the
194+ # "O. Ledoit and M. Wolf, A Well-Conditioned Estimator for
195+ # Large-Dimensional Covariance Matrices"
196+ # beta and delta are given in the beginning of section 3.2
197+ n_samples , n_features = X .shape
198+ emp_cov = empirical_covariance (X , assume_centered = False )
199+ mu = np .trace (emp_cov ) / n_features
200+ delta_ = emp_cov .copy ()
201+ delta_ .flat [::n_features + 1 ] -= mu
202+ delta = (delta_ ** 2 ).sum () / n_features
203+ X2 = X ** 2
204+ beta_ = 1. / (n_features * n_samples ) \
205+ * np .sum (np .dot (X2 .T , X2 ) / n_samples - emp_cov ** 2 )
206+
207+ beta = min (beta_ , delta )
208+ shrinkage = beta / delta
209+ return shrinkage
210+
211+
212+ def test_ledoit_wolf_small ():
213+ # Compare our blocked implementation to the naive implementation
214+ X_small = X [:, :4 ]
215+ lw = LedoitWolf ()
216+ lw .fit (X_small )
217+ shrinkage_ = lw .shrinkage_
218+
219+ assert_almost_equal (shrinkage_ , _naive_ledoit_wolf_shrinkage (X_small ))
220+
221+
189222def test_ledoit_wolf_large ():
190223 # test that ledoit_wolf doesn't error on data that is wider than block_size
191224 rng = np .random .RandomState (0 )
0 commit comments