def test_corrpsd_threshold(): x = np.array([[1, -0.9, -0.9], [-0.9, 1, -0.9], [-0.9, -0.9, 1]]) #print np.linalg.eigvalsh(x) for threshold in [0, 1e-15, 1e-10, 1e-6]: y = corr_nearest(x, n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) #print 'evals', evals, threshold assert_allclose(evals[0], threshold, rtol=1e-6, atol=1e-15) y = corr_clipped(x, threshold=threshold) evals = np.linalg.eigvalsh(y) #print 'evals', evals, threshold assert_allclose(evals[0], threshold, rtol=0.25, atol=1e-15) y = cov_nearest(x, method='nearest', n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) #print 'evals', evals, threshold #print evals[0] / threshold - 1 assert_allclose(evals[0], threshold, rtol=1e-6, atol=1e-15) y = cov_nearest(x, n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) #print 'evals', evals, threshold #print evals[0] / threshold - 1 assert_allclose(evals[0], threshold, rtol=0.25, atol=1e-15)
def test_clipped(self): x = self.x res_r = self.res y = corr_clipped(x, threshold=1e-7) #print np.max(np.abs(x - y)), np.max(np.abs((x - y) / y)) assert_almost_equal(y, res_r.mat, decimal=1) d = norm_f(x, y) assert_allclose(d, res_r.normF, rtol=0.15) evals = np.linalg.eigvalsh(y) assert_allclose(evals, res_r.eigenvalues[::-1], rtol=0.1, atol=1e-7) assert_allclose(evals[0], 1e-7, rtol=0.02)
def sample(): trained_generator = tf.keras.models.load_model(saved_model_name, compile=False) noise = tf.random.normal([1, n]) generated_image = trained_generator(noise, training=False) a, b = np.triu_indices(n, k=1) corr = np.array(generated_image[0,:,:,0]) np.fill_diagonal(corr, 1) corr[b, a] = corr[a, b] nearest_corr = corr_clipped(corr) np.fill_diagonal(nearest_corr, 1) nearest_corr[b, a] = nearest_corr[a, b] return nearest_corr
def test_corr_psd(): # test positive definite matrix is unchanged x = np.array([[1, -0.2, -0.9], [-0.2, 1, -0.2], [-0.9, -0.2, 1]]) y = corr_nearest(x, n_fact=100) #print np.max(np.abs(x - y)) assert_almost_equal(x, y, decimal=14) y = corr_clipped(x) assert_almost_equal(x, y, decimal=14) y = cov_nearest(x, n_fact=100) assert_almost_equal(x, y, decimal=14) x2 = x + 0.001 * np.eye(3) y = cov_nearest(x2, n_fact=100) assert_almost_equal(x2, y, decimal=14)
def test_corrpsd_threshold(threshold): x = np.array([[1, -0.9, -0.9], [-0.9, 1, -0.9], [-0.9, -0.9, 1]]) y = corr_nearest(x, n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) assert_allclose(evals[0], threshold, rtol=1e-6, atol=1e-15) y = corr_clipped(x, threshold=threshold) evals = np.linalg.eigvalsh(y) assert_allclose(evals[0], threshold, rtol=0.25, atol=1e-15) y = cov_nearest(x, method='nearest', n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) assert_allclose(evals[0], threshold, rtol=1e-6, atol=1e-15) y = cov_nearest(x, n_fact=100, threshold=threshold) evals = np.linalg.eigvalsh(y) assert_allclose(evals[0], threshold, rtol=0.25, atol=1e-15)
# x has negative eigenvalues, not definite x = np.array([[1, -0.9, -0.9], [-0.9, 1, -0.9], [-0.9, -0.9, 1]]) #x = np.array([[1, 0.2, 0.2], [0.2, 1, 0.2], [0.2, 0.2, 1]]) n_fact = 2 print('evals original', np.linalg.eigvalsh(x)) y = corr_nearest(x, n_fact=100) print('evals nearest', np.linalg.eigvalsh(y)) print(y) y = corr_nearest(x, n_fact=100, threshold=1e-16) print('evals nearest', np.linalg.eigvalsh(y)) print(y) y = corr_clipped(x, threshold=1e-16) print('evals clipped', np.linalg.eigvalsh(y)) print(y) np.set_printoptions(precision=4) print('\nMini Monte Carlo') # we are simulating a uniformly distributed symmetric matrix # and find close positive definite matrix # original can be far away from positive definite, # then original and converted matrices can be far apart in norm # results are printed for visual inspection of different cases k_vars = 5 diag_idx = np.arange(k_vars) for ii in range(10): print()
# x has negative eigenvalues, not definite x = np.array([[1, -0.9, -0.9], [-0.9, 1, -0.9], [-0.9, -0.9, 1]]) #x = np.array([[1, 0.2, 0.2], [0.2, 1, 0.2], [0.2, 0.2, 1]]) n_fact = 2 print 'evals original', np.linalg.eigvalsh(x) y = corr_nearest(x, n_fact=100) print 'evals nearest', np.linalg.eigvalsh(y) print y y = corr_nearest(x, n_fact=100, threshold=1e-16) print 'evals nearest', np.linalg.eigvalsh(y) print y y = corr_clipped(x, threshold=1e-16) print 'evals clipped', np.linalg.eigvalsh(y) print y np.set_printoptions(precision=4) print '\nMini Monte Carlo' # we are simulating a uniformly distributed symmetric matrix # and find close positive definite matrix # original can be far away from positive definite, # then original and converted matrices can be far apart in norm # results are printed for visual inspection of different cases k_vars = 5 diag_idx = np.arange(k_vars) for ii in range(10): print