内核近似的Nystroem方法


12

我一直在阅读有关低阶内核近似的Nyström方法。该方法在scikit-learn [1]中实现,作为一种将数据样本投影到内核特征映射的低秩近似的方法。

据我所知,给定训练集和一个核函数,它通过将SVD应用于来生成核矩阵的低秩近似。和。{xi}i=1nn×nKWC

K=[WK21TK21K22] C=[WK21]WRl×l

但是,我不了解如何使用内核矩阵的低秩近似将新样本投影到近似的内核特征空间。我发现的论文(例如[2])并没有太大帮助,因为它们几乎没有说教性。

另外,我对这种方法在训练和测试阶段的计算复杂性感到好奇。

[1] http://scikit-learn.org/stable/modules/kernel_approximation.html#nystroem-kernel-approx

[2] http://www.jmlr.org/papers/volume13/kumar12a/kumar12a.pdf

Answers:


15

让我们以使您的问题的答案更清晰的方式导出Nyström逼近。

Nyström中的关键假设是核函数的等级为。(实际上,我们假设它的等级大约为,但为简单起见,我们暂时假装它的等级刚好为。)这意味着任何内核矩阵最多将具有等级,尤其是 是等级。因此,有非零特征值,我们可以将特征分解写为 mmmm

K=[k(x1,x1)k(x1,xn)k(xn,x1)k(xn,xn)],
mmK
K=UΛUT
其特征向量存储在,形状为,特征值布置在,即对角矩阵。Un×mΛm×m

因此,让我们通常随机地均匀地选择元素,但也可以根据其他方案进行选择-在此简化版本中,最重要的是是满级的。完成后,只需重新标记点,就可以得出以块为单位的内核矩阵: 我们在其中评估(即)和()中的每个条目,但不想评估。mK11

K=[K11K21TK21K22],
K11m×mK21(nm)×mK22

现在,我们也可以根据这种块结构拆分特征分解: 其中是,是。但要注意,现在我们有。因此,通过特征分解已知矩阵我们可以找到和。

K=UΛUT=[U1U2]Λ[U1U2]T=[U1ΛU1TU1ΛU2TU2ΛU1TU2ΛU2T],
U1m×mU2(nm)×mK11=U1ΛU1TU1ΛK11

我们也知道,。在这里,我们知道了该方程中除之外的,因此我们可以求解所隐含的特征值:将两侧均乘以即可得到 现在我们有了评估所需的一切: K21=U2ΛU1TU2(ΛU1T)1=U1Λ1

U2=K21U1Λ1.
K22
K22=U2ΛU2T=(K21U1Λ1)Λ(K21U1Λ1)T=K21U1(Λ1Λ)Λ1U1TK21T=K21U1Λ1U1TK21T(*)=K21K111K21T(**)=(K21K1112)(K21K1112)T.

在(*)中,我们找到了Nyström嵌入的一个版本,您可能只是将其视为定义。这告诉我们要为块输入的有效内核值。K22

在(**)中,我们看到特征矩阵 是形状,对应于这些估算的内核值。如果我们对个点使用,则我们有一组维特征 我们可以快速验证对应于正确的内核矩阵: K21K1112(nm)×mK1112mm

Φ=[K1112K21K1112].
Φ
ΦΦT=[K1112K21K1112][K1112K21K1112]T=[K1112K1112K1112K1112K21TK21K1112K1112K21K1112K1112K21T]=[K11K21TK21K21K111K21T]=K.

因此,我们要做的就是训练具有维特征常规学习模型。这将与使用的学习问题的内核化版本完全相同(在我们所做的假设下)。mΦK

现在,对于单个数据点,的特征对应于 对于分区2中的点,向量只是的相关行,因此可以堆叠这些给了我们 –因此同意分区2中的点。它也适用于分区1:那里,向量是的行,因此将它们堆叠起来会得到,再次同意xΦ

ϕ(x)=[k(x,x1)k(x,xm)]K1112.
x[k(x,x1)k(x,xm)]K21K21K1112ϕ(x)K11K11K1112=K1112Φ。因此...对于训练时看不见的测试点仍然适用。您只需做同样的事情: 因为我们假设内核是等级,所以矩阵的排名也为,并且通过与完全相同的逻辑,的重构仍然是精确的。xnew
Φtest=Ktest,1K1112.
m[KtrainKtrain,testKtest,trainKtest]mKtestK22


以上,我们假定核矩阵是准确等级。通常情况并非如此。对于高斯内核,例如,是始终排名,但后者的特征值通常脱落很快,所以这将是接近的秩的矩阵,而我们的重建或将接近真实值,但不完全相同。的本征空间越接近的本征空间,它们将是更好的重构。KmKnmK21Ktest,1K11K总的来说,这就是为什么在实践中选择正确的点很重要的原因。m

还要注意,如果特征值为零,则可以用伪逆代替逆,并且一切仍然有效;您只需更换在重建。K11K21K21K11K11

如果需要,可以使用SVD而不是特征分解。因为是psd,所以它们是同一回事,但是SVD可能对内核矩阵中的轻微数字误差更健壮,因此scikit-learn就是这样做的。scikit-learn的实际实现可以做到这一点,尽管它使用而不是伪逆来实现。Kmax(λi,1012)


1
当为正半定值时,特征分解与SVD一致。scikit-learn,因为由于数值误差,可能稍微不为psd,而是计算,并使用,因此该的特征变得。基本上是同一回事。AUΛUTAUΣVTA12=VΣ12VTAAVΣ12VT=UΣVTVΣ12VT=UΣ12VT=A12
Dougal

1
抱歉,是的,他们使用。自从以来,这一切都不重要,但是由于它们进行了转置,因此最终。UΣ12VT=K12UVK11UΣVTVΣ12UT=UΣ12UT
Dougal

1
将对角矩阵提高到幂与将每个元素提高到幂相同,并且。在numpy广播表示法中,向量的逐元素乘法与右对角矩阵乘以相同。此外,该代码使用来的意思我打电话。x12=1/xVVT
Dougal

1
抱歉,最多只能达到(在重新标记的顺序中,这样才是Nyström的基点)。将修复。xm
Dougal

1
x是数据点,此处未指定尺寸。可能在,或者可能是字符串或其他内容;只想说,,使。然后只是为不同的输入叠加了。xRdxXk:X×XRϕ:XRmk(x,xi)m
Dougal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.