我正在尝试使用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函数。我这样做是为了找到要解决的问题的comp的最佳价值。但是mypca函数始终返回相同的值,即Xpca,与comp的值无关。
它返回的值对于我从循环发送的comp的第一个值是正确的,即在我的情况下,每次发送的Xpca值对于comp = 10是正确的。

我应该怎么做才能找到comp的最佳价值?

最佳答案

看来您正在尝试传递不同的组件数量值,并与每个组件重新匹配。 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数量的一种标准方法是查看每个R^2选择所解释的方差分数(k)。如果数据分布在低维线性子空间附近,则在绘制R^2k时,曲线将呈“肘”形。肘部将位于子空间的维数处。查看此曲线是个好习惯,因为它有助于理解数据。即使没有干净的弯头,也通常为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()中的代码块缩进,否则不会被解释为函数的一部分。

关于python - 如何动态更改scikit学习功能的参数,即找到最佳参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37407446/

10-12 23:09