Nonlinear Component Analysis as a Kernel Eigenvalue Problem

article/2025/10/3 8:36:21

目录

  • kernel PCA
    • kernel 的选择
    • 性质
    • 一些问题
  • 代码

Scholkopf B, Smola A J, Muller K, et al. Nonlinear component analysis as a kernel eigenvalue problem[J]. Neural Computation, 1998, 10(5): 1299-1319.

普通的PCA将下式进行特征分解(用论文的话讲就是对角化):
\[ C = \frac{1}{M} \sum \limits_{j=1}^M x_j x_j^T \]
其中\(x_j \in \mathbb{R}^{N}, j = 1, \ldots, M\),且\(\sum \limits_{j=1}^M x_j = 0\)(中心化)。

而kernel PCA试图通过一个非线性函数:
\[ \Phi:\mathbb{R}^N \rightarrow F, x \rightarrow X \]
其中\(F\)是一个高维空间(甚至是无限维)。
所以我们要解决这么一个问题:
\[ \bar{C} = \frac{1}{M} \sum_{j=1}^M \Phi (x_j) \Phi(x_j)^T \]

其实我们面对的第一个问题不是维度的问题而是\(\Phi\)的选择或者说构造。我们为什么要把数据映射到高维的空间?因为当前数据的结构(或者说分布)并不理想。

比如满足\((x-1)^2+(y-1)^2=4\)的点,我们可以扩充到高维空间\((x^2, x, y, y^2)\),在高维空间是线性的(虽然这个例子用在kernel SVM 比较好)。

因为\(\Phi(\cdot)\)的构造蛮麻烦的,即便有一些先验知识。我们来看一种比较简单的泛用的映射:
\[ (x_1, x_2, x_3) \rightarrow (x_1^3, x_2^3, x_3^3, x_1^2x_2,x_1^2x_3,x_1x_2^2,x_1x_3^2,x_2^2x_3,x_2x_3^2,x_1x_2x_3) \]
这种样子的映射,很容易把维度扩充到很大很大,这个时候求解特征问题会变得很麻烦。

kernel PCA

假设\(\sum \limits_{i=1}^M \Phi(x_i)=0\)(如何保证这个性质的成立在最后讲,注意即便\(\sum \limits_{i=1}^M x_i = 0\)\(\sum \limits_{i=1}^M \Phi(x_i)=0\)也不一定成立)。

假设我们找到了\(\bar{C}\)的特征向量\(V \ne 0\):
\[ \bar{C}V = \lambda V \]
因为\(V\)\(\Phi(x_i),i=1,\ldots, M\)的线性组合(这个容易证明),所以,\(V\)可以由下式表示:
\[ V = \sum \limits_{i=1}^M \alpha_i \Phi(x_i) \]

所以:
\[ \lambda V^T \Phi(x_j) = V^T\bar{C} \Phi(x_j), \quad for \: all \: j=1,\ldots, M \]
等价于(记\(\Phi = [\Phi(x_1), \ldots, \Phi(x_M)]\)):
\[ \begin{array}{ll} \lambda \sum \limits_{i=1}^M \alpha_i (\Phi^T(x_i)\Phi(x_j)) &= \lambda \{ \Phi^T \Phi(x_j)\} ^T \alpha \\ & =\frac{1}{M} \sum \limits_{i=1}^M \alpha_i \Phi^T(x_i) \Phi \Phi^T \Phi(x_j) \\ & = \frac{1}{M} \{\Phi^T \Phi \Phi^T \Phi(x_j)\}^T \alpha \end{array} \]
对于\(j=1,\ldots, M\)均成立,其中\(\alpha = [\alpha_1, \ldots, \alpha_M]^T\)

等价于:
\[ M \lambda \Phi^T \Phi \alpha = \Phi^T \Phi \Phi^T \Phi \alpha \]
\(K = \Phi^T \Phi\),那么可写作:
\[ M \lambda K \alpha = K^2\alpha \]
其中\(K_{ij} = \Phi^T(x_i) \Phi(x_j)\)

所以,我们可以通过下式来求解\(\alpha\):
\[ M\lambda \alpha = K \alpha \]
\(\alpha\)\(K\)的特征向量(注意,当\(\alpha\)为特征向量的时候是一定符合\(M \lambda K \alpha = K^2\alpha\)的,反之也是的,即二者是等价的)。

