我对在 python 中使用稀疏 PCA 很感兴趣,我找到了 sklearn 实现。但是,我认为这个 python 实现解决了与本文提出并在 R 包elasticnet中实现的原始稀疏 pca 算法不同的问题。例如,考虑以下关于稀疏 PC 的解释方差的示例:
import numpy as np
from sklearn.datasets import load_boston
boston = load_boston()
from sklearn.decomposition import SparsePCA
x = boston.data # Load boston dataset
x = x[:, [0, 2, 4, 5, 6, 7, 10, 11, 12]] # select non-categorical variables
spca = SparsePCA(n_components=5, alpha=1e-3, ridge_alpha=1e-6, normalize_components=False) # Solve sparse pca
spca.fit(x)
t_spca = spca.transform(x)
p_spca = spca.components_.T
# Calculate the explained variance as explained in sparse pca original paper
t_spca_qr = np.linalg.qr(t_spca) # QR decomposition of modified PCs
q = t_spca_qr[0]
r = t_spca_qr[1]
# compute adjusted variance
variance = []
for i in range(5):
variance.append(np.square(r[i][i]))
variance = np.array(variance)
# compute variance_ratio
total_variance_in_x = np.matrix.trace(np.cov(x.T)) # Variance in the original dataset
explained_variance_ratio = np.cumsum(variance / total_variance_in_x)
array([ 0.00010743, 0.00021485, 0.00032228, 0.0004297 , 0.00053713])
使用稀疏 PCA 的解释方差计算基于上面引用的原始论文,第 273 页。因此,如您所见,这个解释方差比非常小。
我的问题是:
- 我在解释方差的计算上做错了吗?
- 有没有什么地方可以找到用 python 实现的稀疏 pca 的数学公式?
- spca python实现中的
normalize_components
参数有什么作用?为什么设置为时会引发弃用警告False
?
编辑(基于答案)
根据答案,我通过设置normalize_components=True
和避免这种方式的弃用警告来测试结果。
spca = SparsePCA(n_components=5, alpha=1e-3, ridge_alpha=1e-6, normalize_components=True) # Solve sparse pca
spca.fit(x)
t_spca = spca.transform(x)
p_spca = spca.components_.T
t_spca_qr = np.linalg.qr(t_spca)
r = t_spca_qr[1]
# compute adjusted variance
variance = []
for i in range(5):
variance.append(np.square(r[i][i]))
variance = np.array(variance)
这会产生以下结果variance
:
variance
array([ 4255042.12587337, 386089.3106474 , 31883.68815345, 15333.57500443, 9781.36298748])
但是,这些数字远大于样本大小n=505
或原始矩阵 x 的方差,total_variance_in_x=9308.784
因此通过将方差数组的条目除以 505 或 9308.784,我仍然没有得到关于解释方差的有意义的结果。