CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
👨‍💻 У нас есть матрица признаков X размера (n, d) и целевой вектор y размера (n, 1).
Какой матричной формулой находятся оптимальные веса w в задаче линейной регрессии? 📱
Anonymous Quiz
8%
w = X^(-1) * y
17%
w = X.T * y
67%
w = (X.T @ X)^(-1) @ X.T @ y
8%
w = X @ X.T @ y
1111
👨‍💻 Итак, всем супер привет, новое задание от Тайлера Дердена:

📈 На рисунке в комментах представлена разделяющая линия в пространстве двух признаков x₁ x₂. ⚙️ Точками отмечены координаты, через которые проходит линия. Размер клеток по каждой из координат равен 1. Нам нужно (АНАЛИТИЧЕСКИ) вручную вычислить по графику вектор параметров, ...

🟰 w = [w₁, w₂, w₃]ᵀ 🟰

... которым описывается изображенная разделяющая линия в соответствии с выражением:

🟰 w₁ * x₁ + w₂ * x₂ + w₀ = 0 🟰

🧠 Вооот, а нам нужно накодить такую штуку, которая будет выводить значение вектора w в виде списка или кортежа:

0⃣📇 Первое, что вы должны сделать, это залезть в комменты этого поста. Дальше вы увидите график, в котором нужно определить координаты точек:

x1, y1 = -3, 1
x2, y2 = 3, 5


1⃣ Кайф, точки определили, теперь решим задание, но для начала, попробуем без кода:

⚙️ Формулу вы уже и сами знаете: 🟰 y = kx + b 🟰

‼️ Теперь важно, потому что дальше вы можете подумать, как будете выполнять данное задание, решение будет позже:

📊 Чтобы понять, как изменяется y в зависимости от x, нам нужно НАЙТИ угловой коэффициент:

🟰 k = (y₂ - y₁) / (x₂ - x₁) 🟰

Пока что вам задание подставить значения и получить готовое уравнение прямой:
Please open Telegram to view this post
VIEW IN TELEGRAM
3221
🧑‍💻🧑‍💻 Йоу, завтра постараюсь сделать пост, так что ждите
Please open Telegram to view this post
VIEW IN TELEGRAM
4441
👨‍💻 Йоу воссап друзья! Как и обещал, пишу — вот кстати прошлый пост (советую начать с него):

2⃣🧑‍💻 Я сказал вам в прошлом посте, чтобы вы нашли угловой коэффициент (чего вы конечно не сделали)

🟰 k = (y₂ - y₁) / (x₂ - x₁) 🟰— вот даже формула есть, поэтому дерзаем:

🟰 k = (5 - 1) / (3 - (-3)) = 4 / 6 = 2/3 🟰

3⃣⚙️ Теперь находим смещение b (всегда ориентируемся по этой формуле 🟰 y = kx + b 🟰)

Напомню, что в прошлый раз мы нашли точки:

🔵x1, y1 = -3, 1
🔵x2, y2 = 3, 5

Так вот, подставляем первую точку (-3, 1)

🟰 b = y - kx 🟰

🟰 b = 1 - (2/3) * (-3) = 1 + 2 = 3 🟰 — подставляем

🟰 y = (2/3) * x + 3 🟰— получаем такое уравнение прямой

🟰 y - (2/3) * x - 3 = 0 🟰 — домножим на 3, чтобы избавиться от дроби

🟰 3y - 2x - 9 = 0 🟰

🟰 -9 - 2x + 3y = 0 🟰

⚙️ w = [-9, -2, 3] — получаем такую штуку, она и будет ответом для нашей задачи. У меня есть еще пару вариантов решений, еще нужно будет код разобрать, а я пошел спать
Please open Telegram to view this post
VIEW IN TELEGRAM
5531
Какой из векторов весов НЕ соответствует уравнению прямой y = (2/3)x + 3?
Anonymous Quiz
44%
w = [1, 1, -1]
22%
w = [6, 4/3, -2]
22%
w = [3, 2/3, -1]
11%
w = [-9, -2, 3]
1111
Что будет после выполнения?

import numpy as np a = np.array([1, 2, 3]) b = a b[0] = 99
Anonymous Quiz
23%
a = [1, 2, 3]
69%
a = [99, 2, 3]
0%
a = [0, 2, 3]
8%
Ошибка, нельзя присваивать массивы напрямую
2221
👨‍💻 Сегодня постараюсь замутить пост
Please open Telegram to view this post
VIEW IN TELEGRAM
532
👨‍💻 🧑‍💻 Не так давно в этом посте мы начали рассматривать ГРАДИЕНТНЫЙ СПУСК. Вы уже заметили, что в последнее время градиентный спуск стал неотъемлемой темой в моих постах. 🤯 Тема очень важная и разбирать нам ее придется очень и очень долго... Ладно, не будем о плохом, держите очередную непонятную формулу (ее мы кстати уже рассмотрели в этом посте):

