我目前正在低级学习不同的机器学习方法。由于多项式核
K(x,z)=(1+x^T*z)^d
是最常用的内核之一,我假设这个内核必须为一组固定的数据 {x1,...,xn} 产生一个正(半)定矩阵。但是,在我的实现中,情况似乎并非如此,如以下示例所示:
import numpy as np
np.random.seed(93)
x=np.random.uniform(0,1,5)
#Assuming d=1
kernel=(1+x[:,None]@x.T[None,:])
np.linalg.eigvals(kernel)
输出将是
[ 6.9463439e+00 1.6070016e-01 9.5388039e-08 -1.5821310e-08 -3.7724433e-08]
我也得到了 d>2 的负特征值。我在这里完全误解了什么吗?或者多项式内核根本不是 PSD?
编辑:在以前的版本中,我曾经x=np.float32(np.random.uniform(0,1,5))
减少计算时间,这会导致更多的负特征值(我相信由于数值不稳定性,正如@user2357112 提到的)。我想这是一个很好的例子,说明精度很重要?由于负特征值仍然存在,即使对于 float64 精度,后续问题将是如何避免这种数值不稳定性?