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
4444
Aeroport
CapBlood в сообщении #1453724 писал(а):
смещение

Вот так

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


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

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


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

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

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


12/07/15
3363
г. Чехов
В регрессии у вас действительно трехмерное пространство $(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
4444
Aeroport
Mihaylo в сообщении #1453997 писал(а):
Разделяющая гиперплоскость строится в случае классификации, а не в случае регрессии.


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

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


12/07/15
3363
г. Чехов
Попробуйте найти прямую - пересечение разделяющей плоскости $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
3363
г. Чехов
Алгоритму SGD без разницы, минус или плюс. Главное, чтобы было что-то одно. Плюс как-то логичнее для уравнения гиперплоскости, мне так привычнее. Кому-то важно подчеркнуть, что смещение - это как бы порог, тогда удобнее минус. Но этот минус и в голове можно удерживать.

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


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

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

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



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

Сейчас этот форум просматривают: Rasool


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

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