假设\(\lambda_1 \ge \lambda_2 \ge \ldots \ge \lambda_M\)对应\(\alpha^1, \ldots, \alpha^M\),那么相应的\(V\)也算是求出来了。

需要注意的是,\(\|\alpha\|\)往往不为1,因为我们希望\(\|V\|=1\),所以:
\[ V^TV = \alpha^T K \alpha = \lambda \|\alpha\|^2 = 1 \]
所以\(\|\alpha\| = \frac{1}{\sqrt{\lambda}}\)

PCA当然需要求主成分,假设有一个新的样本\(x\),我们需要求:
\[ \Phi(x)^TV = \Phi^T(x) \Phi \alpha = \sum \limits_{i=1}^M \alpha_i \Phi^T(x_i) \Phi(x) \]

注意,我们只需要计算\(\Phi^T(x_i) \Phi(x)\)

现在回到kernel PCA 上的关键kernel上。注意到,无论是K,还是最后计算主成分,我们都只需要计算\(\Phi^T(x)\Phi(y)\)就可以了,所以如果我们能够找到一个函数\(k(x,y)\)来替代就不必显示将\(x\)映射到\(\Phi(x)\)了,这就能够避免了\(\Phi(\cdot)\)的选择问题和计算问题。

kernel 的选择

显然,PCA的\(\lambda \ge 0\),所以我们也必须保证\(K\)为半正定矩阵,相应的核函数\(k\)称为正定核,Mercer定理有相应的构建。

也有现成的正定核:

多项式核

\[ k(x, y) = (x^Ty + 1)^d \]
论文中是\((x^Ty)^d\)

高斯核函数

\[ k(x, y) = \exp \{\ -\frac{\|x-y\|^2}{2\sigma^2}\} \]

性质

在这里插入图片描述
论文用上面的一个例子来说明,kernel PCA可能更准确地抓住数据的结构。

kernel PCA具有普通PCA的性质,良好的逼近(从方差角度),以及拥有最多的互信息等等。并且,如果\(k(x, y) = k(x^Hy)\),那么kernel PCA还具有酉不变性。

因为普通的PCA处理的是一个\(N \times N\)的协方差矩阵,所以,至多获得\(N\)个载荷向量,而kernel PCA至多获得\(M\)个载荷向量(特征值非零)。所以,kernel PCA有望比普通PCA更加精准。

一些问题

中心化

PCA处理的是协方差矩阵,正如我们最开始所假设的,\(\sum \limits_{i=1}^{M} \Phi(x_i)=0\),即中心化。因为\(\Phi(\cdot)\)并不是线性函数,所以,即便\(\sum \limits_{i=1}^M x_i = 0\)也不能保证\(\sum \limits_{i=1}^{M} \Phi(x_i)=0\),不过有别的方法处理。

\[ \tilde{\Phi}(x_i) = \Phi(x_i) - \frac{1}{M}\sum \limits_{k=1}^M \Phi(x_k) \\ \tilde{K}_{ij} = \tilde{\Phi}^T(x_i) \Phi(x_j) \\ 1_{M} = \{1\}_{ij}^{M \times M} \]
可以得到:
\[ \begin{array}{ll} \tilde{K}_{ij} &= \tilde{\Phi}^T(x_i) \Phi(x_j) \\ &= \big(\Phi(x_i) - \frac{1}{M}\sum \limits_{k=1}^M \Phi(x_k)\big)^T \big(\Phi(x_j) - \frac{1}{M}\sum \limits_{k=1}^M \Phi(x_k)\big) \\ &= K_{ij} - \frac{1}{M} \sum \limits_{k=1}^M K_{kj} - \frac{1}{M} \sum \limits_{k=1}^M K_{ik} + \frac{1}{M^2} \sum \limits \limits_{m,n=1}^M K_{mn} \\ &= (K - 1_MK - K1_M + 1_MK1_M)_{ij} \end{array} \]
于是,我们通过\(K\)可以构造出\(\tilde{K}\)。只需再求解\(\tilde{K}\tilde{\alpha} = M \lambda \tilde{\alpha}\)即可。

恢复

我们知道,根据PCA选出的载荷向量以及主成分,我们能够恢复出原数据(或者近似,如果我们只选取了部分载荷向量)。对于kernel PCA,比较困难,因为我们并没有显式构造\(\Phi(\cdot)\),也就没法显式找到\(V\),更何况,有时候我们高维空间找到\(V\)在原空间中并不存在原像。
或许, 我们可以通过:
\[ \min \limits_{x} \quad \|\Phi(x) - \Phi(\hat{x})\|^2 \]
来求解,注意到,上式也只和核函数\(k(x,y)\)有关。

代码


import numpy as npclass KernelPCA:def __init__(self, data, kernel=1, pra=3):self.__n, self.__d = data.shapeself.__data = np.array(data, dtype=float)self.kernel = self.kernels(kernel, pra)self.__K = self.center()@propertydef shape(self):return self.__n, self.__d@propertydef data(self):return self.data@propertydef K(self):return self.__K@propertydef alpha(self):return self.__alpha@propertydef eigenvalue(self):return self.__valuedef kernels(self, label, pra):"""数据是一维的时候可能有Bug:param label: 1:多项式;2:exp:param pra:1: d; 2: sigma:return: 函数 或报错"""if label is 1:return lambda x, y: (x @ y) ** praelif label is 2:return lambda x, y: \np.exp(-(x-y) @ (x-y) / (2 * pra ** 2))else:raise TypeError("No such kernel...")def center(self):"""中心化"""oldK = np.zeros((self.__n, self.__n), dtype=float)one_n = np.ones((self.__n, self.__n), dtype=float)for i in range(self.__n):for j in range(i, self.__n):x = self.__data[i]y = self.__data[j]oldK[i, j] = oldK[j, i] = self.kernel(x, y)return oldK - 2 * one_n @ oldK + one_n @ oldK @ one_ndef processing(self):"""实际上就是K的特征分解,再对alpha的大小进行一下调整"""value, alpha = np.linalg.eig(self.__K)index = value > 0value = value[index]alpha = alpha[:, index] * (1 / np.sqrt(value))self.__alpha = alphaself.__value = value / self.__ndef score(self, x):"""来了一个新的样本,我们进行得分"""k = np.zeros(self.__n)for i in range(self.__n):y = self.__data[i]k[i] = self.kernel(x, y)return k @ self.__alpha"""import matplotlib.pyplot as pltx = np.linspace(-1, 1, 100)
y = x ** 2 + [np.random.randn() * 0.1 for i in range(100)]
data = np.array([x, y]).Ttest = KernelPCA(data, pra=1)
test.processing()
print(test.alpha.shape)
print(test.alpha[:, 0])"""

转载于:https://www.cnblogs.com/MTandHJ/p/10769915.html


http://chatgpt.dhexx.cn/article/haPM7Fc0.shtml

相关文章

拉格朗日乘数法和KKT条件的直观解释

拉格朗日乘数法和KKT条件的直观解释 标签(空格分隔): 机器学习 linbin 2018-05-10 Abstract 在SVM的推导中,最优化问题是其中的核心,这里我们简单介绍下最优化问题,特别是带有约束的最优化问题&#xff…

[Math Algorithm] 拉格朗日乘数法

https://www.cnblogs.com/maybe2030/p/4946256.html 阅读目录 1. 拉格朗日乘数法的基本思想2. 数学实例3. 拉格朗日乘数法的基本形态4. 拉格朗日乘数法与KKT条件 拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解&…

每天五分钟机器学习算法:拉格朗日乘数法和KKT条件

KKT条件 当我们要求一个函数的极值,同时还有两种类型的约束条件,一种约束条件是等式约束,另外一种约束是不等式约束: x是一个变量(n维,n个样本),我们想要找到使得f(x)最大的x,还要满足上面的约束。此时KKT条件就出来说话了,如果要想让x满足这个条件下的f(x)的最大…

拉格朗日乘数法及python实现拉格朗日乘数法

