核化线性降维是一种使用核方法(Kernel Methods)来进行降维的技术。在传统的线性降维方法中,例如主成分分析(PCA)和线性判别分析(LDA),数据被映射到一个低维线性子空间中。而核化线性降维则通过使用核技巧,将数据映射到一个非线性的低维空间中。
核技巧的核心思想是通过一个非线性映射将原始数据转换到一个高维的特征空间,然后在该特征空间中应用线性降维方法。这种映射可以使用核函数来实现,例如径向基函数核(RBF核)或多项式核。
下面我们以核主成分分析(KPCA)为例子:
假定我们将高维特征空间中把数据投影到由 W \mathbf{W} W确定的超平面上,即PCA欲求解:
( ∑ i = 1 m z i z i T ) W = λ W (1) \bigg(\sum_{i=1}^mz_iz_i^T\bigg)\mathbf{W}=\lambda\mathbf{W}\tag{1} (i=1∑mziziT)W=λW(1)
其中 z i z_i zi是样本点 x i x_i xi在高维特征空间中的像,可知:
W = 1 λ ( ∑ i = 1 m z i z i T ) W = ∑ i = 1 m z i z i T W λ = ∑ i = 1 m z i α i (2) \begin{aligned} \mathbf{W}&=\frac{1}{\lambda}\bigg(\sum_{i=1}^mz_iz_i^T\bigg)\mathbf{W}=\sum_{i=1}^mz_i\frac{z_i^T\mathbf{W}}{\lambda}\\ &=\sum_{i=1}^mz_i\alpha_i \end{aligned} \tag{2} W=λ1(i=1∑mziziT)W=i=1∑mziλziTW=i=1∑mziαi(2)
其中 α i = 1 λ z i T W \alpha_i=\frac{1}{\lambda}z_i^T\mathbf{W} αi=λ1ziTW(权重)。假设 z i z_i zi是通过原始空间中的样本点 x i x_i xi通过映射 ϕ \phi ϕ产生,即 z i = ϕ ( x i ) , i = 1 , 2 , . . . , m z_i=\phi(x_i),i=1,2,...,m zi=ϕ(xi),i=1,2,...,m。若能被 ϕ \phi ϕ显式的表达出来,通过它将样本映射到高维特征空间,再从高维特征空间中使用PCA,可将式(1)变化为:
( ∑ i = 1 m ϕ ( x i ) ϕ ( x i ) T ) W = λ W (3) \bigg(\sum_{i=1}^m\phi(x_i)\phi(x_i)^T\bigg)\mathbf{W}=\lambda\mathbf{W}\tag{3} (i=1∑mϕ(xi)ϕ(xi)T)W=λW(3)
式(2)变化为:
W = ∑ i = 1 m ϕ ( x i ) α i (4) \mathbf{W}=\sum_{i=1}^m\phi(x_i)\alpha_i\tag{4} W=i=1∑mϕ(xi)αi(4)
一般情况下我们不知道 ϕ \phi ϕ的 形式,故引入核函数:
κ ( x i , x j ) = ϕ ( x i ) T ϕ ( x j ) (5) \kappa(x_i,x_j)=\phi(x_i)^T\phi(x_j)\tag{5} κ(xi,xj)=ϕ(xi)Tϕ(xj)(5)
将式(4)和式(5)带入式(3)中有:
已知 z i = ϕ ( x i ) z_i=\phi(x_i) zi=ϕ(xi),类比 X = { x 1 , x 2 , . . . , x m } \mathbf{X}=\{x_1,x_2,...,x_m\} X={x1,x2,...,xm},可以构造出 Z = { z 1 , z 2 , . . . , z m } \mathbf{Z}=\{z_1,z_2,...,z_m\} Z={z1,z2,...,zm}。
( ∑ i = 1 m ϕ ( x i ) ϕ ( x i ) T ) w j = λ j w j ( ∑ i = 1 m z i z i T ) w j = λ j w j Z Z T w j = λ j w j Z Z T ∑ i = 1 m ϕ ( x i ) α i j = λ j ∑ i = 1 m ϕ ( x i ) α i j Z Z T ∑ i = 1 m z i α i j = λ j ∑ i = 1 m z i α i j Z Z T Z α j = λ j Z α j Z Z T Z α j = Z λ j α j Z T Z α j = λ j α j (6) \begin{aligned} \bigg(\sum_{i=1}^m\phi(x_i)\phi(x_i)^T\bigg)w_j&=\lambda_jw_j\\ \bigg(\sum_{i=1}^mz_iz_i^T\bigg)w_j&=\lambda_jw_j\\ \mathbf{ZZ^T}w_j&=\lambda_jw_j\\ \mathbf{ZZ^T}\sum_{i=1}^m\phi(x_i)\alpha_i^j&=\lambda_j\sum_{i=1}^m\phi(x_i)\alpha_i^j\\ \mathbf{ZZ^T}\sum_{i=1}^mz_i\alpha_i^j&=\lambda_j\sum_{i=1}^mz_i\alpha_i^j\\ \mathbf{ZZ^TZ}\alpha^j&=\lambda_j\mathbf{Z}\alpha^j\\ \mathbf{ZZ^TZ}\alpha^j&=\mathbf{Z}\lambda_j\alpha^j\\ \mathbf{Z^TZ}\alpha^j&=\lambda_j\alpha^j\\ \end{aligned} \tag{6} (i=1∑mϕ(xi)ϕ(xi)T)wj(i=1∑mziziT)wjZZTwjZZTi=1∑mϕ(xi)αijZZTi=1∑mziαijZZTZαjZZTZαjZTZαj=λjwj=λjwj=λjwj=λji=1∑mϕ(xi)αij=λji=1∑mziαij=λjZαj=Zλjαj=λjαj(6)
其中 α j = ( α 1 j ; α 2 j ; … ; α m j ) ∈ R m × 1 \boldsymbol{\alpha}^j=\left(\alpha_1^j ; \alpha_2^j ; \ldots ; \alpha_m^j\right) \in \mathbb{R}^{m \times 1} αj=(α1j;α2j;…;αmj)∈Rm×1
令 Z Z T = K \mathbf{ZZ^T=K} ZZT=K,那么上式可化为:
K α j = λ j α j (7) \mathbf{K}\alpha^j=\lambda_j\alpha^j\tag{7} Kαj=λjαj(7)
其中矩阵 K \mathbf{K} K的第 i i i行第 j j j列的元素 K i j = z i T z j = ϕ ( x i ) T ϕ ( x j ) = κ ( x i , x j ) \mathbf{K}_{ij}=z_i^Tz_j=\phi(x_i)^T\phi(x_j)=\kappa(x_i,x_j) Kij=ziTzj=ϕ(xi)Tϕ(xj)=κ(xi,xj)。
显然式(7)是一个特征值分解问题,取 K \mathbf{K} K最大的 d ′ d^\prime d′个特征值所对应的特征向量即可。
对新样本 x = ( x 1 , x 2 , . . . , x m ) x=(x_1,x_2,...,x_m) x=(x1,x2,...,xm)(向量),其向高维特征空间的投影后的第 j ( j = 1 , 2 , . . . , d ′ ) j(j=1,2,...,d^\prime) j(j=1,2,...,d′)维坐标是:
z j = w j T ϕ ( x ) = ∑ i = 1 m α i j ϕ ( x i ) T ϕ ( x ) = ∑ i = 1 m α i j κ ( x i , x ) (8) \begin{aligned} z^j&=w_j^T\phi(x)\\ &=\sum_{i=1}^m\alpha_i^j\phi(x_i)^T\phi(x)\\ &=\sum_{i=1}^m\alpha_i^j\kappa(x_i,x) \end{aligned} \tag{8} zj=wjTϕ(x)=i=1∑mαijϕ(xi)Tϕ(x)=i=1∑mαijκ(xi,x)(8)
算法过程与PCA算法类似。
数据集如下图所示:
读入数据集:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
data = pd.read_csv('data/correlated_dataset.csv')
# 提取特征和目标
X = data.drop('Target', axis=1).values
y = data['Target'].values
定义核函数:
# 核函数(径向基函数)
def rbf_kernel(x, y, gamma=1.0):
return np.exp(-gamma * np.linalg.norm(x - y)**2)
计算以及中心化核矩阵:
# 计算核矩阵
def compute_kernel_matrix(X, gamma=1.0):
n_samples = X.shape[0]
K = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):
K[i, j] = rbf_kernel(X[i], X[j], gamma)
return K
# 中心化核矩阵
def center_kernel_matrix(K):
n_samples = K.shape[0]
one_n = np.ones((n_samples, n_samples)) / n_samples
K_centered = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)
return K_centered
计算特征值与特征向量:
# 计算特征值和特征向量
def compute_eigenvectors(K_centered, n_components):
eigvals, eigvecs = np.linalg.eigh(K_centered)
# 选择前n_components个最大特征值对应的特征向量
idx = np.argsort(eigvals)[::-1][:n_components]
return eigvecs[:, idx]
执行KPCA并绘制降维可视化结果:
# 数据中心化
X_centered = X - np.mean(X, axis=0)
# 计算核矩阵
K = compute_kernel_matrix(X_centered)
# 中心化核矩阵
K_centered = center_kernel_matrix(K)
# 选择降维后的维度
n_components = 6
# 计算特征向量
eigenvectors = compute_eigenvectors(K_centered, n_components)
# 降维
X_pca = K_centered.dot(eigenvectors)
# 可视化降维结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title('Kernelized PCA - 2D Projection')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()