Полиномиальное ядро ​​не PSD? - PullRequest
0 голосов
/ 08 ноября 2018

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

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

...