Полиномиальное ядро ​​не PSD?

В настоящее время я изучаю различные методы машинного обучения на низком уровне. Так как ядро ​​полинома

К (х, г)=(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, последующим вопросом будет, как избежать такой численной нестабильности?

0 ответов

Другие вопросы по тегам