内核PCA的尖叫图



我正在尝试为Kernel PCA做一个屏幕图。我的X中有78个功能,有247K个样本。我是内核PCA的新手,但我已经多次使用linear PCA的屏幕图。下面的代码为线性PCA绘制屏幕图。我想在实际安装之前使用屏幕图来决定我需要的组件数量。

pca = PCA().fit(X)
plt.figure()
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('Number of  Principle Components')
plt.ylabel('Variance (%)') #for each component
plt.title('Dataset Explained Variance')
plt.show()

我试图为内核pca复制相同的方法,但内核pca不存在explained_variance_ratio_方法,这就是为什么我以以下方式进行。

pca = KernelPCA(kernel='rbf',gamma=10,fit_inverse_transform=False).fit_transform(scaled_merged.iloc[0:1000:,])
explained_variance = np.var(pca, axis=0)
explained_variance_ratio = explained_variance / np.sum(explained_variance)
plt.figure()
plt.plot(np.cumsum(explained_variance_ratio))
plt.xlabel('Number of Components')
plt.ylabel('Variance (%)') #for each component
plt.title('Dataset Explained Variance')
plt.show()

kernel PCA代码的屏幕图有一些问题,它表明我需要150个组件来表达接近90%的方差。我的代码有什么问题吗?

原因很简单。核PCA(kPCA(中的特征值之和与特征空间中的总解释方差相关,具体取决于您对核函数的选择。在具有RBF核的情况下,kPCA在无限维的特征空间中等价于经典PCA。kPCA的特征值等价于特征空间中的特征值。这就是为什么屏幕图与PCA的不同,PCA对应于线性核函数。因此,如果使用线性内核,它应该与输入空间中的PCA相同。

公平比较的正确代码是

pca = KernelPCA(kernel='linear', fit_inverse_transform=False).fit_transform(scaled_merged.iloc[0:1000:,]

简言之,除了线性核函数之外,kPCA中的特征值不应该像经典PCA那样被解释。kPCA的优化问题是经典PCA在特征空间中的对偶问题,而不是在输入空间中。

参考:

Schölkopf,B.,Smola,A.,&Müller,K.R.(1998(。非线性分量分析作为一个核特征值问题。神经计算,10(5(,1299-1319。

相关内容

  • 没有找到相关文章

最新更新