Я пытаюсь вычислить функцию принятия решения SVC-классификатора MANUALLY (в отличие от использования встроенного метода) с использованием библиотеки python SKLearn.Вычисление функции решения SVM вручную
Я пробовал несколько методов, однако, я могу только когда-либо получить ручной расчет, чтобы соответствовать, когда я не масштаб мои данные.
z
- это тестовая данность (она была масштабирована), и я думаю, что другие переменные говорят сами за себя (также я использую ядро rbf, если это не очевидно из кода).
Вот методы, которые я пробовал: метод
1 Цикличность:
dec_func = 0
for j in range(np.shape(sup_vecs)[0]):
norm2 = np.linalg.norm(sup_vecs[j, :] - z)**2
dec_func = dec_func + dual_coefs[0, j] * np.exp(-gamma*norm2)
dec_func += intercept
2 Векторизованного Метод
diff = sup_vecs - z
norm2 = np.sum(np.sqrt(diff*diff), 1)**2
dec_func = dual_coefs.dot(np.exp(-gamma_params*norm2)) + intercept
Однако, ни один из них никогда не возвращает то же значение, decision_function
. Я думаю, что это может быть связано с изменением моих ценностей или, скорее, с чем-то глупым, что я уже смотрел!
Любая помощь будет оценена по достоинству.
Вы пробовали с '' kernel = precomputed'' и передавали в ядре, которое вы сами вычислили? –
@AndreasMueller, я использовал ядро rbf «с полки», содержащееся в классе SVC, с C = 1000 и гамма = 0,01. После обучения я вызываю 'clf.decision_function (z)' и получаю значение, однако это значение никогда не совпадает с значением, которое я создаю, когда я выполняю вычисление вручную, как показано выше ... Мне интересно, если что-то не так с моя математика или есть ошибка в libsvm? – user1182556
Да, мне тоже интересно, и я хотел бы получить подтверждение об этом. Я предлагал использовать предварительно вычислимое ядро, так как это обеспечило бы то, что вычисление ядра внутри libsvm будет таким же, как и то, которое вы делаете. Кто-то сообщал о подобной проблеме ранее, и я боюсь, что где-то там был введен знак. –