我正在尝试使用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值?
答案 0 :(得分:1)
您使用PCA缩小尺寸。
从你的代码:
<form action="" method="POST" dynamic-form-action="customAction">
...
</form>
您的输入数据集for n_comp in range(10,1000,20):
Xpca = mypca(X,n_comp) # X is a 2 dimensional array
print Xpca
只是一个二维数组,最小X
是10,因此PCA会尝试为您找到10个最佳维度。从10> 2,你将永远得到相同的答案。 :)
答案 1 :(得分:0)
看起来你正试图为组件数量传递不同的值,并重新适应每个组件。关于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转换的数据并将其提供给下游算法(例如分类器/回归),然后根据性能选择组件数量(例如,使用交叉验证)。 / p>
旁注:可能只是格式化问题,但mypca()
中的代码块应缩进,否则不会被解释为函数的一部分。