PCA仅适用于这样的变量:它们数据中的变化落在一条直线上,换句话说,它们只适合线性分布的数据


In [1]:
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA

In [2]:
# 生成一个变化非线性的数据集
np.random.seed(0)
x,y = make_circles(n_samples=400,factor=.2,noise=0.02)

In [4]:
# 为生成的数据集绘制图形
plt.close('all')
plt.figure(1)
plt.title("Original Space")
plt.scatter(x[:,0],x[:,1],c=y)
plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.show()



In [5]:
# 普通PCA处理这个数据集
pca = PCA(n_components=2)
pca.fit(x)
x_pca = pca.transform(x)

In [7]:
# 绘制数据集前两部分
plt.figure(2)
plt.title('PCA')
plt.scatter(x_pca[:,0],x_pca[:,1],c=y)
plt.xlabel('$x_component_1$')
plt.ylabel('$x_component_2$')
plt.show()



In [10]:
# 应用普通PCA,
class_1_index = np.where(y==0)[0]
class_2_index = np.where(y==1)[0]

plt.figure(3)
plt.title('PCA-One component')
plt.scatter(x_pca[class_1_index,0],np.zeros(len(class_1_index)),color='red')
plt.scatter(x_pca[class_2_index,0],np.zeros(len(class_2_index)),color='blue')
plt.show()



In [11]:
# 执行核PCA
kpca = KernelPCA(kernel='rbf',gamma=10)
# 执行核PCA
kpca.fit(x)
x_kpca = kpca.transform(x)

# plot
plt.figure(4)
plt.title('Kernel PCA')
plt.scatter(x_kpca[:,0],x_kpca[:,1],c=y)
plt.xlabel('$x_component_1$')
plt.ylabel('$x_component_2$')
plt.show()