擅长:python、mysql、java
<p>看起来您正在尝试传递不同的组件数量值,并重新适应每个组件。PCA的一个优点是它实际上没有必要这样做。您可以填充完整数量的组件(甚至与数据集中的维度一样多的组件),然后简单地丢弃不需要的组件(即那些差异较小的组件)。这相当于用较少的零部件重新拟合整个模型。节省了大量计算。在</p>
<p>如何做到:</p>
<pre><code># 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]
</code></pre>
<p>至于如何选择组件的数量,这取决于您想做什么。选择组件数量的一个标准方法是查看每个选择<code>k</code>所解释的方差的分数(<code>R^2</code>)。如果您的数据分布在低维线性子空间附近,那么当您绘制<code>R^2</code>与<code>k</code>时,曲线将具有“肘部”形状。弯头将位于子空间的维数处。观察这条曲线是很好的做法,因为它有助于理解数据。即使没有干净的弯头,通常也要为<code>R^2</code>选择一个阈值,例如保留95%的方差。在</p>
<p>下面是如何做到这一点(这应该在包含<code>max_components</code>组件的模型上完成):</p>
^{pr2}$
<p>您可能希望继续的另一种方法是将PCA转换后的数据输入到下游算法(例如分类器/回归),然后根据性能选择组件数量(例如使用交叉验证)。在</p>
<p>旁注:也许只是格式问题,但是<code>mypca()</code>中的代码块应该缩进,否则它不会被解释为函数的一部分。在</p>