西瓜书学习笔记——核化线性降维(公式推导+举例应用)

本文介绍了核化线性降维技术,特别是核主成分分析(KPCA),通过核技巧将数据映射到非线性特征空间进行降维。文章详细解释了算法原理,展示了如何通过径向基函数核和实验数据集进行降维并可视化结果。
摘要由CSDN通过智能技术生成

算法介绍

核化线性降维是一种使用核方法(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=1mziziT)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=1mziziT)W=i=1mziλziTW=i=1mziα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=1mϕ(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=1mϕ(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=1mϕ(xi)ϕ(xi)T)wj(i=1mziziT)wjZZTwjZZTi=1mϕ(xi)αijZZTi=1mziαijZZTZαjZZTZαjZTZαj=λjwj=λjwj=λjwj=λji=1mϕ(xi)αij=λji=1mziα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=1mαijϕ(xi)Tϕ(x)=i=1mα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()

在这里插入图片描述

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nie同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值