Методы опорных векторов в R: Поиск уравнения гиперплоскости (в 6 измерениях) и демонстрация его корректности

Вопрос или проблема

lin.6d<-read.csv("D:/Documents/Linear-6d.csv", header=TRUE)

View(lin.6d)

plot(lin.6d,col = ifelse(lin.6d$Class == 1, "red","blue")) 

library(e1071) # Пакет для поддержки векторных машин

svm.lin.6d <- svm(Class ~ ., data = lin.6d, type = "C-classification", kernel = "linear", cost = 10, scale = FALSE)
print(svm.lin.6d)

tuned <- tune(svm, Class ~., data = lin.6d, kernel = "linear", ranges = list(cost=c(0.001,0.01,.1,1,10,100))) # Покажет оптимальный параметр стоимости
summary(tuned) # Оптимальный параметр стоимости равен 10

# Найдите параметры гиперплоскости (wx+c=0)
w <- t(svm.lin.6d$coefs) %*% svm.lin.6d$SV # По сути, это находит гиперплоскость, которая отделяет наши точки
c <- -svm.lin.6d$rho

Вышеуказанный код берет данные из excel файла “lin.6d”, который содержит векторные точки “X1,X2,X3,X4,X5,X6” и “Class:-1,1”. Таким образом, каждая векторная точка имеет класс 1 или -1.

Я построил график данных и раскрасил каждую точку в зависимости от ее класса (синий, если класс точки -1, красный в противном случае).

Затем я использовал функцию svm для получения коэффициентов гиперплоскости, где:
w – это набор коэффициентов (W1,W2,…,W6), а c – это пересечение.

Таким образом, я получил ответ:
w=(0.02433109, 0.02803587, -0.02332039, -0.000118514, -0.009224677, -0.02626795)
c= 0.1712391

где wx+c=0 – это уравнение гиперплоскости, отделяющей классы точек.

Мой вопрос:
Как я могу знать, является ли это правильным ответом? Как мне создать визуальный график, чтобы показать, что это можно представить в виде линии, отделяющей классы?

Я усложнил ответ, который искал. Если у вас есть уравнение гиперплоскости, вы можете протестировать его на каждой точке в наборе данных. Если все точки класса 1 находятся ВСЕ (выше или ниже) пересечения, и обратное справедливо для всех точек класса -1, тогда гиперплоскость отделяет два класса.

Ответ или решение

Поддерживающие векторы (SVM) представляют собой мощный инструмент в области машинного обучения, особенно для задач классификации. На основе ваших данных и описания задачи, давайте подробно разберем, как найти уравнение гиперплоскости и проверить его корректность в контексте данных с шестими измерениями.

Шаг 1: Установка и подготовка данных

Вы уже загрузили данные из CSV файла Linear-6d.csv и визуализировали их. Код для загрузки и отображения данных выглядит следующим образом:

lin.6d <- read.csv("D:/Documents/Linear-6d.csv", header = TRUE)
plot(lin.6d, col = ifelse(lin.6d$Class == 1, "red", "blue"))

Это позволяет вам понять распределение классов (классы -1 и 1), где красный цвет соответствует классу 1, а синий – классу -1.

Шаг 2: Обучение модели SVM

Вы создали модель SVM с линейным ядром:

library(e1071)

svm.lin.6d <- svm(Class ~ ., data = lin.6d, type = "C-classification", kernel = "linear", cost = 10, scale = FALSE)
print(svm.lin.6d)

Здесь вы указали, что используете линейное ядро и задали значение параметра cost, равное 10, что позволяет минимизировать ошибки при классификации.

Шаг 3: Получение параметров гиперплоскости

Согласно вашему коду, вы правильно вычислили параметры гиперплоскости (вектор весов w и смещение c):

w <- t(svm.lin.6d$coefs) %*% svm.lin.6d$SV
c <- -svm.lin.6d$rho

Полученные значения:

  • w = (0.02433109, 0.02803587, -0.02332039, -0.000118514, -0.009224677, -0.02626795)
  • c = 0.1712391

Гиперплоскость в 6 измерениях определяется уравнением:

[
wx + c = 0
]

Шаг 4: Проверка корректности гиперплоскости

Чтобы убедиться, что гиперплоскость корректно разделяет классы, вы можете выполнить следующие действия:

  1. Подсчет значений гиперплоскости: Вычислите значение гиперплоскости для каждой точки данных:

    lin.6d$decision_value <- as.matrix(lin.6d[, 1:6]) %*% w + c
  2. Классификация: Все точки класса 1 должны иметь положительные значения, а все точки класса -1 — отрицательные.

    lin.6d$predicted_class <- ifelse(lin.6d$decision_value > 0, 1, -1)
  3. Проверка правильности классификации:

    table(lin.6d$Class, lin.6d$predicted_class)

Если все значения будут классифицированы правильно, это означает, что гиперплоскость корректно разделяет классы.

Шаг 5: Визуализация гиперплоскости

Визуализировать гиперплоскость в 6 измерениях напрямую невозможно, однако можно проанализировать проекции на двумерные пространства для визуализации. Например, можно построить графики для пар измерений (X1, X2), (X3, X4) и т.д.

library(ggplot2)

ggplot(lin.6d, aes(x = X1, y = X2, color = factor(Class))) +
  geom_point() +
  geom_abline(intercept = -c/w[2], slope = -w[1]/w[2], color = "black") +
  theme_minimal()

Этот код создает простой график, где можно увидеть, как гиперплоскость (линия в данной проекции) разделяет классы.

Заключение

Таким образом, вы можете подтвердить, что уравнение гиперплоскости корректно разделяет классы, проверив предсказания и проанализировав графики. Это поможет вам визуализировать результат вашей модели и убедиться в её корректности.

Оцените материал
Добавить комментарий

Капча загружается...