scikit-learn/sklearn/decomposition/tests/test_factor_analysis.py

83 lines
3.0 KiB
Python
Raw Normal View History

2012-09-13 22:51:22 +08:00
# Author: Christian Osendorfer <osendorf@gmail.com>
# Alexandre Gramfort <alexandre.gramfort@inria.fr>
# Licence: BSD3
import numpy as np
2013-10-23 20:36:42 +08:00
from sklearn.utils.testing import assert_warns
2013-09-04 04:23:08 +08:00
from sklearn.utils.testing import assert_equal
from sklearn.utils.testing import assert_greater
from sklearn.utils.testing import assert_less
2012-10-25 23:09:46 +08:00
from sklearn.utils.testing import assert_raises
from sklearn.utils.testing import assert_almost_equal
from sklearn.utils.testing import assert_array_almost_equal
from sklearn.exceptions import ConvergenceWarning
2012-09-13 22:51:22 +08:00
from sklearn.decomposition import FactorAnalysis
def test_factor_analysis():
# Test FactorAnalysis ability to recover the data covariance structure
rng = np.random.RandomState(0)
2012-09-13 22:51:22 +08:00
n_samples, n_features, n_components = 20, 5, 3
# Some random settings for the generative model
W = rng.randn(n_components, n_features)
# latent variable of dim 3, 20 of it
h = rng.randn(n_samples, n_components)
# using gamma to model different noise variance
# per component
2012-12-22 20:02:50 +08:00
noise = rng.gamma(1, size=n_features) * rng.randn(n_samples, n_features)
# generate observations
# wlog, mean is 0
X = np.dot(h, W) + noise
assert_raises(ValueError, FactorAnalysis, svd_method='foo')
fa_fail = FactorAnalysis()
fa_fail.svd_method = 'foo'
assert_raises(ValueError, fa_fail.fit, X)
2013-09-04 04:09:06 +08:00
fas = []
for method in ['randomized', 'lapack']:
2013-09-04 03:24:06 +08:00
fa = FactorAnalysis(n_components=n_components, svd_method=method)
fa.fit(X)
2013-09-04 04:09:06 +08:00
fas.append(fa)
X_t = fa.transform(X)
2013-09-04 04:23:08 +08:00
assert_equal(X_t.shape, (n_samples, n_components))
2013-09-06 03:46:34 +08:00
assert_almost_equal(fa.loglike_[-1], fa.score_samples(X).sum())
assert_almost_equal(fa.score_samples(X).mean(), fa.score(X))
2012-10-12 05:01:01 +08:00
diff = np.all(np.diff(fa.loglike_))
assert_greater(diff, 0., 'Log likelihood dif not increase')
# Sample Covariance
scov = np.cov(X, rowvar=0., bias=1.)
2012-09-13 22:51:22 +08:00
# Model Covariance
mcov = fa.get_covariance()
diff = np.sum(np.abs(scov - mcov)) / W.size
assert_less(diff, 0.1, "Mean absolute difference is %f" % diff)
fa = FactorAnalysis(n_components=n_components,
noise_variance_init=np.ones(n_features))
assert_raises(ValueError, fa.fit, X[:, :2])
2013-09-04 04:09:06 +08:00
f = lambda x, y: np.abs(getattr(x, y)) # sign will not be equal
fa1, fa2 = fas
for attr in ['loglike_', 'components_', 'noise_variance_']:
assert_almost_equal(f(fa1, attr), f(fa2, attr))
2013-10-23 20:36:42 +08:00
fa1.max_iter = 1
fa1.verbose = True
assert_warns(ConvergenceWarning, fa1.fit, X)
# Test get_covariance and get_precision with n_components == n_features
# with n_components < n_features and with n_components == 0
for n_components in [0, 2, X.shape[1]]:
fa.n_components = n_components
fa.fit(X)
cov = fa.get_covariance()
precision = fa.get_precision()
2014-02-01 21:26:10 +08:00
assert_array_almost_equal(np.dot(cov, precision),
np.eye(X.shape[1]), 12)