def test_randomized_pca_inverse(self): # Test that randomized PCA is inversible on dense data rng = np.random.RandomState(0) n, p = 50, 3 X = mt.tensor(rng.randn(n, p)) # spherical data X[:, 1] *= .00001 # make middle component relatively small X += [5, 4, 3] # make a large mean # same check that we can find the original data from the transformed signal # (since the data is almost of rank n_components) pca = PCA(n_components=2, svd_solver='randomized', random_state=0).fit(X) Y = pca.transform(X) Y_inverse = pca.inverse_transform(Y) assert_almost_equal(X.to_numpy(), Y_inverse.to_numpy(), decimal=2) # same as above with whitening (approximate reconstruction) pca = PCA(n_components=2, whiten=True, svd_solver='randomized', random_state=0).fit(X) Y = pca.transform(X) Y_inverse = pca.inverse_transform(Y) relative_max_delta = (mt.abs(X - Y_inverse) / mt.abs(X).mean()).max() self.assertLess(relative_max_delta.to_numpy(), 1e-5)
def testMultiOutputsOp(self): sess = new_session() rs = np.random.RandomState(0) raw = rs.rand(20, 5) a = mt.tensor(raw, chunk_size=5) q = mt.abs(mt.linalg.qr(a)[0]) ret = sess.run(q) np.testing.assert_almost_equal(ret, np.abs(np.linalg.qr(raw)[0])) self.assertEqual(len(sess._sess.executor.chunk_result), len(get_tiled(q).chunks))
def test_randomized_pca_check_projection(self): # Test that the projection by randomized PCA on dense data is correct rng = np.random.RandomState(0) n, p = 100, 3 X = mt.tensor(rng.randn(n, p) * .1) X[:10] += mt.array([3, 4, 5]) Xt = 0.1 * mt.tensor(rng.randn(1, p)) + mt.array([3, 4, 5]) Yt = PCA(n_components=2, svd_solver='randomized', random_state=0).fit(X).transform(Xt) Yt /= np.sqrt((Yt**2).sum()) assert_almost_equal(mt.abs(Yt[0][0]).to_numpy(), 1., 1)
def test_pca_check_projection(setup): # Test that the projection of data is correct rng = np.random.RandomState(0) n, p = 100, 3 X = mt.tensor(rng.randn(n, p) * .1) X[:10] += mt.array([3, 4, 5]) Xt = 0.1 * mt.tensor(rng.randn(1, p)) + mt.array([3, 4, 5]) for solver in solver_list: Yt = PCA(n_components=2, svd_solver=solver).fit(X).transform(Xt) Yt /= mt.sqrt((Yt ** 2).sum()) assert_almost_equal(mt.abs(Yt[0][0]).to_numpy(), 1., 1)