Как получить все альфа-значения классификатора SVM scikit-learn?

Мне нужны альфа-значения, которые являются множителями Лагранжа для двойной задачи SVM, после обучения классификатора SVM с помощью scikit-learn. Согласно документу, кажется, что Scikit-Learn обеспечивает только svm.dual_coef_, который является произведением альфа-множителя Лагранжа и метки точки данных.

Я попытался вычислить альфа-значение вручную, разделив элементы svm.dual_coef_ по метке данных, но так как svm.dual_coef_ хранит только коэффициенты опорных векторов, я не уверен, что если я переберу этот массив, порядок опорных векторов будет таким же, как в исходных обучающих данных.

Так есть ли надежный способ получить альфа-значения векторов поддержки?

1 ответ

Решение

Поскольку альфа-значения по определению положительны, вы можете получить их, взяв abs из dual_coefs:

alphas = np.abs(svm.dual_coef_)

Это прямое следствие того факта, что

svm.dual_coef_[i] = labels[i] * alphas[i]

где labels[i] либо -1 или же +1 а также alphas[i] всегда позитивны. Кроме того, вы также можете получить каждый ярлык через

labels = np.sign(svm.dual_coef_)

используя то же наблюдение. По этой же причине scikit-learn не хранит альфы как таковые - они однозначно представлены как dual_coefs_ вместе с метками.

Это легко понять, если проанализировать все возможные случаи:

  • labels[i] == -1 а также alphas[i] > 0 => dual_coef_[i] < 0 а также dual_coef_[i] == -alphas[i] == labels[i] * alphas[i]
  • labels[i] == -1 а также alphas[i] < 0 => невозможно (альфа неотрицательны)
  • labels[i] == -1 а также alphas[i]== 0 => это не опорный вектор
  • labels[i] == +1 а также alphas[i] > 0 => dual_coef_[i] > 0 а также dual_coef_[i] == alphas[i] == labels[i] * alphas[i]
  • labels[i] == +1 а также alphas[i] < 0 => невозможно (альфа неотрицательны)
  • labels[i] == +1 а также alphas[i]== 0 => это не опорный вектор

Следовательно, если dual_coef_[i] положительно, то это alphas[i] коэффициент, и он принадлежит к положительному классу, и если он отрицательный, alphas[i] == -dual_coef_[i] и это относится к отрицательному классу.

Другие вопросы по тегам