У меня есть пустой массив с m столбцами и n строками, столбцы с размерами и точками данных строк.
Теперь мне нужно рассчитать значения ядра для каждой комбинации точек данных.
Для линейного ядра я могу просто сделатьdot(X,X.T)
Как эффективно рассчитать все значения для гауссова ядра с заданным s ?
python
kernel-trick
numpy
Питер Смит
источник
источник
Ответы:
Я думаю, что главная проблема состоит в том, чтобы получить попарные расстояния эффективно. Если у вас есть это, все остальное стихийно.
Для этого вы, вероятно, хотите использовать scipy. Функция
scipy.spatial.distance.pdist
делает то, что вам нужно, иscipy.spatial.distance.squareform
, возможно, облегчит вашу жизнь.Так что если вы хотите матрицу ядра, вы делаете
Документацию можно найти здесь .
источник
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
очень прост: это просто C-реализованный цикл, который напрямую вычисляет расстояния очевидным образом , цикл выполняется здесь ; никакая причудливая векторизация или что-то помимо того, что компилятор может выполнить автоматически.В качестве небольшого дополнения к ответу Байержа,
pdist
функция Сципи может напрямую вычислять квадратные евклидовы нормы, называя это какpdist(X, 'sqeuclidean')
. Полный код может быть написан более эффективно, какисточник
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
который дает то же самое.Вы также можете написать квадратную форму вручную:
PS но это работает на 30% медленнее
источник
einsum
звонок для вашегоX2
.который равен
Вы можете эффективно рассчитать RBF из приведенного выше кода, отметив, что значение гаммы равно 1, поскольку оно является константой, которую вы запрашивали, также является той же константой.
источник
Я думаю, что это поможет:
источник