当前位置: 首页 > news >正文

Python实现核主成分分析(KPCA)降维算法

目录

      • Python实现核主成分分析(KPCA)降维算法的博客
        • 引言
        • KPCA算法原理
          • 1. 核函数与核技巧
          • 2. 中心化核矩阵
          • 3. 特征分解
        • Python中的KPCA实现
          • 1. 创建KPCA类
          • 2. 在瑞士卷数据集上应用KPCA
          • 3. 结果分析
        • 总结

Python实现核主成分分析(KPCA)降维算法的博客

引言

在高维数据分析中,主成分分析(PCA)是一种常用的线性降维技术。然而,PCA的局限在于它只能发现线性结构,对于非线性分布的数据效果不佳。为了处理非线性数据,我们可以通过引入核函数的方式来扩展PCA的能力,这就是核主成分分析(Kernel PCA,简称KPCA)。KPCA通过将数据映射到高维空间来捕捉数据的非线性结构,然后在高维空间中应用PCA进行降维。本文将详细介绍KPCA算法的原理,并通过Python实现该算法,展示其在实际场景中的应用。

KPCA算法原理

核主成分分析的核心思想是利用核技巧(Kernel Trick)将数据从原始空间映射到高维特征空间,在高维空间中应用PCA来提取主要成分,从而实现降维。核技巧的引入,使得KPCA能够捕捉数据中的非线性结构,这使得KPCA比传统的PCA更为灵活和强大。

1. 核函数与核技巧

核函数是KPCA的核心。常见的核函数包括:

  • 线性核: k ( x , y ) = x T y k(x, y) = x^T y k(x,y)=xTy
  • 多项式核: k ( x , y ) = ( x T y + c ) d k(x, y) = (x^T y + c)^d k(x,y)=(xTy+c)d
  • 高斯径向基核(RBF核): k ( x , y ) = exp ⁡ ( − ∥ x − y ∥ 2 2 σ 2 ) k(x, y) = \exp\left(-\frac{\|x - y\|^2}{2\sigma^2}\right) k(x,y)=exp(2σ2xy2)

核技巧的思想是通过核函数计算输入空间中点之间的相似度,而不显式地计算映射后的高维特征。这种方法避免了直接处理高维数据带来的计算复杂度。

2. 中心化核矩阵

在进行PCA之前,需要对核矩阵进行中心化。假设核矩阵为 K K K,则中心化后的核矩阵 K ′ K' K可以通过以下公式得到:

K ′ = K − 1 n K − K 1 n + 1 n K 1 n K' = K - \mathbf{1}_n K - K \mathbf{1}_n + \mathbf{1}_n K \mathbf{1}_n K=K1nKK1n+1nK1n

其中, 1 n \mathbf{1}_n 1n是一个所有元素均为 1 n \frac{1}{n} n1的矩阵, n n n是样本数量。

3. 特征分解

在得到中心化的核矩阵后,KPCA通过对其进行特征分解,提取前 d d d 个特征向量作为主要成分。这些特征向量对应的特征值表示了相应主成分的方差。

Python中的KPCA实现

接下来我们将通过Python实现KPCA算法,并将其封装到一个面向对象的类中,方便复用。

