7

I'm trying to use KernelPCA for reducing the dimensionality of a dataset to 2D (both for visualization purposes and for further data analysis).

I experimented computing KernelPCA using a RBF kernel at various values of Gamma, but the result is unstable:

anim

(each frame is a slightly different value of Gamma, where Gamma is varying continuously from 0 to 1)

Looks like it is not deterministic.

Is there a way to stabilize it/make it deterministic?

Code used to generate transformed data:

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
4

2 回答 2

3

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

然而,在 KernelPCA 中可以改变的是主要成分的顺序:在 scikit-learn 中,它们按特征值降序排序返回,因此如果您有 2 个彼此接近的特征值,则顺序可能会随 gamma 变化。

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

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

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

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

希望这是有道理的。

编辑:正如您所指出的,这些点似乎反映在轴上,最合理的解释是特征向量之一翻转符号(注意这不会影响特征值)。

我提出了一个简单的要点来重现这个问题(你需要一个 Jupyter 笔记本来运行它)。更改 gamma 值时可以看到符号翻转。

作为补充说明,这种差异的发生只是因为您多次将 KernelPCA 对象拟合了几次。一旦你确定了一个特定的伽马值并且你已经适合 kpca 一次,你可以多次调用 transform 并获得一致的结果。对于经典的 PCA ,文档提到:

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

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

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

于 2015-07-06T10:04:55.693 回答
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
于 2015-07-02T18:07:10.817 回答