scikit KernelPCA不稳定的结果

时间:2015-07-01 23:09:45

标签: python scikit-learn pca dimensionality-reduction

我尝试使用KernelPCA将数据集的维度降低到2D(用于可视化目的和进一步的数据分析)。

我尝试使用不同Gamma值的RBF内核计算KernelPCA,但结果不稳定:

anim

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

看起来不确定。

有没有办法稳定它/确定它?

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

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

2 个答案:

答案 0 :(得分:3)

KernelPCA应该是确定性的并且通过gamma连续演变。
与RBFSampler不同,它具有内置随机性,以便提供RBF内核的有效(更可扩展)近似。

然而,KernelPCA中可以改变的是主要成分的顺序:在scikit-learn中,它们按照特征值下降的顺序返回,所以如果你有2个特征值彼此接近,它可以是订单随伽马变化。

我的猜测(来自gif)是这就是这里发生的事情:你正在绘制的轴不是恒定的,所以你的数据似乎跳了起来。

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

我猜这是两个第一主要组成部分的数据点图,但它有助于了解你是如何制作它的。

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

希望这是有道理的。

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

我放入a simple gist来重现问题(你需要一个Jupyter笔记本来运行它)。更改gamma值时,您可以看到符号翻转。

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

  

由于在此实现中使用的奇异值分解(SVD)的实现细微差别,在同一矩阵上运行拟合两次可导致具有符号翻转的主要组件(方向改变)。因此,始终使用相同的估算器对象以一致的方式转换数据非常重要。

我不知道您可以多次使用的单个KernelPCA对象的行为(我在文档中找不到任何相关内容)。

它不适用于您的情况,因为您必须使用多个伽玛值来拟合对象。

答案 1 :(得分:1)

所以...我无法就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