В настоящее время я изучаю различные методы машинного обучения на низкоуровневой основе. Так как ядро полинома
К (х, г) = (1 + х ^ Т * г) ^ д
- одно из наиболее часто используемых ядер, я предполагал, что это ядро должно давать положительную (полу) определенную матрицу для фиксированного набора данных {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, последующим вопросом будет, как избежать такой числовой нестабильности?