为什么PCA置换检验中所有置换数据的解释方差完全一致
问题原因
- 核心错误是置换逻辑不符合要求:你当前的
data.sample(frac=1)是整行打乱样本顺序,所有特征的取值对应关系没有发生任何变化,数据集的协方差矩阵和原数据完全相同,而PCA的解释方差完全由协方差矩阵的特征值决定,所以所有置换后的结果和原数据完全一致。 - 额外错误:
reset_index()操作会新增一列原行索引数据,不属于原始特征,会对PCA计算造成不必要的干扰。 - 实验要求的是按列独立置换:即每一列特征单独打乱取值顺序,彻底破坏特征之间的相关性,才能得到随机数据集的解释方差基线。
修正代码
import pandas as pd import numpy as np from sklearn import datasets from sklearn.decomposition import PCA def exp_var_perm_data(data, n_permutations=1): """ data: Assumed to be a pandas dataframe, object that has a .shape attribute n_permutations: Integer. Number of permutations to perform """ df = pd.DataFrame(columns=["Dim%d" % i for i in range(0, data.shape[1])]) for k in range(0,n_permutations): pca_permuted = PCA() # 按列独立置换:每列单独打乱顺序 data_permuted = data.apply(np.random.permutation, axis=0) pca_permuted.fit(data_permuted) df.loc[k] = pca_permuted.explained_variance_ratio_ return df # 测试代码 iris_data = datasets.load_iris() iris_data = iris_data.data exp_var_perm = exp_var_perm_data(pd.DataFrame(iris_data), 10) print(exp_var_perm)
修正后运行会得到每次置换都不同的解释方差结果,第一主成分的解释方差会远低于原数据的0.879,符合实验预期。
内容的提问来源于stack exchange,提问作者lrthistlethwaite
相关产品推荐
相关产品推荐

