def test_anova_kernel(dist, degree, kernel): # compute exact kernel gram = anova(X, Y, degree) # approximate kernel mapping rk_transform = RandomKernel(n_components=1000, random_state=0, kernel=kernel, degree=degree, distribution=dist, p_sparse=0.5) X_trans = rk_transform.fit_transform(X) Y_trans = rk_transform.transform(Y) kernel_approx = np.dot(X_trans, Y_trans.T) error = gram - kernel_approx assert np.abs(np.mean(error)) < 0.0001 assert np.max(error) < 0.001 # nothing too far off assert np.mean(error) < 0.0005 # mean is fairly close # sparse input X_trans_sp = rk_transform.transform(X_sp) assert_allclose_dense_sparse(X_trans, X_trans_sp) # sparse output if dist == "sparse_rademacher": rk_transform.dense_output = False X_trans_sp = rk_transform.transform(X_sp) assert issparse(X_trans_sp) assert_allclose_dense_sparse(X_trans, X_trans_sp.toarray()) else: rk_transform.dense_output = False X_trans_sp = rk_transform.transform(X_sp) assert not issparse(X_trans_sp) assert_allclose_dense_sparse(X_trans, X_trans_sp)
def test_all_subsets_kernel(dist): # compute exact kernel p_sparse = 0.5 kernel = all_subsets(X, Y) # approximate kernel mapping rk_transform = RandomKernel(n_components=5000, random_state=0, kernel='all_subsets', distribution=dist, p_sparse=p_sparse) X_trans = rk_transform.fit_transform(X) Y_trans = rk_transform.transform(Y) kernel_approx = np.dot(X_trans, Y_trans.T) error = kernel - kernel_approx if dist == 'sparse_rademacher': nnz = rk_transform.random_weights_.nnz nnz_expect = np.prod(rk_transform.random_weights_.shape)*p_sparse nnz_var = np.sqrt(nnz_expect * (1-p_sparse)) assert np.abs(nnz-nnz_expect) < 3*nnz_var assert np.abs(np.mean(error)) < 0.01 assert np.max(error) < 0.1 # nothing too far off assert np.mean(error) < 0.05 # mean is fairly close X_trans_sp = rk_transform.transform(X_sp) assert_allclose_dense_sparse(X_trans, X_trans_sp)