我发现使用PCA时,需要在一开始就指定保留的成分数量,例如在以下代码中:
model = pca(n_components=3, normalize=True)
有没有办法只指定方差,让算法给我最重要的成分?
回答:
你并不一定需要提前指定成分的数量。你可以提取所有成分,然后只保留那些解释了给定累积方差比例的成分。请看下面的代码示例。
import numpy as npfrom sklearn.decomposition import PCAfrom sklearn.datasets import make_spd_matrixfrom sklearn.preprocessing import StandardScaler# 生成数据np.random.seed(100)N = 1000 # 样本数量K = 10 # 特征数量mean = np.zeros(K)cov = make_spd_matrix(K)X = np.random.multivariate_normal(mean, cov, N)print(X.shape)# (1000, 10)# 重新缩放数据scaler = StandardScaler()X = scaler.fit_transform(X)# 执行PCApca = PCA(n_components=None)pca.fit(X)# 提取最少数量的成分,这些成分解释了至少p%(例如80%)的方差p = 0.80n_components = 1 + np.argmax(np.cumsum(pca.explained_variance_ratio_) >= p)print(n_components)# 6# 提取选定成分的值Z = pca.transform(X)[:, :n_components]print(Z.shape)# (1000, 6)