【发布时间】:2020-08-06 18:14:34
【问题描述】:
一开始,我有 400,000 张经过归一化的图像(灰度值增加)。之后,我对每张图片进行了 DFT,得到了 400000 个样本的数据,具有 3200 个绝对傅立叶系数。
现在我想做一个 PCA 和 SVD。 由于我的数据已经标准化并且所有值都具有相同的单位,我认为我可以使用“原始数据”进行计算。 但是,PCA 的特征值和 SVD 的奇异值是不同的。 (显示图片/链接)
我做错了什么? PCA 和 SVD 应该如何获取数据?标准化、标准化、原始?
请帮帮我!谢谢
我的代码:
# samples 400000x3200
# SVD
U,S,VT = svd(samples, full_matrices=False)
tot_S = sum(S)
var_exp_S = [(i / tot_S) for i in S]
cum_var_exp_S = np.cumsum(var_exp_S)
# PCA
cov_mat = np.cov(samples.T)
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
eigen_vals = np.asarray(sorted(eigen_vals,reverse=True))
tot = sum(eigen_vals)
var_exp = [(i / tot) for i in eigen_vals]
cum_var_exp = np.cumsum(var_exp)
num= 3200
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.title('PCA')
plt.step(range(1,num+1),cum_var_exp[:num], where='mid',color='r')
plt.ylabel('share of variance')
plt.xlabel('principal components')
plt.legend()
plt.grid()
plt.subplot(122)
plt.title('SVD')
plt.step(range(1,num+1),cum_var_exp_S[:num], where='mid',color='r')
plt.ylabel('share of variance')
plt.xlabel('principal components')
plt.legend()
plt.grid()
【问题讨论】:
-
pca 的标准化由 cov() 完成。数值问题可能存在问题。我建议使用来自维基百科或类似的一些简单数据来验证您的类型变量。 (我不记得 svd 和 pca 之间的依赖关系,因为在我的库中我使用幂迭代而不是 svd)
-
首先,非常感谢您的回答。我找到了我在代码中使用的 svd 函数的依赖项:“相应的(可能非零)特征值由 s**2 给出。”所以关于你的回答我不需要 cov() 因为数据已经标准化了?然后我可以通过 np.linalg.eigh((samples.T).dot(samples) 直接用“原始数据”计算特征值?
-
不,我猜你需要 SVD。我只是这样做,因为我不想自己实现 svd。对于标准化,问题可能就是您的意思。 PCA 中有一些部分会进行一些标准化。我把它放到一个答案中......:
标签: normalization pca svd eigenvalue standardized