我正在尝试使用sklearn.decomposition.sparsepca进行n*p矩阵x的主组件。
n表示样品的数量,p表示特征的数量。
然后,我遵循本文(https://www.cc.gatech.edu/~isbell/Reading/papers/sparsepc.pdf)来计算每个主要组件的调整后方差。
>在纸张中,我使用QR分解对修改后的PC,然后按(R[j][j])^2
进行调整后的方差。
但是结果(修饰PC的方差)并非单调减小。如下,第三pc的方差大于第二个PC之一:
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 whithith Order whithout whithout whithout whithout whithout whithout of PCS或我的代码有问题吗?
如果有人可以解决我的问题,我会很感激。
以下是我的代码:
# 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
使用np.trace(np.dot(R.T,R))
或np.trace(np.dot(R,R.T))
,具体取决于您如何组织数据。
我相信这是由于以下事实:通过弹性净回归获得的PC(Scikit Learn中使用的方法)不是不相关的,也不是正交的,因此可能没有与PC相同的属性来自PCA