0⃣🟰 θ = θ − 𝜂 ⋅ ∇ J (θ)🟰

🧑‍💻 𝜃 — параметры модели (веса)

🧑‍💻 𝜂 — learning rate (шаг обучения)

🧑‍💻 J(θ) — функция потерь

🧑‍💻∇₀J(θ) — градиент этой функции по параметрам

👨‍💻 Так вот, все, что мы рассмотрели — это был градиентный спуск (Batch). Что за batch? Это один из видов градиентного спуска, можно сказать, что он базовый.

1⃣ Теперь переходим к SGD:

🔤🔤🔤

🔤🌷🔤🔤🔤🔤🔤🌷🔤🔤

🔤🌹🔤🔤🔤🔤🔤🌷

🔤🔤🔤🔤🔤🔤🌷

⚙️ На каждой итерации берёт один случайный пример из датасета и делает шаг в направлении уменьшения ошибки.


🟰θ = θ − 𝜂 ⋅ ∇₀ J (θ; xᵢ ; y ᵢ)🟰

🧑‍💻 𝜃 — параметры модели (веса)

🧑‍💻 𝜂 — learning rate (шаг обучения)

🧑‍💻x ; yᵢ — случайная обучающая пара

🧑‍💻 J(θ; ᵢ ; yᵢ) — функция потерь на этой паре

🟰 L(w, b) = 1/2 * (y - (wx + b))² 🟰

Дальше будем считать градиенты, а пока спать
💤😴
Please open Telegram to view this post
VIEW IN TELEGRAM
2221
🙏
Please open Telegram to view this post
VIEW IN TELEGRAM
6321
🧑‍💻 Сегодня пост постараюсь замутить крутецкий, желания ваши, кстати, можете писать в комментариях, вполне возможно, что они учтутся
Please open Telegram to view this post
VIEW IN TELEGRAM
4221
👨‍💻⚙️ Вот такую красоту сделал мой хороший друг, в будущем можно будет намутить NFC брелки для быстрого доступа в канал

🔗 Вот его канал 🔗

🔤🔤🔤🔤🪷🔤🔤 🔤🪷

3️⃣🔤 🪷🔤🔤🔤🔤
Please open Telegram to view this post
VIEW IN TELEGRAM
5221
👨‍💻⚙️ Так, снова пост, вот здесь мы разобрали задание с курса, но я хотел бы неплохо так дополнить:

0⃣‼️ У нас есть прямая, ее вы видите на фотке, она проходит через две точки в пространстве признаков x₁ и x₂. Нам надо найти такой вектор весов 🟰w = [w₀, w₁, w₂]🟰, чтобы уравнение: 🟰w₁ * x₁ + w₂ * x₂ + w₀ = 0 🟰 описывало нашу прямую на картинке.

1⃣📇 Напоминаю про точки:

🔵x1, y1 = (-3, 1)
🔵x2, y2 = (3, 5)

2⃣Что означают эти w вообще

w
— вес признака x₁

w — вес признака x₂

w₀ — свободный член (смещение, пересечение, как вам удобно)

🧑‍💻 И вместе они задают уравнение плоскости, а в нашем случае — просто прямую на плоскости: x₁, x₂. ‼️ Кстати, b мы итак можем определить чисто по графику, оно будет равно 3 (точка, где прямая пересекает ось)


3⃣ Теперь угловой коэффициент: Его мы нашли в прошлом посте, здесь лишь повторяем 🔜 k = 2/3

4⃣ Берем любую точку (берем x1, y1 = (-3, 1)) и подставляем в уравнение:

🟰 y = kx + b 🟰

🟰 b = y - kx 🟰

🟰 b = 1 - (2/3) * (-3) = 1 + 2 = 3 🟰

🟰 y = (2/3) * x + 3 🟰— получаем такое уравнение прямой

🟰 y - (2/3) * x - 3 = 0 🟰 — переносим в одну сторону

🟰w₁ * x₁ + w₂ * x₂ + w₀ = 0 🟰 — снова смотрим сюда и определяем наши веса; подводим все к одному виду Ax + By + C = 0

🌹🔤🔤🔤🪷🌷

w₁ = -3

w₂ = -2/3

w₀ = 1
Please open Telegram to view this post
VIEW IN TELEGRAM
3221
👨‍💻 Так, еще можно выложить кодик к этому заданию:

