【发布时间】:2018-05-01 16:15:09
【问题描述】:
我正在尝试使用 numpy.linalg.eig 和两种不同的方法(在 eigenface 中使用协方差和 pca 方法)来实现 PCA,并将我的结果与 sklearn 的 PCA 进行比较。但是我观察到我的结果是不同的,所以我想知道我在做什么错误。我有 3 个样本,每个样本有 4 个特征。我正在尝试将样本的维度减少到 3。 编辑:使用 SVD 方法添加。我使用协方差 PCA 得到的结果,来自 sklearn 的 SVD 和 PCA 非常接近。但是使用“特征脸”方法完全不同,为什么? 将 numpy 导入为 np 从 sklearn.decomposition 导入 PCA
x = np.array([[0.5, 0.8, 1.5, -2.4], [-1.9, -8.7, 0.02, 4.9], [5.5,6.1, -8.1,3.0]])
print(x)
K = 3
# -- sklearn -- #
pca = PCA(n_components=K).fit(x)
res = pca.transform(x)
print('sklearn :', res)
# -- numpy covariance -- #
X = x - np.mean(x, axis = 0)
cov = np.cov(X.T)
print("covariance :", cov.shape)
evals , evecs = np.linalg.eig(cov)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
res2 = X.dot(evecs[:,:K])
print("numpy with cov:", res2)
# -- numpy scatter matrix -- #
X = x - np.mean(x, axis = 0)
C = np.dot(X, X.T)
evals , evecs = np.linalg.eig(C)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
v = np.dot(evecs, X)
print("v :", v.shape)
res3= X[:, :K].dot(v)
print('numpy with scatter matrix : ', res3)
# -- numpy svd -- #
X = x - np.mean(x, axis = 0)
U, S, V = np.linalg.svd(X, full_matrices=False)
U, V = svd_flip(U, V)
res2 = X.dot(V.T)
print("numpy with svd:", res2)
【问题讨论】: