Возврат лучших опорных векторов из машины опорных векторов - PullRequest
0 голосов
/ 08 января 2019

Я использую классификатор опорных векторов из sklearn (в Python), чтобы найти оптимальную границу между набором данных, помеченных цифрами «0» и «1».

См .: https://scikit -learn.org / stable / modules / Генерируемый / sklearn.svm.SVC.html

Однако я хочу выполнить некоторый анализ после поворота данных о граничной линии, и поэтому мне нужно вернуть свойства, которые позволят мне определить линию, с которой нужно начинать.

Я выполняю SVC следующим образом:

Соответствующий импорт:

from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt

Я определяю классификатор как:

clf = svm.SVC(kernel='linear',C = 1e-3 ,class_weight='balanced')

Что затем соответствует данным тренировки:

clf.fit(f_train, labels_train)

После чего линейную границу класса можно просмотреть с помощью:

plt.figure()
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
           linestyles=['--', '-', '--'])

Как видно из: https://scikit -learn.org / stable / auto_examples / svm / plot_separating_hyperplane.html

Но при звонке:

clf.support_vectors_.shape

Я не уверен, как интерпретировать выходные данные как релевантные, если пытаюсь описать линейную границу, поскольку выходные данные имеют форму (4485, 2)

Будем весьма благодарны за любую помощь в возврате чего-либо, что позволит мне определить границу!

1 Ответ

0 голосов
/ 10 января 2019

На основе Построение трехмерной границы принятия решения Из линейного SVM вы можете получить граничную линию, используя атрибуты clf.intercept_ и clf.coef_:

def decision_hyperplane(clf, x, y=None, dimension=2):
    """
    Return a decision line (dimension 2, return y based on x) or a 
    decision plane (dimension 3, return z based on x and y).

    Decision plane equation is wx + b = 0, so in 2d case:
    w.dot(x) + b = w_x * x + w_y * y + b = 0
    y = (-w_x * x - b) / w_y
    In 3d:
    w_x * x + w_y * y + w_z * z + b = 0
    z = (-w_x * x - w_y * y - b) / w_z
    """
    if dimension == 2:
        return (-clf.intercept_[0] - clf.coef_[0][0] * x) / clf.coef_[0][1]
    elif dimension == 3:
        return (-clf.intercept_[0] - clf.coef_[0][0] * x - clf.coef_[0][1] * y) / clf.coef_[0][2]

Если вы используете его с таким кодом, как этот

ax.plot(xx, decision_hyperplane(clf, xx), color='red')

результат будет enter image description here

...