Прежде всего , немного информации о ядрах и SVM ...
Если вы хотите предварительно вычислить ядро для n
векторов (любого измерения), вам нужно вычислить функцию ядра между каждой парой примеров. Функция ядра берет два вектора и дает скаляр, поэтому вы можете думать о предварительно вычисленном ядре как о nxn
матрице скаляров. Обычно ее называют матрицей ядра или иногда матрицей Грама.
Существует много разных ядер, самое простое - линейное ядро (также известное как скалярное произведение):
sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors
Во-вторых , пытаясь ответить на вашу проблему ...
Документация по предварительно вычисленным ядрам в libsvm на самом деле довольно хорошая ...
Assume the original training data has three four-feature instances
and testing data has one instance:
15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1
If the linear kernel is used, we have the following
new training/testing sets:
15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1
15 0:? 1:2 2:0 3:1
Каждый вектор во втором примере - это строка в матрице ядра. Значение в индексе ноль является значением идентификатора, и это, кажется, просто последовательный счет. Значение по индексу 1 первого вектора является значением функции ядра первого вектора из первого примера с самим собой (т. Е. (1x1)+(1x1)+(1x1)+(1x1) = 4
), второе - значением функции ядра первого вектора со вторым ( т.е. (1x3)+(1x3)=6
). Это следует так же для остальной части примера. Вы можете видеть, что матрица ядра является симметричной, как и должно быть, потому что K (x, y) = K (y, x).
Стоит отметить, что первый набор векторов представлен в разреженном формате (т. Е. Отсутствующие значения равны нулю), но матрица ядра не является и не должна быть разреженной. Я не знаю, почему это так, кажется, это просто libsvm.