|
核PCA:
思路:是利用非线性映射将样本数据转换到更高维空间,然后再利用PCA将其映射到另一个低维空间;最后利用线性分类器对样本进行划分。
缺点:计算成本很高;
解决办法:使用核技巧;即在原始特征空间中计算两个高维特征空间中向量的相似度;
常用的核函数有:
多项式核:
双曲正切和:
径向基核函数(Radial Basis Function, RBF),也称为高斯核函数:
或
基于RBF核的PCA计算步骤:
计算核(相似)矩阵k
计算如下公式:
将K’的特征值按照降序排列,选择前k个特征值所对应的特征量;
================================================================
Example 01
样本数据:
使用标准PCA计算结果:--- 不可分
使用核PCA计算结果:---可分
代码如下:
#Example01 from scipy.spatial.distance import pdist, squareform from scipy import exp from scipy.linalg import eigh import numpy as np def rbf_kernel_pca(X, gamma, n_components): sq_dists = pdist(X, 'sqeuclidean') mat_sq_dists = squareform(sq_dists) K = exp(-gamma * mat_sq_dists) N = K.shape[0] one_n = np.ones((N,N))/N K = K - one_n.dot(K) -K.dot(one_n) + one_n.dot(K).dot(one_n) eigvals, eigvecs =eigh(K) X_pc = np.column_stack((eigvecs[:,-i] for i in range(1, n_components + 1))) return X_pc #################################################################### # Example 01 from sklearn.datasets import make_moons import matplotlib.pyplot as plt X, y = make_moons(n_samples=100, random_state=123) plt.scatter(X[y==0, 0],X[y==0, 1], color='red', marker='^', alpha=0.5) plt.scatter(X[y==1, 0],X[y==1, 1], color='red', marker='^', alpha=0.5) plt.show() # 使用标准PCA from sklearn.decomposition import PCA scikit_pca = PCA(n_components=2) X_spca = scikit_pca.fit_transform(X) fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3)) ax[0].scatter(X_spca[y==0,0], X_spca[y==0,1],color='red', marker='^', alpha=0.5) ax[0].scatter(X_spca[y==1,0], X_spca[y==1,1],color='red', marker='^', alpha=0.5) ax[1].scatter(X_spca[y==0,0], np.zeros((50,1))+0.02,color='red', marker='^', alpha=0.5) ax[1].scatter(X_spca[y==1,0], np.zeros((50,1))-0.02,color='red', marker='^', alpha=0.5) ax[0].set_xlabel('PC 1') ax[0].set_ylabel('PC 2') ax[1].set_ylim([-1,1]) ax[1].set_yticks([]) ax[1].set_xlabel('PC 1') plt.show() #使用核PCA from matplotlib.ticker import FormatStrFormatter X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2) fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3)) ax[0].scatter(X_kpca[y==0,0], X_kpca[y==0,1],color='red', marker='^', alpha=0.5) ax[0].scatter(X_kpca[y==1,0], X_kpca[y==1,1],color='red', marker='^', alpha=0.5) ax[1].scatter(X_kpca[y==0,0], np.zeros((50,1))+0.02,color='red', marker='^', alpha=0.5) ax[1].scatter(X_kpca[y==1,0], np.zeros((50,1))-0.02,color='red', marker='^', alpha=0.5) ax[0].set_xlabel('PC 1') ax[0].set_ylabel('PC 2') ax[1].set_ylim([-1,1]) ax[1].set_yticks([]) ax[1].set_xlabel('PC 1') plt.show()
#参考《Python 机器学习》,作者:Sebastian Raschaka, 机械工业出版社;
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-24 17:56
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社