Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Normalization PCA和SVD对相同单位数据的不同结果_Normalization_Pca_Svd_Eigenvalue_Standardized - Fatal编程技术网

Normalization PCA和SVD对相同单位数据的不同结果

Normalization PCA和SVD对相同单位数据的不同结果,normalization,pca,svd,eigenvalue,standardized,Normalization,Pca,Svd,Eigenvalue,Standardized,在开始的时候,我有400000张被标准化的图像(灰度值增加)。之后,我对每张图片进行DFT,得到了400000个样本和3200个绝对傅里叶系数的数据 现在我想做一个PCA和SVD因为我的数据已经标准化,所有值都有相同的单位,所以我想我可以使用“原始数据”进行计算。 然而,主成分分析的特征值和奇异值是不同的。(显示图片/链接) 我做错了什么?如何为PCA和SVD提供数据?标准化,标准化,原始 请帮帮我!多谢各位 我的代码: # samples 400000x3200 # SVD U,S,VT =

在开始的时候,我有400000张被标准化的图像(灰度值增加)。之后,我对每张图片进行DFT,得到了400000个样本和3200个绝对傅里叶系数的数据

现在我想做一个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中存在一些“正常化”。 下面是我自己的PCA库中的代码:


//normalize to center
centred = center( samples );
//normalize to square matrix
matrix = cov( centred );
//eigenvalue decomposition
vectors = evd( matrix );
//get normalized eigenvectors:
eigenvectors = get_eigenvectors( vectors );
//get eigenvalues:
eigenvalues = get_eigenvalues( vectors );

描述如下:M*M的特征值是M的奇异值的平方。

这里是一个示例:

import numpy as np
from scipy.linalg import svd
from sklearn.preprocessing import StandardScaler

X_train = np.asarray([[13.71,1.86,2.36,16.6],[12.22,1.29,1.94,19],
       [13.27,4.28,2.26,20],[13.16,3.57,2.15,21],
       [13.86,1.51,2.67,25]])

#PCA
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)

cov_mat = np.cov(X_train_std.T)
eigen_vals, eigen_vecs = np.linalg.eigh(cov_mat)
eigen_vals = np.asarray(sorted(eigen_vals, reverse=True))

#SVD
U,eigen_vals_S,V = svd(X_train)
eigen_vals_S2 = (eigen_vals_S**2)

print('\nEigenvalues \n%s' % eigen_vals)
print('\nS \n%s' %eigen_vals_S)
print('\nS**2 \n%s' %eigen_vals_S2)re
输出(特征值和值**2不同):

特征值 [2.79331043 1.28393579 0.90313734 0.01961644]

[55.02775284 3.37434634 2.52347705 0.28664958]

S**2 [3.02805358e+03 1.13862132e+01 6.36793643e+00 8.2167982E-02]

现在有相同的结果:

#Same eigenvalues
eigen_vals, eigen_vecs = np.linalg.eigh((X_train.T).dot(X_train))
eigen_vals = np.asarray(sorted(eigen_vals, reverse=True))

#SVD
U,eigen_vals_S,V = svd(X_train)
eigen_vals_S2 = (eigen_vals_S**2)

print('\nEigenvalues \n%s' % eigen_vals)
print('\nS \n%s' %eigen_vals_S)
print('\nS**2 \n%s' %eigen_vals_S2)
输出:

特征值 [3.02805358e+03 1.13862132e+01 6.36793643e+00 8.2167982E-02]

[55.02775284 3.37434634 2.52347705 0.28664958]

S**2 [3.02805358e+03 1.13862132e+01 6.36793643e+00 8.2167982E-02]

这就是我不明白的。标准化和cov()的方法是PCA的方法。但正如你所看到的,有不同的结果,这取决于我如何计算特征值


我有什么地方错了吗?为什么会错?

这些图像来自数据集(400000x3200):


pca的归一化由cov()完成。数值问题可能会引起争议。我建议使用一些来自wikipedia或类似网站的简单数据来验证您的类型变量。(我不记得svd和pca之间的依赖关系,因为在我的库中我使用power迭代而不是svd)首先,非常感谢您的回答。我发现我在代码中使用的svd函数有一个依赖关系:“相应的(可能非零)特征值由s**2给出。”所以关于你的答案,我不需要cov(),因为数据已经标准化了?然后我可以直接用np.linalg.eigh((samples.T).dot(samples)的“原始数据”计算特征值?不,我想你需要SVD。我只是和你一起做,因为我不想自己实现SVD。对于标准化,问题可能是你的意思。PCA中有一些部分做了一些标准化。我把它放在一个答案中…:所以我应该对原始数据使用PCA/SVD?这取决于你想用它做什么。PCA Normaly做奇异值分解以得到结果。你对奇异值的计划是什么?(我以前从未使用过它们。)好的,我试着用一个单独的答案来解释它…奇异值分解返回奇异值,而不是特征值。正如我的答案中所述,它们是相关的,但不是相等的,而是与奇异值分解的描述有关,即“在这两种情况下,对应的(可能非零)特征值由s**2给出。”当我对奇异值进行平方时,它应该是相同的……还是不?据我所知,它是:特征值_i(PCA(M*M))==奇异值_i(M)^2如果你只是想验证特征值,还有其他方法。我总是用pca的分数重建样本,这显示了数值问题。但我用标准化和cov()的“手动”方法是pca,不是吗?