我正试图为内核PCA做一个很好的设计。我有78个特征在我的X与247 K样本。我是新的内核主成分分析,但我已经多次使用屏幕绘图为linear 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%的方差。我的代码有什么问题吗?
发布于 2022-08-08 03:48:02
原因很简单。核主元分析(kPCA)中的特征值之和与特征空间中解释的总方差相关联,这取决于核函数的选择。在无限维特征空间中,kPCA与经典PCA是等价的。kPCA的特征值与特征空间中的特征值等价。这就是为什么scree图不同于PCA的原因,后者对应于一个线性核函数。所以,如果你使用一个线性内核,它应该是相同的PCA在输入空间。
公平比较的正确代码是
pca = KernelPCA(kernel='linear', fit_inverse_transform=False).fit_transform(scaled_merged.iloc[0:1000:,]总之,除了一个线性核函数外,kPCA中的特征值不应该被解释为经典的主成分分析。kPCA的优化问题是经典PCA在特征空间而不是输入空间中的对偶问题。
参考资料:
Sch lkopf,B.,Smola,A.,& Müller,K.R.(1998年)。非线性分量分析作为核特征值问题。神经计算,10(5),1299-1319。
https://stackoverflow.com/questions/71404652
复制相似问题