Python sklearn稀疏pca:计算PC的差异时出错了

时间:2017-09-25 08:54:33

标签: python machine-learning scikit-learn pca variance

我正在尝试使用sklearn.decomposition.SparsePCA计算n * p矩阵X的主成分。

n表示样本数,p表示特征数。

然后我按照本文中的方式(https://www.cc.gatech.edu/~isbell/reading/papers/sparsepc.pdf)计算每个主成分的调整方差。

正如文中所述,我对修改后的PC使用QR分解,并按(R[j][j])^2计算调整后的方差。

但结果(修改后的PC的差异)并非单调递减。如下所示,第3台PC的方差大于第2台PC的方差:

个人电脑的差异:

[ 1.          0.59902395  0.64761414  0.64657846  0.50450935  0.59905398 0.45242596  0.42738204]
PC的

variance_ratio:

[ 0.20506141  0.1228367   0.13280067  0.13258829  0.1034554   0.12284286
  0.09277511  0.08763956]

是因为sklearn.decomposition.SparsePCA.transform的输出没有PC的顺序,或者我的代码有问题吗?

如果有人能解决我的问题,我将不胜感激。

以下是我的代码:

    # read n*p matrix X( n = 1043, p = 20 )
    cluster_data = input_cluster_data('./data/km_results_1.csv')

    # train spca
    model = decomposition.SparsePCA( n_components=8 )
    model.fit( cluster_data )
    cluster_data_projection = model.transform( cluster_data )

    # QR decomposition of modified PCs
    cluster_data_projection_qr = np.linalg.qr( cluster_data_projection )
    q = cluster_data_projection_qr[0]
    r = cluster_data_projection_qr[1]

    # compute adjusted variance
    variance = []
    for i in range(8):
        variance.append( np.square(r[i][i]) )

    variance = np.array(variance)


    # compute variance_ratio
    sum = np.sum( variance )
    variance_ratio = variance / sum

2 个答案:

答案 0 :(得分:0)

使用np.trace(np.dot(R.T,R))np.trace(np.dot(R,R.T)),具体取决于您整理数据的方式。

答案 1 :(得分:0)

我认为这是由于通过Elastic net回归(scikit学习中使用的方法)获得的PC并非不相关也不正交,因此可能与PCA的PC不具有相同的特性