我正在尝试使用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
我从一个循环调用mypca函数,该函数具有不同的comp值。我这样做是为了找到我要解决的问题的最佳补偿值。但mypca函数始终返回相同的值,即Xpca,与comp的值无关。
它返回的值对于我从循环中发送的第一个comp值是正确的,即它每次发送的Xpca值对于comp=10是正确的。在
我应该怎么做才能找到公司的最佳价值?
看起来您正在尝试传递不同的组件数量值,并重新适应每个组件。PCA的一个优点是它实际上没有必要这样做。您可以填充完整数量的组件(甚至与数据集中的维度一样多的组件),然后简单地丢弃不需要的组件(即那些差异较小的组件)。这相当于用较少的零部件重新拟合整个模型。节省了大量计算。在
如何做到:
至于如何选择组件的数量,这取决于您想做什么。选择组件数量的一个标准方法是查看每个选择
k
所解释的方差的分数(R^2
)。如果您的数据分布在低维线性子空间附近,那么当您绘制R^2
与k
时,曲线将具有“肘部”形状。弯头将位于子空间的维数处。观察这条曲线是很好的做法,因为它有助于理解数据。即使没有干净的弯头,通常也要为R^2
选择一个阈值,例如保留95%的方差。在下面是如何做到这一点(这应该在包含
^{pr2}$max_components
组件的模型上完成):您可能希望继续的另一种方法是将PCA转换后的数据输入到下游算法(例如分类器/回归),然后根据性能选择组件数量(例如使用交叉验证)。在
旁注:也许只是格式问题,但是
mypca()
中的代码块应该缩进,否则它不会被解释为函数的一部分。在使用PCA来减少维数。在
根据您的代码:
您的输入数据集
X
只是一个二维数组,最小的n_comp
是10,因此PCA会尝试为您找到10个最佳维度。从10>;2开始,您总是得到相同的答案。:)相关问题 更多 >
编程相关推荐