Предварительно вычисленные ядра с LibSVM в Python

Я искал сеть в течение ~3 часов, но я еще не мог найти решение. Я хочу дать предварительно вычисленное ядро libsvm и классифицировать набор данных, но:

  • Как я могу генерировать предварительно вычисленное ядро? (например, что основным является предварительно вычисленное ядро для данных Iris?)

  • В libsvm документации указано что:

    Для предварительно вычисленных ядер первый элемент каждого экземпляра должен быть идентификатором. Например,

            samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]]
            problem = svm_problem(labels, samples)
            param = svm_parameter(kernel_type=PRECOMPUTED)
    

Что такое идентификатор? Нет никакой более подробной информации об этом. Я могу присвоить идентификатор последовательно?

Любая справка libsvm и пример предварительно вычисленных ядер действительно ценятся.

9
задан Lyyli 19 March 2010 в 01:32
поделиться

1 ответ

Прежде всего , немного предыстории ядер и SVM ...

Если вы хотите предварительно вычислить ядро ​​для n векторов (любой размерности), что нужно сделать вычисляет функцию ядра между каждой парой примеров. Функция ядра принимает два вектора и дает скаляр, поэтому вы можете думать о предварительно вычисленном ядре как о матрице скаляров nxn . Обычно это называется матрицей ядра или иногда матрицей Грама.

Существует много разных ядер, самым простым из которых является линейное ядро ​​(также известное как скалярное произведение):

sum (x_i * y_i) for i in [1..N] where (x_1, ..., x_N) (y_1, .., y_N) - векторы

Во-вторых, , пытаюсь ответить на вашу проблему ...

Документация о предварительно вычисленных ядрах в 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.

16
ответ дан 4 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: