scikit KernelPCA 结果不稳定

scikit KernelPCA unstable results

我正在尝试使用 KernelPCA 将数据集的维数降低到二维(既用于可视化目的,也用于进一步的数据分析)。

我尝试在各种 Gamma 值下使用 RBF 内核计算 KernelPCA,但结果不稳定:

(每帧的Gamma值略有不同,其中Gamma从0到1连续变化)

看起来它不是确定性的。

有没有办法稳定it/make它的确定性?

用于生成转换数据的代码:

def pca(X, gamma1):
    kpca = KernelPCA(kernel="rbf", fit_inverse_transform=True, gamma=gamma1)
    X_kpca = kpca.fit_transform(X)
    #X_back = kpca.inverse_transform(X_kpca)
    return X_kpca

所以...我无法就为什么 KernelPCA 不是确定性的给出明确的答案。该行为类似于我观察到的 PCA 和 RandomizedPCA 结果之间的差异。 PCA 是确定性的,但 RandomizedPCA 不是,有时特征向量相对于 PCA 特征向量的符号会翻转。

这使我对如何获得更具确定性的结果有了模糊的想法……也许吧。将 RBFSampler 与固定种子一起使用:

def pca(X, gamma1):
    kernvals = RBFSampler(gamma=gamma1, random_state=0).fit_transform(X)
    kpca = PCA().fit_transform(X)
    X_kpca = kpca.fit_transform(X)
    return X_kpca

KernelPCA 应该是确定性的,并随着伽玛不断发展。
它与 RBFSampler 不同,RBFSampler 确实具有内置随机性以提供 RBF 内核的高效(更具可扩展性)近似值。

然而,在 KernelPCA 中可以改变的是 主成分的顺序 :在 scikit-learn 中,它们返回时按特征值降序排列,所以如果你有 2 个特征值关闭彼此之间可能是顺序随伽玛而变化。

我的猜测(来自 gif)是这里发生的事情:您绘制的轴不是恒定的,因此您的数据似乎在跳动。

你能提供你用来制作gif的代码吗?

我猜它是沿着 2 个第一主成分绘制的数据点图,但它有助于了解您是如何生成它的。

您可以尝试通过查看每个 gamma 值的 kpca.alphas_(特征向量)的值来进一步检查它。

希望这是有道理的。

编辑:正如您所注意到的,这些点看起来像轴上的反射,最合理的解释是其中一个特征向量翻转符号(注意这不会影响特征值).

我输入 a simple gist 来重现这个问题(你需要一个 Jupyter notebook 来 运行 它)。当你改变 gamma 的值时,你可以看到符号翻转。

作为补充说明,这种差异的发生只是因为您多次 fit 多次 KernelPCA 对象。一旦您确定了特定的伽玛值并且您已经适合 kpca 一旦您可以多次调用转换并获得一致的结果。 对于经典 PCA the docs 提到:

Due to implementation subtleties of the Singular Value Decomposition (SVD), which is used in this implementation, running fit twice on the same matrix can lead to principal components with signs flipped (change in direction). For this reason, it is important to always use the same estimator object to transform data in a consistent fashion.

我不知道您会多次拟合的单个 KernelPCA 对象的行为(我没有在文档中找到任何相关内容)。

它不适用于你的情况,因为你必须用多个伽马值拟合对象。