Wednesday, June 22, 2022

Hyperplanes and Support Vectors (SVM)

Гиперплоскости и опорные векторы (SVM)

Гиперплоскости — это границы решений, которые помогают классифицировать точки данных. Точки данных, попадающие по обе стороны от гиперплоскости, можно отнести к разным классам. Кроме того, размер гиперплоскости зависит от количества функций. Если количество входных объектов равно 2, то гиперплоскость — это просто линия. Если число входных признаков равно 3, то гиперплоскость становится двумерной плоскостью. Трудно представить, когда количество признаков превышает 3.











Опорные векторы — это точки данных, расположенные ближе к гиперплоскости и влияющие на положение и ориентацию гиперплоскости. Используя эти опорные векторы, мы максимизируем запас классификатора. Удаление опорных векторов изменит положение гиперплоскости. Это точки, которые помогают построить SVM модель.

В логистической регрессии мы берем выходные данные линейной функции и сжимаем значение в диапазоне [0,1], используя сигмовидную функцию. Если сжатое значение больше порогового значения (0,5), мы присваиваем ему метку 1, иначе мы присваиваем ему метку 0. В SVM мы берем выход линейной функции, и если этот результат больше 1, мы идентифицируем это с одним классом, и если вывод равен -1, мы идентифицируем его с другим классом. Поскольку пороговые значения изменены на 1 и -1 в SVM, мы получаем этот диапазон значений усиления ([-1,1]), который действует как запас.

SVM: машина опорных векторов — это линейная модель для задач классификации и регрессии. Он может решать линейные и нелинейные задачи и хорошо работает для многих практических задач. Идея SVM проста. Алгоритм создает линию или гиперплоскость, которая разделяет данные на классы. Цель SVM — создать максимальное предельное расстояние для построения обобщенной модели.


(.env) [boris@fedora34server PLOTTING]$ cat plottingLinearSVC.py

"""

Линейные модели LinearSVC() и SVC(kernel='linear') немного уступают различные границы решения. Это может быть следствием следующих . Отличия:

- LinearSVC минимизирует квадратичные потери шарнира, в то время как ``SVC`` минимизирует

   регулярная потеря петли.

- LinearSVC использует мультикласс One-vs-All (также известный как One-vs-Rest).

   сокращение, в то время как ``SVC`` использует многоклассовое сокращение One-vs-One.

Обе линейные модели имеют линейные границы решений (пересекающиеся гиперплоскости).

в то время как нелинейные модели ядра (полиномиальные или гауссовские RBF) имеют больше

гибкие нелинейные границы решений с формами, которые зависят от вида ядро и его параметры.

"""

import matplotlib.pyplot as plt

from sklearn import svm, datasets

from sklearn.inspection import DecisionBoundaryDisplay

# import some data to play with

iris = datasets.load_iris()

# Take the first two features. We could avoid this by using a two-dim dataset

X = iris.data[:, :2]

y = iris.target

# we create an instance of SVM and fit out data. 

# We do not scale our data since we want to plot the support vectors

C = 1.0  # SVM regularization parameter

models = (

    svm.SVC(kernel="linear", C=C),

    svm.LinearSVC(C=C, max_iter=10000),

)

models = (clf.fit(X, y) for clf in models)

# title for the plots

titles = (

    "SVC with linear kernel",

    "LinearSVC (linear kernel)",

)

# Set-up 2x1 grid for plotting.

fig, sub = plt.subplots(2, 1)

plt.subplots_adjust(wspace=0.4, hspace=0.4)

X0, X1 = X[:, 0], X[:, 1]

for clf, title, ax in zip(models, titles, sub.flatten()):

    disp = DecisionBoundaryDisplay.from_estimator(

        clf,

        X,

        response_method="predict",

        cmap=plt.cm.coolwarm,

        alpha=0.8,

        ax=ax,

        xlabel=iris.feature_names[0],

        ylabel=iris.feature_names[1],

    )

    ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors="k")

    ax.set_xticks(())

    ax.set_yticks(())

    ax.set_title(title)

plt.show()





































(.env) [boris@fedora34server PLOTTING]$ cat supportVectors.py
import numpy as np
import seaborn as sns
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")

iris = sns.load_dataset("iris")
print(iris.head())
y = iris.species
X = iris.drop('species',axis=1)
sns.pairplot(iris, hue="species",palette="bright")

df=iris[(iris['species']!='virginica')]
df=df.drop(['sepal_length','sepal_width'], axis=1)
df.head()
df=df.replace('setosa', 0)
df=df.replace('versicolor', 1)
X=df.iloc[:,0:2]
y=df['species']
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, s=50, cmap='autumn')

model = SVC(kernel='linear')
model.fit(X, y)

plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, s=50, cmap='autumn')
plt.scatter(model.support_vectors_[:,0],model.support_vectors_[:,1])
plt.show()
ax = plt.gca()
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, s=50, cmap='autumn')
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 = model.decision_function(xy).reshape(XX.shape)

ax.contour(XX, YY, Z, colors='blue', levels=[-1, 0, 1], alpha=0.5,
           linestyles=['solid', '-', 'solid'])
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100,
           linewidth=1, facecolors='none', edgecolors='k')
plt.show()























No comments:

Post a Comment