Matlab 和 Python 对 PCA 产生不同的结果
Matlab and Python produces different results for PCA
我正在使用 PCA,我发现 Python 中的 sklearn 中的 PCA 和 Matlab 中的 pca() 产生了不同的结果。这是我正在使用的测试矩阵。
a = np.array([[-1,-1], [-2,-1], [-3, -2], [1,1], [2,1], [3,2]])
对于 Python sklearn,我得到了
p = PCA()
print(p.fit_transform(a))
[[-1.38340578 0.2935787 ]
[-2.22189802 -0.25133484]
[-3.6053038 0.04224385]
[ 1.38340578 -0.2935787 ]
[ 2.22189802 0.25133484]
[ 3.6053038 -0.04224385]]
对于 Matlab,我得到了
pca(a', 'Centered', false)
[0.2196 0.5340
0.3526 -0.4571
0.5722 0.0768
-0.2196 -0.5340
-0.3526 0.4571
-0.5722 -0.0768]
为什么会出现这种差异?
感谢丹的回答。现在的结果看起来很合理。但是,如果我使用随机矩阵进行测试,似乎 Matlab 和 Python 产生的结果不是彼此的标量倍数。为什么会这样?
test matrix a:
[[ 0.36671885 0.77268624 0.94687497]
[ 0.75741855 0.63457672 0.88671836]
[ 0.20818031 0.709373 0.45114135]
[ 0.24488718 0.87400025 0.89382836]
[ 0.16554686 0.74684393 0.08551401]
[ 0.07371664 0.1632872 0.84217978]]
Python 结果:
p = PCA()
p.fit_transform(a))
[[ 0.25305509 -0.10189215 -0.11661895]
[ 0.36137036 -0.20480169 0.27455458]
[-0.25638649 -0.02923213 -0.01619661]
[ 0.14741593 -0.12777308 -0.2434731 ]
[-0.6122582 -0.08568121 0.06790961]
[ 0.10680331 0.54938026 0.03382447]]
Matlab 结果:
pca(a', 'Centered', false)
0.504156973865138 -0.0808159771243340 -0.107296852182663
0.502756555190181 -0.174432053627297 0.818826939851221
0.329948209311847 0.315668718703861 -0.138813345638127
0.499181592718705 0.0755364557146097 -0.383301081533716
0.232039797509016 0.694464307249012 -0.0436361728092353
0.284905319274925 -0.612706345940607 -0.387190971583757
感谢丹一直以来的帮助。事实上,我发现这是对 Matlab 函数的滥用。 Matlab returns 默认主成分系数。使用 [~, score] = pca(a, 'Centered', true) 将得到与 Python.
相同的结果
PCA 处理特征向量。只要矢量是平行的,幅度就无关紧要(只是不同的归一化)。
在你的例子中,两者是彼此的标量倍数。尝试(在 MATLAB 中)
Python = [-1.38340578 0.2935787
-2.22189802 -0.25133484
3.6053038 0.04224385
1.38340578 -0.2935787
2.22189802 0.25133484
3.6053038 -0.04224385]
Matlab = [ 0.2196 0.5340
0.3526 -0.4571
0.5722 0.0768
-0.2196 -0.5340
-0.3526 0.4571
-0.5722 -0.0768]
现在注意 B(:,1)*-6.2997
基本上等于 A(:,1)
。或者换个说法
A(:,n)./B(:,n)
为每一行提供(大致)相同的数字。这意味着两个向量具有相同的方向(即它们只是彼此的标量倍数),因此您将获得相同的主成分。
我正在使用 PCA,我发现 Python 中的 sklearn 中的 PCA 和 Matlab 中的 pca() 产生了不同的结果。这是我正在使用的测试矩阵。
a = np.array([[-1,-1], [-2,-1], [-3, -2], [1,1], [2,1], [3,2]])
对于 Python sklearn,我得到了
p = PCA()
print(p.fit_transform(a))
[[-1.38340578 0.2935787 ]
[-2.22189802 -0.25133484]
[-3.6053038 0.04224385]
[ 1.38340578 -0.2935787 ]
[ 2.22189802 0.25133484]
[ 3.6053038 -0.04224385]]
对于 Matlab,我得到了
pca(a', 'Centered', false)
[0.2196 0.5340
0.3526 -0.4571
0.5722 0.0768
-0.2196 -0.5340
-0.3526 0.4571
-0.5722 -0.0768]
为什么会出现这种差异?
感谢丹的回答。现在的结果看起来很合理。但是,如果我使用随机矩阵进行测试,似乎 Matlab 和 Python 产生的结果不是彼此的标量倍数。为什么会这样?
test matrix a:
[[ 0.36671885 0.77268624 0.94687497]
[ 0.75741855 0.63457672 0.88671836]
[ 0.20818031 0.709373 0.45114135]
[ 0.24488718 0.87400025 0.89382836]
[ 0.16554686 0.74684393 0.08551401]
[ 0.07371664 0.1632872 0.84217978]]
Python 结果:
p = PCA()
p.fit_transform(a))
[[ 0.25305509 -0.10189215 -0.11661895]
[ 0.36137036 -0.20480169 0.27455458]
[-0.25638649 -0.02923213 -0.01619661]
[ 0.14741593 -0.12777308 -0.2434731 ]
[-0.6122582 -0.08568121 0.06790961]
[ 0.10680331 0.54938026 0.03382447]]
Matlab 结果:
pca(a', 'Centered', false)
0.504156973865138 -0.0808159771243340 -0.107296852182663
0.502756555190181 -0.174432053627297 0.818826939851221
0.329948209311847 0.315668718703861 -0.138813345638127
0.499181592718705 0.0755364557146097 -0.383301081533716
0.232039797509016 0.694464307249012 -0.0436361728092353
0.284905319274925 -0.612706345940607 -0.387190971583757
感谢丹一直以来的帮助。事实上,我发现这是对 Matlab 函数的滥用。 Matlab returns 默认主成分系数。使用 [~, score] = pca(a, 'Centered', true) 将得到与 Python.
相同的结果PCA 处理特征向量。只要矢量是平行的,幅度就无关紧要(只是不同的归一化)。
在你的例子中,两者是彼此的标量倍数。尝试(在 MATLAB 中)
Python = [-1.38340578 0.2935787
-2.22189802 -0.25133484
3.6053038 0.04224385
1.38340578 -0.2935787
2.22189802 0.25133484
3.6053038 -0.04224385]
Matlab = [ 0.2196 0.5340
0.3526 -0.4571
0.5722 0.0768
-0.2196 -0.5340
-0.3526 0.4571
-0.5722 -0.0768]
现在注意 B(:,1)*-6.2997
基本上等于 A(:,1)
。或者换个说法
A(:,n)./B(:,n)
为每一行提供(大致)相同的数字。这意味着两个向量具有相同的方向(即它们只是彼此的标量倍数),因此您将获得相同的主成分。