让我们以使您的问题的答案更清晰的方式导出Nyström逼近。
Nyström中的关键假设是核函数的等级为。(实际上,我们假设它的等级大约为,但为简单起见,我们暂时假装它的等级刚好为。)这意味着任何内核矩阵最多将具有等级,尤其是
是等级。因此,有非零特征值,我们可以将特征分解写为
mmmm
K=⎡⎣⎢⎢k(x1,x1)⋮k(xn,x1)…⋱…k(x1,xn)⋮k(xn,xn)⎤⎦⎥⎥,
mmKK=UΛUT
其特征向量存储在,形状为,特征值布置在,即对角矩阵。
Un×mΛm×m
因此,让我们通常随机地均匀地选择元素,但也可以根据其他方案进行选择-在此简化版本中,最重要的是是满级的。完成后,只需重新标记点,就可以得出以块为单位的内核矩阵:
我们在其中评估(即)和()中的每个条目,但不想评估。mK11
K=[K11K21KT21K22],
K11m×mK21(n−m)×mK22
现在,我们也可以根据这种块结构拆分特征分解:
其中是,是。但要注意,现在我们有。因此,通过特征分解已知矩阵我们可以找到和。
K=UΛUT=[U1U2]Λ[U1U2]T=[U1ΛUT1U2ΛUT1U1ΛUT2U2ΛUT2],
U1m×mU2(n−m)×mK11=U1ΛUT1U1ΛK11
我们也知道,。在这里,我们知道了该方程中除之外的,因此我们可以求解所隐含的特征值:将两侧均乘以即可得到
现在我们有了评估所需的一切:
K21=U2ΛUT1U2(ΛUT1)−1=U1Λ−1
U2=K21U1Λ−1.
K22K22=U2ΛUT2=(K21U1Λ−1)Λ(K21U1Λ−1)T=K21U1(Λ−1Λ)Λ−1UT1KT21=K21U1Λ−1UT1KT21=K21K−111KT21=(K21K−1211)(K21K−1211)T.(*)(**)
在(*)中,我们找到了Nyström嵌入的一个版本,您可能只是将其视为定义。这告诉我们要为块输入的有效内核值。K22
在(**)中,我们看到特征矩阵 是形状,对应于这些估算的内核值。如果我们对个点使用,则我们有一组维特征
我们可以快速验证对应于正确的内核矩阵:
K21K−1211(n−m)×mK1211mm
Φ=⎡⎣⎢K1211K21K−1211⎤⎦⎥.
ΦΦΦT=⎡⎣⎢K1211K21K−1211⎤⎦⎥⎡⎣⎢K1211K21K−1211⎤⎦⎥T=⎡⎣⎢K1211K1211K21K−1211K1211K1211K−1211KT21K21K−1211K−1211KT21⎤⎦⎥=[K11K21KT21K21K−111KT21]=K.
因此,我们要做的就是训练具有维特征常规学习模型。这将与使用的学习问题的内核化版本完全相同(在我们所做的假设下)。mΦK
现在,对于单个数据点,的特征对应于
对于分区2中的点,向量只是的相关行,因此可以堆叠这些给了我们 –因此同意分区2中的点。它也适用于分区1:那里,向量是的行,因此将它们堆叠起来会得到,再次同意xΦ
ϕ(x)=[k(x,x1)…k(x,xm)]K−1211.
x[k(x,x1)…k(x,xm)]K21K21K−1211ϕ(x)K11K11K−1211=K1211Φ。因此...对于训练时看不见的测试点仍然适用。您只需做同样的事情:
因为我们假设内核是等级,所以矩阵的排名也为,并且通过与完全相同的逻辑,的重构仍然是精确的。
xnewΦtest=Ktest,1K−1211.
m[KtrainKtest,trainKtrain,testKtest]mKtestK22
以上,我们假定核矩阵是
准确等级。通常情况并非如此。对于高斯内核,例如,是
始终排名,但后者的特征值通常脱落很快,所以这将是
接近的秩的矩阵,而我们的重建或将
接近真实值,但不完全相同。的本征空间越接近的本征空间,它们将是更好的重构。
KmKnmK21Ktest,1K11K总的来说,这就是为什么在实践中选择正确的点很重要的原因。
m
还要注意,如果特征值为零,则可以用伪逆代替逆,并且一切仍然有效;您只需更换在重建。K11K21K21K†11K11
如果需要,可以使用SVD而不是特征分解。因为是psd,所以它们是同一回事,但是SVD可能对内核矩阵中的轻微数字误差更健壮,因此scikit-learn就是这样做的。scikit-learn的实际实现可以做到这一点,尽管它使用而不是伪逆来实现。Kmax(λi,10−12)