x1, y1 = -3, 1
x2, y2 = 3, 5

delta_x = x2 - x1
delta_y = y2 - y1

# Ax + By + C = 0
A = delta_y
B = -delta_x
C = delta_x * y1 - delta_y * x1

w = [C, A, B]


0⃣ Задаем две точки и находим разности координат:

🔵 delta_x = 6 (разница по x)

🔵 delta_y = 4 (разница по y)

x1, y1 = -3, 1
x2, y2 = 3, 5

delta_x = x2 - x1 # 6
delta_y = y2 - y1 # 4


1⃣ Формируем коэффициенты уравнения прямойЖ

# Ax + By + C = 0
A = delta_y # A = 4
B = -delta_x # B = -6
C = delta_x * y1 - delta_y * x1 #Будет равно 18


🧑‍💻 Теперь строим уравнение прямой в этом формате: 🟰Ax + By + C = 0🟰

2⃣ И выводим вектор параметров по ТЗ:

w = [C, A, B]


😐 Два главных вопроса:

Почему B = -delta_x (минус разность по x)

‼️ Итак, начинаем:

🟰 (y - y₁) / (y₂ - y₁) = (x - x₁) / (x₂ - x₁) 🟰 — у нас есть такая вот пропорция (просто привели наше уравнение к такому виду)

🟰(y - 1) / (5 -1) = (x - (-3)) / (3 - (-3))🟰— подставляем наши координаты точек

🟰(y - 1) / 4 = (x + 3) / 6🟰— упрощаем

🟰6 * (y - 1) = 4 (x + 3)🟰 — теперь избавляемся от дробей привычным
школьным образом

🟰6y - 6 = 4x + 12🟰— раскрываем скобки

🟰−4x + 6y − 6 − 12 = 0🟰— раскрываем скобки и сразу приводим к виду (Ax + By + C = 0)

🟰−4x + 6y − 18 = 0🟰 — упрощаем

‼️ B = -delta_x, потому что в случае переноса 🟰(x - x₁) / (x₂ - x₁)🟰 в левую сторону в этом выражении 🟰 (y - y₁) / (y₂ - y₁) = (x - x₁) / (x₂ - x₁) 🟰перед x будет знак —

Второй вопрос, почему A = delta_y, B = -delta_x, если A — это коэффициент перед x, B — коэффициент перед y

⚙️ Напоминаю, что мы можем перенести все слагаемые нашего изначального уравнения в одну сторону:

🟰 (y - y₁) / (y₂ - y₁) = (x - x₁) / (x₂ - x₁) 🟰 — было

