我正在尝试使用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^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()
中的代码块缩进,否则不会被解释为函数的一部分。关于python - 如何动态更改scikit学习功能的参数,即找到最佳参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37407446/