我正在尝试使用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
答案 0 :(得分:0)
使用np.trace(np.dot(R.T,R))
或np.trace(np.dot(R,R.T))
,具体取决于您整理数据的方式。
答案 1 :(得分:0)
我认为这是由于通过Elastic net回归(scikit学习中使用的方法)获得的PC并非不相关也不正交,因此可能与PCA的PC不具有相同的特性