我正在尝试使用sklearn的PCA函数进行降维,特别是
from sklearn.decomposition import PCA
def mypca(X,comp):
pca = PCA(n_components=comp)
pca.fit(X)
PCA(copy=True, n_components=comp, whiten=False)
Xpca = pca.fit_transform(X)
return Xpca
for n_comp in range(10,1000,20):
Xpca = mypca(X,n_comp) # X is a 2 dimensional array
print Xpca
我从一个具有不同comp值的循环中调用mypca函数。我这样做是为了为我试图解决的问题找到补偿的最佳价值。但是mypca函数总是返回相同的值,即Xpca,而与comp的值无关
它返回的值对于我从循环中发送的comp的第一个值是正确的,即在我的情况下,它每次发送的Xpca值对于comp=10是正确的。
我应该怎么做才能找到comp的最佳价值
您使用PCA来降低维度。
从您的代码:
for n_comp in range(10,1000,20):
Xpca = mypca(X,n_comp) # X is a 2 dimensional array
print Xpca
你的输入数据集X
只是一个二维数组,最小的n_comp
是10,所以PCA试图找到最适合你的10个维度。由于10>2,您将始终得到相同的答案。:)
看起来您正试图为多个组件传递不同的值,并与每个组件重新匹配。PCA的一个优点是它实际上没有必要这样做。您可以拟合全部数量的组件(甚至与数据集中的维度一样多的组件),然后简单地丢弃您不想要的组件(即方差较小的组件)。这相当于用更少的零部件重新拟合整个模型。节省了大量计算。
如何做到:
# x = input data, size(<points>, <dimensions>)
# fit the full model
max_components = x.shape[1] # as many components as input dimensions
pca = PCA(n_components=max_components)
pca.fit(x)
# transform the data (contains all components)
y_all = pca.transform(x)
# keep only the top k components (with greatest variance)
k = 2
y = y_all[:, 0:k]
就如何选择分量数量而言,这取决于你想做什么。选择分量数量k
的一种标准方法是查看每次选择k
所解释的方差分数(R^2
)。如果数据分布在低维线性子空间附近,那么当绘制R^2
与k
时,曲线将具有"肘部"形状。肘部将位于子空间的维度上。观察这条曲线是很好的做法,因为它有助于理解数据。即使没有干净的肘部,也通常为R^2
选择阈值,例如保留95%的方差。
以下是如何做到这一点(这应该在带有max_components
组件的模型上完成):
# Calculate fraction of variance explained
# for each choice of number of components
r2 = pca.explained_variance_.cumsum() / x.var(0).sum()
您可能想要继续的另一种方法是将PCA转换后的数据输入到下游算法(例如分类器/回归),然后根据性能选择组件数量(例如使用交叉验证)。
附带说明:也许只是格式问题,但mypca()
中的代码块应该缩进,否则它不会被解释为函数的一部分。