拉格朗日乘数法(Lagrange Multiplier Method)基本思想 作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(nk&am…

SVM(一):拉格朗日乘数法详解

目录 what直观理解法高数书上的解法 学习SVM的过程中遇到了这个拉格朗日乘数法,之前学高数的时候也学过,不过看到视频里的直观理解法和高数书上的解法有些不同,于是在这里把这两种方法记录下来,也当做是一次理解的过程。 what 先…

拉格朗日乘数法什么时候考虑端点?解得的点是什么?

问题提出 2013年的真题有一道题是用拉格朗日乘数法只能求出来一个点,当时很费解,因此查阅相关资料后,对这部分的知识做一个小总结。 无条件极值和条件极值 首先,在求无条件极值的时候,我们求的是曲面上的极值点。 例…

拉格朗日乘数法的原理,我用10幅图把它讲清楚

机器学习是一个目标函数优化问题,给定目标函数f,约束条件会有一般包括以下三类: 仅含等式约束仅含不等式约束等式和不等式约束混合型 当然还有一类没有任何约束条件的最优化问题 关于最优化问题,大都令人比较头疼,首先…

java 获取随机数方法,java生成随机数的三种方法

随机数有三种生成方式: 1、通过Math.random()方法 2、通过System.currentTimeMillis()方法获取毫秒数 3、通过Random类 第一种:常用方法Math.random()方法,是获取0-1之间的double类型的小数,在通过int类型墙砖即可 示例&#xff1…

Java生成随机数的方式

目录 Random基础使用优缺点分析 SecureRandom基础使用 总结:持续更新 Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数。Random 使用的随机算法为 linear congruential pseudorandom number generator (LGC)…

Java 生成随机数的 5 种方式,你知道几种?

点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看” 作者:专职跑龙套链接:https://www.jianshu.com/p/2f6acd169202 1. Math.random(…

java 生成随机数 (Random函数)

目录 一、Random是什么? 二、使用步骤 1.引入库 2.创建对象 3.生成随机数 4.完整代码 总结 一、Random是什么? 生成随机数函数 二、使用步骤 1.引入库 代码如下: import java.util.Random; 2.创建对象 代码如下: R…

Java中生成随机数的4种方式!

在 Java 中,生成随机数的场景有很多,所以本文我们就来盘点一下 4 种生成随机数的方式,以及它们之间的区别和每种生成方式所对应的场景。 1.Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的…

谈论SQL注入攻击的重要性

"SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。黑客或者恶搞的用户,利用了程序开发人员在开发的时候没有对SQL进行严格的处理而造成的漏洞&#…

【SQL注入攻击介绍】

目录 前言 本质和危害 分类 注入一般步骤 注入实战 前言 sql注入一直以来都稳居owasp-top10榜首,近年来更是爆出很多的数据库泄露攻击事件,如最近上海某公安存在数据库泄露事件。今天简单的分析以下sql注入的一些特性和方式: owasp-t…

SQL注入攻击与防护

目录 一、SQL注入攻击概述 1.1 SQL注入概念 1.1.1 标准查询过程 1.1.2 SQL注入定义 1.2 SQL注入根本原因 1.3 SQL注入条件 1.4 SQL注入防范 1.4.1 根本原因:过滤不严 1.4.2 安全设计原则:数据与代码分离 1.5 SQL注入流程 1.6 SQL注入分类 1.…

使用日志进行调查 - SQL 注入攻击示例

日志文件是服务器提供的非常有价值的信息。几乎所有服务器、服务和应用程序都提供某种日志记录。日志文件记录在服务或应用程序运行期间发生的事件和操作。 日志文件为我们提供了服务器行为的精确视图以及关键信息,例如何时、如何以及由谁访问服务器。此类信息可以…

Web—SQL注入攻击

文章目录 一、mysql常用语句二、SQL注入概念1. 产生原因2. 攻击分类 三、攻击流程1. 常用检测语句如何识别SQL注入2. Mysql注入常用函数3. 查询数据的核心语法4. 联合查询5. 报错注入6. 布尔盲注7. 时间盲注8. SQL注入爆库语句9. Sqlmap常用命令 四、常见防护手段及绕过方式1. …

DVWA SQL注入攻击

SQL注入原理 SQL注入就是通过SQL命令插入到web表单递交或输入域名页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在WEB表…

sql注入攻击实例mysql_SQL 注入攻击案例

一、检测注入点 二、判断是否存在 SQL 注入可能 三、数据库爆破 四、字段爆破 五、数据库表爆破 六、用户名、密码爆破 七、总结 一、检测注入点 首先,在 http://120.203.13.75:6815/?id=1 目标站点页面发现了 ?id,说明可以通过查询 id=1 的内容来获得页面。 这相当于查询语…

SQL注入攻击实战演示(附源码)

SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。 文章目录: 何谓SQL注入? SQL数据库操…