1. 创建KPCA类
import numpy as np
from scipy.linalg import eighclass KernelPCA:def __init__(self, n_components=2, kernel='rbf', gamma=None, degree=3, coef0=1):"""初始化KPCA类:param n_components: 降维后的维度:param kernel: 核函数类型 ('linear', 'poly', 'rbf'):param gamma: RBF核函数中的γ参数:param degree: 多项式核中的度数:param coef0: 多项式核中的常数项"""self.n_components = n_componentsself.kernel = kernelself.gamma = gammaself.degree = degreeself.coef0 = coef0self.alphas = None  # 特征向量self.lambdas = None  # 特征值self.X_fit = None  # 训练数据def _kernel_function(self, X, Y):"""计算核函数:param X: 输入数据矩阵X:param Y: 输入数据矩阵Y:return: 核矩阵"""if self.kernel == 'linear':return np.dot(X, Y.T)elif self.kernel == 'poly':return (np.dot(X, Y.T) + self.coef0) ** self.degreeelif self.kernel == 'rbf':if self.gamma is None:self.gamma = 1.0 / X.shape[1]K = -2 * np.dot(X, Y.T)K += np.sum(X**2, axis=1)[:, np.newaxis]K += np.sum(Y**2, axis=1)return np.exp(-self.gamma * K)else:raise ValueError("未定义的核函数类型。")def fit(self, X):"""训练KPCA模型:param X: 训练数据"""self.X_fit = XK = self._kernel_function(X, X)# 中心化核矩阵n_samples = K.shape[0]one_n = np.ones((n_samples, n_samples)) / n_samplesK = K - one_n @ K - K @ one_n + one_n @ K @ one_n# 特征分解eigvals, eigvecs = eigh(K)eigvals = eigvals[::-1]eigvecs = eigvecs[:, ::-1]self.alphas = eigvecs[:, :self.n_components]self.lambdas = eigvals[:self.n_components]def transform(self, X):"""将新数据映射到KPCA的特征空间:param X: 输入数据矩阵:return: 映射后的低维数据矩阵"""K = self._kernel_function(X, self.X_fit)return K @ self.alphas / self.lambdasdef fit_transform(self, X):"""训练KPCA模型并返回降维后的数据:param X: 输入数据矩阵:return: 映射后的低维数据矩阵"""self.fit(X)return self.transform(X)
2. 在瑞士卷数据集上应用KPCA

我们将使用瑞士卷数据集来展示KPCA的效果,该数据集是一个非线性结构的三维数据集。我们将采用RBF核来对数据进行降维。

from sklearn.datasets import make_swiss_roll
import matplotlib.pyplot as plt# 生成瑞士卷数据集
X, color = make_swiss_roll(n_samples=1000, noise=0.2)# 使用KPCA进行降维
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.1)
X_kpca = kpca.fit_transform(X)# 绘制降维前后的数据分布
fig = plt.figure(figsize=(12, 6))ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.set_title("Original 3D data")ax = fig.add_subplot(122)
ax.scatter(X_kpca[:, 0], X_kpca[:, 1], c=color, cmap=plt.cm.Spectral)
ax.set_title("2D embedding by KPCA")plt.show()
3. 结果分析

通过在瑞士卷数据集上的实验,我们可以看到KPCA成功地将数据从三维映射到二维,同时保留了数据的非线性结构。与传统PCA不同,KPCA能够有效地捕捉数据的曲面结构,使得降维后的数据分布更加紧凑和清晰。

总结

核主成分分析(KPCA)是一种强大的非线性降维工具,通过引入核技巧,KPCA可以将数据映射到高维特征空间并在该空间中应用PCA,从而捕捉数据的非线性结构。在本文中,我们详细介绍了KPCA的原理,并通过Python实现了KPCA算法的面向对象版本。此外,我们还展示了KPCA在瑞士卷数据集上的应用,验证了其有效性和实用性。KPCA适用于各种高维和非线性数据的降维需求,是数据预处理和特征提取的重要工具。


http://www.mrgr.cn/news/10085.html

相关文章:

  • ASAM OpenX系列标准
  • 【多线程】如何保证多线程数据的安全性
  • 【数据结构5】二叉搜索树(插入、查询、删除)
  • 速盾的高防 IP 和 CDN 服务有哪些优势?
  • 除猫毛空气净化器什么牌子好?除猫毛宠物空气净化器测评推荐
  • iPhone13手机照片被误删,有什么方法可以恢复吗?
  • 车企重新审视「自研」
  • Python中的二进制数据处理:`struct` 与 `cffi` 的比较
  • vue3上传excel并在线预览
  • Ant Design Vue 快速上手指南与常见问题排查
  • 武汉流星汇聚:亚马逊热门品类揭秘,中国卖家如何布局海外电商
  • Day16_Zookeeper
  • 表设计-----三大范式
  • 深入理解WebSocket:从基础到实践
  • TypeSript8 泛型学习
  • JVM(Java Virtual Machine,Java虚拟机)
  • minio 大视频观看,下载
  • 飞睿智能10km无人机WiFi中继图传模块,视界无界,高速传输画质高清不卡顿、抗干扰
  • 基于huggingface peft进行qwen1.5-7b-chat训练/推理/服务发布
  • redis与JVM复习思维导向