我一直在阅读一些关于 PCA 的文档并尝试使用 scikit-learn 来实现它。但是我很难理解 sklearn.decompositon.PCA 返回的属性是什么从我在这里读到的和这个属性的名称我的第一个猜测是属性 .components_ 是主成分的矩阵,这意味着如果我们有数据集X 可以使用 SVD 分解为
X = USV^T
那么我希望属性 .components_ 等于
XV = 美国。
为了澄清这一点,我采用了奇异值分解(此处)的维基百科页面的第一个示例,并尝试实现它以查看是否获得了预期的结果。但我得到了一些不同的东西。为了确保我没有犯错,我使用 scipy.linalg.svd 对矩阵 X 进行奇异值分解,并获得了维基百科上描述的结果:
X = np.array([[1, 0, 0, 0, 2],
[0, 0, 3, 0, 0],
[0, 0, 0, 0, 0],
[0, 2, 0, 0, 0]])
U, s, Vh = svd(X)
print('U = %s'% U)
print('Vh = %s'% Vh)
print('s = %s'% s)
输出:
U = [[ 0. 1. 0. 0.]
[ 1. 0. 0. 0.]
[ 0. 0. 0. -1.]
[ 0. 0. 1. 0.]]
Vh = [[-0. 0. 1. 0. 0. ]
[ 0.4472136 0. 0. 0. 0.89442719]
[-0. 1. 0. 0. 0. ]
[ 0. 0. 0. 1. 0. ]
[-0.89442719 0. 0. 0. 0.4472136 ]]
s = [ 3. 2.23606798 2. 0. ]
但是通过 sk-learn 我得到了这个:
pca = PCA(svd_solver='auto', whiten=True)
pca.fit(X)
print(pca.components_)
print(pca.singular_values_)
输出是
[[ -1.47295237e-01 -2.15005028e-01 9.19398392e-01 -0.00000000e+00
-2.94590475e-01]
[ 3.31294578e-01 -6.62589156e-01 1.10431526e-01 0.00000000e+00
6.62589156e-01]
[ -2.61816759e-01 -7.17459719e-01 -3.77506920e-01 0.00000000e+00
-5.23633519e-01]
[ 8.94427191e-01 -2.92048264e-16 -7.93318415e-17 0.00000000e+00
-4.47213595e-01]]
[ 2.77516885e+00 2.12132034e+00 1.13949018e+00 1.69395499e-16]
这不等于 SV^T(我省去了矩阵乘法,因为无论如何你可以看到奇异值与上面获得的不同)。我试图看看如果我将参数设置为 False 或参数 svd_solver 设置为 'full' 会发生什么,但它不会改变结果。
您是否在某处看到错误,或者您有解释?