🟰 y * (x₂ - x₁) - y₁ * (x₂ - x₁) = x * ((y₂ - y₁) - x₁ * (y₂ - y₁) 🟰 — просто раскрыли скобки

🟰 y * (x₂ - x₁) - y₁ * (x₂ - x₁) - x * ((y₂ - y₁) + x₁ * (y₂ - y₁) 🟰 перенесли в одну сторону (знаки изменились)

‼️САМОЕ ГЛАВНОЕ‼️

👨‍💻 Слагаемое с нашим игриком: 🟰 y * (x₂ - x₁)🟰Заметили? Эта темка в скобках и есть delta_x, а перед ней стоит коэффициент y

📊 Слагаемое с нашим иксом: -🟰 -x * (y₂ - y₁)🟰Все что в скобках — это delta_y, перед ним коэффициент x.
Please open Telegram to view this post
VIEW IN TELEGRAM
411
This media is not supported in your browser
VIEW IN TELEGRAM
332
👨‍💻 Устали? График уже висит в комментариях, начинаем новое задание:

0⃣📱` Нам нужно сделать абсолютно тоже самое, что и в прошлом задании, но точки другие, а повторить всегда можем.

1⃣🧑‍💻 Сразу выложу код, с ним проблем нет, ведь меня больше интересует решение без кода:

x1, y1 = -3, 5
x2, y2 = 7, 5

delta_x = x2 - x1
delta_y = y2 - y1

# Ax + By + C = 0
A = delta_y
B = -delta_x
C = delta_x * y1 - delta_y * x1

w = [C, A, B]
print(w)


2⃣ 🟰w₁ * x₁ + w₂ * x₂ + w₀ = 0 🟰— вот такое уравнение мы должны найти

3⃣ Точки и разности координат:

🔵x1, y1 = (-3, 5)

🔵x2, y2 = (7, 5)

🔵 delta_x = 10 (разница по x)

🔵 delta_y = 0 (разница по y)

4⃣:

🟰 (y - y₁) / (y₂ - y₁) = (x - x₁) / (x₂ - x₁) 🟰— общее уравнение прямой

🟰(y -5) * 10 = (x - (-3) * 0)🟰

🟰(y - 5) * 10 = 0🟰

🟰y - 5 = 0 или y = 5🟰

5⃣:

🟰 Ax + By + C = 0 🟰

🔵A — коэффициент перед x (он равен 0)

🔵B — коэффициент перед y (он у нас равен 1, ща увидите)

🔵C — свободный член (равен - 5, потому что перенесли влево)

6⃣ 🟰0 * x + 1 * y − 5 = 0🟰 — записываем в общем виде

7⃣ Выводим в том же формате:

🟰w = [w₀, w₁, w₂]🟰

🟰 w = [-5, 0, 1] 🟰— наш ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
3221
👨‍💻 Завтра у вашего любимого админа будет день рождения, поэтому самым лучшим подарком будут новые подписичники, которых вы сможете привести (ну или мак на чипе M4, выбирать вам)
Please open Telegram to view this post
VIEW IN TELEGRAM
1322
👨‍💻 Сегодня постараюсь замутить пост, будем разбирать новое задание
Please open Telegram to view this post
VIEW IN TELEGRAM
3221
👨‍💻 Думали поста не будет? Я тоже так думал, но планы меняются, так что хотя бы начнем:

0⃣‼️ У нас двумерное пространство признаков x₁, x₂, воот, также тут изображены объекты двух разных классов:

🔵квадратами - объекты класса C₁ = +1

🔵ромбами - объекты класса C₂ = -1

🟢 Красная разделяющая линия проходит через синие точки. Размер клеток по каждой из координат равен 1 (график в комментах)

🟢 А найти нам нужно все также вектор параметров:

🟰w = [w₀, w₁, w₂]🟰

🟰w₁ * x₁ + w₂ * x₂ + w₀ = 0 🟰 — а вот наше уравнение

🟢 Также, мы имеем объекты для тестовой выборки:

x_test = [(5, -3), (-3, 8), (3, 6), (0, 0), (5, 3), (-3, -1), (-3, 3)]


🟢 Еще нам нужно вычислить метку класса для каждого объекта по вот этой вот формуле:

🟰 a(x) = sign(wᵀ * x) 🟰

... где x = [1, x₁, x₂]
— вектор признаков (координат) объекта выборки, дополненный первой единицей для параметра w₀.

1⃣ Итак, начнем. Находим точки:

🔵p₁ = (−5,6)

🔵p₂ = (8,−3)

2⃣ Дальше находим k (наш наклон). Я как-то расписывал уж эту формулу — вот здесь

🟰 k = (y₂ - y₁) / (x₂ - x₁) 🟰➡️За вас посчитал, получаем -9/13

Скоро продолжим 💤
Please open Telegram to view this post
VIEW IN TELEGRAM
4322
Soon 👨‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👨‍💻Всем привет, продолжаем прошлый пост:

3⃣ Дальше нужно найти b (у нас уже найден k):

🟰 y = kx + b 🟰

🟰 b = y - kx 🟰

🟰 b = 6 - (-9/13 * (-5) = 6 - 45/13 = (78-45)/13 = 33/13 🟰 — берем любую точку и подставляем координаты, мы взяли точку (-5, 6)

🟰 y = 33/13 - 9/13*x 🟰 — получаем уравнение и умножаем | * 13

🟰 w = [-33, 9, 13] 🟰— отсюда получаем коэффициенты

4⃣ Вектор весов:

w = np.array([-33, 9, 13]) # [свободный член, вес при x1, вес при x2]


5⃣ Далее функция. тут надо внимательно: она считает точку с помощью формулы и относит к классу -1 ромбов (если результат < 0) или к квадратам +1 (если результат >= 0)

a_sign = lambda x, w: -1 if np.dot(x, w) < 0 else 1


6⃣ Добавим единицу к каждой точке из 🟰x_test🟰

x_test_new = np.array([[1, x1, x2] for x1, x2 in x_test])


🔵Поскольку у нас есть w₀, нам нужна была единица, например:

🔵Было (5, -3) ➡️ стало (1, 5, -3)

7⃣ Теперь для каждый точки (у них уже стоит единица, если что) применяем функцию 🟰a_sign🟰 и по итогу получаем список предсказаний (у нас может быть либо -1, либо 1), то есть, на выходе получаем список предсказаний 🟰 [-1, 1, 1, -1, 1, -1, -1]🟰

predict = [a_sign(x, w) for x in x_test_new]


💤 Подумаю, как можно усовершенствовать код с помощью библиотек, всем пака
Please open Telegram to view this post
VIEW IN TELEGRAM
321