我正在尝试为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 = 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。