Я искал сеть в течение ~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 и пример предварительно вычисленных ядер действительно ценятся.
Прежде всего , немного предыстории ядер и 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.