2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Визуализация линейного классификатора
Сообщение12.04.2020, 01:39 


12/04/20
6
Доброй ночи. Обучил линейный классификатор с помощью sklearn в Python. И захотелось визуализировать полученную гиперплоскость.

Вот код:
Используется синтаксис Python
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])

model = SGDClassifier(verbose=True)
model.fit(X, y)

w = model.coef_[0]
b = model.intercept_[0]
 


Соответственно, я получил веса и смещение. С помощью весов (нормаль) можно получить угол нашей прямой, которая выступает в данном случае разделяющей гиперплоскостью. Однако такая прямая будет находиться в начале координат (так как нет свободного члена). Вопрос. Как мне найти данный член и соответственно визуализировать гиперплоскость?

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение12.04.2020, 04:02 


10/03/16
2098
Aeroport
CapBlood в сообщении #1453724 писал(а):
смещение

Вот так

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение12.04.2020, 06:05 


12/04/20
6
ozheredov
Как так? То смещение, которое получено путём оптимизации не подходит для визуализации.

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение12.04.2020, 11:29 


10/03/16
2098
Aeroport
У регрессии на $m$ параметров получается $m+1$ коэффициент. Первые $m$ это ориентация нормали гиперплоскости, последний -- смещение (вдоль этой самой нормали). Что я сказал не так?

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение12.04.2020, 18:21 


12/04/20
6
ozheredov
всё так. Хотя мне казалось, что смещение не вдоль нормали, а вдоль оси значений. Вот параметры:
$\\
w = (19, 19)\\
b = -9\\
$
А у меня объекты находятся в единичном квадрате у начала координат (X в коде). Сомневаюсь, что нарисованная гиперплоскость с таким смещением будет разделять визуально эти объекты. Может быть тут надо вспомнить что-то из аналитической геометрии или как-то масштабировать? Мне на ум больше ничего не приходит. Очень надеюсь на помощь...

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение13.04.2020, 01:20 


10/03/16
2098
Aeroport
CapBlood в сообщении #1453867 писал(а):
Может быть тут надо вспомнить что-то из аналитической геометрии или как-то масштабировать?

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

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение13.04.2020, 03:48 


12/07/15
1737
В регрессии у вас действительно трехмерное пространство $(x_1, x_2, y)$, поэтому три коэффициента. Вы получаете аппроксимирующую плоскость, а не разделяющую.

Разделяющая гиперплоскость строится в случае классификации, а не в случае регрессии. Возьмите логистическую регрессию вместо линейной.

В случае классификации размерность $y$ исчезает, заменяется на два цвета точки (синий, красный). Например, 0 - синий, 1 - красный, 0.5 - граница.

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение13.04.2020, 09:31 


12/04/20
6
ozheredov
ошибки нет, 100% правильных ответов.

Mihaylo
я говорил о классификации, а не о регрессии, да, я понимаю, как работает классификация и что такое объекты и метки. Вопрос в том, как визуализировать результаты обучения классификатора.

-- 13.04.2020, 09:40 --

ozheredov
и нет, это неправильно, веса вместе с признаками составляют линейную комбинацию, это "перемещает" объекты в пространстве, скажем так, соответственно, и сама разделяющая плоскость находится в другом месте. Такие проблемы, насколько мне известно, и решает регуляризация, так как при обучении выбрался не "истинный" вариант весов/смещения.

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение13.04.2020, 17:04 


10/03/16
2098
Aeroport
Mihaylo в сообщении #1453997 писал(а):
Разделяющая гиперплоскость строится в случае классификации, а не в случае регрессии.


Ой да, чет меня с терминологией совсем переглючило )))

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение13.04.2020, 18:37 


12/07/15
1737
Попробуйте найти прямую - пересечение разделяющей плоскости $y = w_1 x_1 + w_2 x_2 + b$ с плоскостью $y = 0,5$, которая соответствует границе между ответами $y = 0$ и $y = 1$. Наверняка логистическая регрессия использована в модели sgdclassifier(). :-)

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение14.04.2020, 02:09 


12/04/20
6
Mihaylo
спасибо, нашел, вот, что получилось:
$
w_1x_1 + w_2x_2 + b = 0.5
$
$
x_2 = \frac{0.5 - w_1x_1 - b}{w_2}
$
Я сегодня об этом думал, но забыл, что там не ступенька (sign), а что-то другое. Начал визуализировать прямую - пересечение с плоскостью $y = 0$, а она работала через раз (иногда перекрывала объекты), теперь ясно почему.
Может, кого-то это ещё заинтересует, поэтому оставлю код и скрины.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
from matplotlib import pyplot as plt
import numpy as np
from sklearn.linear_model import SGDClassifier


def lin_log(w, b):
    def func(x):
        return (0.5 - w[0] * x - b) / w[1]
    return func


X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])

model = SGDClassifier()
model.fit(X, y)

w = model.coef_[0]
b = model.intercept_[0]

x_min, x_max = -2, 2
y_min, y_max = -2, 2

fig, ax = plt.subplots()
linear = lin_log(w, b)
grid_x = np.linspace(-3, 3, 200)
grid_y = linear(grid_x)

ax.plot(grid_x, grid_y)
ax.scatter(X[:, 0], X[:, 1])
ax.grid(which='major',
        color='k')
ax.axis([x_min, x_max, y_min, y_max])
plt.show()
 


Изображение

-- 14.04.2020, 02:19 --

Mihaylo
только сейчас обратил внимание, везде пишут по-разному, то $+b$, то $-b$. Я, наверное, что-то не понимаю, но это несколько разные вещи, нет? То есть смещения получаются одинаковые в обоих случаях, но разные по знаку, разве нет?

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение14.04.2020, 21:24 


12/07/15
1737
Алгоритму SGD без разницы, минус или плюс. Главное, чтобы было что-то одно. Плюс как-то логичнее для уравнения гиперплоскости, мне так привычнее. Кому-то важно подчеркнуть, что смещение - это как бы порог, тогда удобнее минус. Но этот минус и в голове можно удерживать.

 Профиль  
                  
 
 Re: Визуализация линейного классификатора
Сообщение14.04.2020, 21:52 


12/04/20
6
Mihaylo
SGD? Это стохастический градиентный спуск? Да, я не спорю, ему всё равно. Это же оптимизация. Я имею в виду, что уравнение, которое у меня прописано в коде, и уравнение, которое внутри классификатора должны быть согласованы по знаку у смещения, иначе неправильно рисуется.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group