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

news/2025/1/15 12:22:11/

文章目录

      • 算法介绍
      • 实验分析

算法介绍

核化线性降维是一种使用核方法(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_samplesK_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()

在这里插入图片描述


http://www.ppmy.cn/news/1342587.html

相关文章

phpMyAdmin 未授权Getshell

前言 做渗透测试的时候偶然发现,phpmyadmin少见的打法,以下就用靶场进行演示了。 0x01漏洞发现 环境搭建使用metasploitable2,可在网上搜索下载,搭建很简单这里不多说了。 发现phpmyadmin,如果这个时候无法登陆,且也…

记录首次使用yolov8-obb

1.数据格式 之前使用的数据格式是yolov5_obb的数据格式,然后需要转数据格式: 目前的数据只支持四个坐标点标注的数据,参考:If a corner of the rotate rectangle is out of the image range, How to annotate the image? Issu…

2024甲级测绘名单之:百度地图的那些事儿

之前,我们分享过2023高精地图甲级测绘资质最新名单【高德地图】,没看过的小伙伴可以戳下面的链接: 2023高精地图甲级测绘资质最新名单【高德地图】-CSDN博客 今天继续介绍名单中的另外一个成员,也是地图导航业务的佼佼者&#x…

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

CSS的复合选择器

一,什么是复合选择器 常用的复合选择器有:后代选择器、子选择器、并集选择器和伪类选择器。 二,后代选择器(用空格)(重点) 后代选择器也称包含选择器,可以选择父元素里面的子元素。…

修改MFC图标

摘要:本文主要讲解了MFC程序窗口图标的添加、任务栏、底部托盘的图标添加,以及所生成的exe文件图标的添加。 ​​​​​​​1、在资源视图添加Icon资源 透明图标怎么制作? 1)点击图片》右键:使用画图3D进行编辑 2&a…

Docker学习(六)-Kubernetes - Spring Boot 应用

接上一篇 Docker学习(五)-Kubernetes 集群搭建 - Spring Boot 应用-CSDN博客 新建 k8s-demo.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: k8s-springboot-demo labels: app: k8s-springboot-demo spec: replicas: 1revisionHistoryLimit:…

【C++】C++入门— 类与对象初步介绍

C入门 1 认识面向对象2 类的引入3 类的定义类的定义方式 4 类的访问限定符及封装访问限定符封装 Thanks♪(・ω・)ノ谢谢阅读!下一篇文章见!!! 1 认识面向对象 C语言是面向过程的,关注…