Как построить границы решений SVM с разными ядрами? (3 класса, 3 функции)

Я пытаюсь построить границы решений для SVM с разными ядрами, такими как rbf, poly и linear.

Я использую набор данных iris, доступный онлайн, который имеет форму 150 * 4, поэтому я удалил 4-й признак, и теперь он имеет форму 150 * 3. Обратите внимание, что каждый класс теперь содержит 50 образцов с 3 функциями в порядке их появления.

class1 = iris[:50, :], class2 = iris[50:100, :], class3 = iris[100:150, :]

Я уже построил график с «линейным» ядром, НО я понятия не имею, как построить график с другими ядрами. Я искал несколько дней и не нашел ничего, что я мог бы понять или использовать.

Это две поверхности, которые разделяют разные классы

    z_linear = lambda x, y: (-clf.intercept_[0] - clf.coef_[0][0] * x - clf.coef_[0][1] * y) / clf.coef_[0][2]
    w_linear = lambda x, y: (-clf.intercept_[2] - clf.coef_[2][0] * x - clf.coef_[2][1] * y) / clf.coef_[2][2]

Границы решения SVM с линейным ядром

Теперь мне нужно построить 3 класса и поверхности, которые их разделяют, используя другие ядра (например, «rbf», «poly» со «степенью = 3»)


person Sadegh    schedule 05.01.2021    source источник


Ответы (2)


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

Перейдите по этим двум ссылкам: https://scikit-learn.org/0.18/auto_examples/svm/plot_iris.html

https://jakevdp.github.io/PythonDataScienceHandbook/05.07-support-vector-machines.html

person Chandan Malla    schedule 11.01.2021
comment
Эти решения можно использовать только для двухмерных объектов, и я не мог настроить их для трехмерных объектов. Когда я слежу за реализациями, обычно возникает проблема с размерностью, например, xx, yy, zz = meshgrid(X, Y, Z) не в том измерении, которое я хочу. Я не понял, что это проблема. - person Sadegh; 19.01.2021

def draw_line(coef,intercept, mi, ma):
    # for the separating hyper plane ax+by+c=0, the weights are [a, b] and the intercept is c
    # to draw the hyper plane we are creating two points
    # 1. ((b*min-c)/a, min) i.e ax+by+c=0 ==> ax = (-by-c) ==> x = (-by-c)/a here in place of y we are keeping the minimum value of y
    # 2. ((b*max-c)/a, max) i.e ax+by+c=0 ==> ax = (-by-c) ==> x = (-by-c)/a here in place of y we are keeping the maximum value of y
    points=np.array([[((-coef[1]*mi - intercept)/coef[0]), mi],[((-coef[1]*ma - intercept)/coef[0]), ma]])
    plt.plot(points[:,0], points[:,1])



def svm_margin(c):
    ratios = [(100,2), (100, 20), (100, 40), (100, 80)]
    plt.figure(figsize=(20,5))
    for j,i in enumerate(ratios):
        plt.subplot(1, 4, j+1)
        X_p=np.random.normal(0,0.05,size=(i[0],2))
        X_n=np.random.normal(0.13,0.02,size=(i[1],2))
       
        y_p=np.array([1]*i[0]).reshape(-1,1)
        y_n=np.array([0]*i[1]).reshape(-1,1)
        
        X=np.vstack((X_p,X_n))
        y=np.vstack((y_p,y_n))
        
        plt.scatter(X_p[:,0],X_p[:,1],color='yellow')
        plt.scatter(X_n[:,0],X_n[:,1],color='red')
    
        ###SVM
        clf = SVC(kernel='linear',C=c)
        clf.fit(X,y)
        coefficient = clf.coef_[0]
        intercept = clf.intercept_
        margin = 1 / (np.sqrt(np.sum(clf.coef_ ** 2)))
        draw_line(coefficient,intercept,min(X[:,1]),max(X[:,1]))
        ### Intercept for parallel hyper place is (intercept +/- 1)
        draw_line(coefficient,intercept - margin * np.sqrt(np.sum(clf.coef_ ** 2)) ,min(X[:,1]),max(X[:,1]))
        draw_line(coefficient,intercept + margin * np.sqrt(np.sum(clf.coef_ ** 2)) ,min(X[:,1]),max(X[:,1]))
        ###https://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html
        plt.scatter(X[clf.support_][:,0],X[clf.support_][:,1],facecolors='none',edgecolors='k')
    plt.suptitle('SVM Margin Hyperplane For C = ' + str(c))
    plt.show()
    
svm_margin(0.001)
svm_margin(1)
svm_margin(100)

Попробуйте расширить это до трехмерной системы. Вывод, созданный приведенным выше кодом для справки:

введите здесь описание изображения

person Chandan Malla    schedule 20.01.2021