首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截断SVD与PCA

截断SVD与PCA
EN

Stack Overflow用户
提问于 2021-10-04 04:47:31
回答 1查看 166关注 0票数 1

理论上,如果特征的均值为0时,PCA和SVD的投影结果是相同的。所以我在蟒蛇身上试了一下。

代码语言:javascript
复制
from sklearn import datasets
cancer = datasets.load_breast_cancer()

from sklearn.preprocessing import StandardScaler
# we can set our feature to have mean 0 by setting with_mean=False
scaler = StandardScaler(with_mean=False,with_std=False)
scaler.fit(cancer.data)
X_scaled = scaler.transform(cancer.data)

from sklearn.decomposition import PCA
pca=PCA(n_components=3,svd_solver='randomized') 
pca.fit(X_scaled) 
X_pca=pca.transform(X_scaled) 

from sklearn.decomposition import TruncatedSVD
svdm=TruncatedSVD(n_components=3,algorithm='randomized') 
svdm.fit(X_scaled) 
X_svdm=svdm.transform(X_scaled)

但是当我打印结果时,情况就不一样了。为什么会发生这种情况?

代码语言:javascript
复制
print(X_pca)
print(X_svdm)
>>>[[1160.1425737  -293.91754364   48.57839763]
 [1269.12244319   15.63018184  -35.39453423]
 [ 995.79388896   39.15674324   -1.70975298]
 ...
 [ 314.50175618   47.55352518  -10.44240718]
 [1124.85811531   34.12922497  -19.74208742]
 [-771.52762188  -88.64310636   23.88903189]]
>>>[[2241.97427647  347.71556015  -27.53741942]
 [2372.40840267   56.90166991   23.86316187]
 [2101.8402797    11.94762737   30.41138602]
 ...
 [1424.53280954  -55.0217124    -3.5794351 ]
 [2231.65579282   19.99439854    3.31619182]
 [ 331.69302638   -5.29733966  -39.12136435]]

我应该修正什么,这样我才能得到两个算法的相同结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-04 07:09:58

来自定标器帮助页

with_mean bool,default=True If True,在缩放之前将数据中心化。这在稀疏矩阵上尝试时不起作用(并且会引发异常),因为以它们为中心需要构建一个密集矩阵,而在一般用例中,该矩阵可能太大,无法在内存中使用。

要使PCA和SVD提供相同的输出,您需要对数据进行中心化和缩放,请参见这篇文章有详细信息,因此如果您这样做了:

代码语言:javascript
复制
# which is also the default
scaler = StandardScaler(with_mean=True, with_std=True)
X_scaled = scaler.fit_transform(cancer.data)

pca=PCA(n_components=3,svd_solver='randomized')
pca.fit(X_scaled)
X_pca=pca.transform(X_scaled)

svdm=TruncatedSVD(n_components=3,algorithm='randomized')
svdm.fit(X_scaled)
X_svdm=svdm.transform(X_scaled)

X_pca
array([[ 9.19283683,  1.94858306, -1.12316567],
       [ 2.3878018 , -3.76817175, -0.52929196],
       [ 5.73389628, -1.0751738 , -0.55174751],
       ...,
       [ 1.25617928, -1.90229671,  0.56273027],
       [10.37479406,  1.67201011, -1.87702986],
       [-5.4752433 , -0.6706368 ,  1.49044385]])

X_svdm
array([[ 9.19283683,  1.94858307, -1.12316615],
       [ 2.3878018 , -3.76817174, -0.52929266],
       [ 5.73389628, -1.0751738 , -0.55174759],
       ...,
       [ 1.25617928, -1.90229671,  0.56273052],
       [10.37479406,  1.67201011, -1.87702935],
       [-5.4752433 , -0.67063679,  1.49044309]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69431012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档