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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
👨‍💻 Всем ку! Сегодня пишем продолжение этого поста. В прошлый раз, напомню вам, мы разобрали задание буквально на атомы (со стороны математики), теперь мы разберем 🧑‍💻 код...(нам нужно если че вычислить коэффициенты w модели: a(x,w)

0⃣🧠 Так ну первые строчки расписывать смысла мало, импортируем 📱нампай, устанавливаем random.seed (чтобы при каждом выполнении, результаты не менялись) и создаем массив от -1 до 1с шагом 0.1:

import numpy as np

np.random.seed(0) # Здесьможем ставить любое число в скобки

x = np.arange(-1.0, 1.0, 0.1) # будет вот так - [-1. , -0.9, -0.8, ..., 0.8, 0.9]


1⃣📊 Теперь генерируем y_true (это наши придуманные настоящие значения):

Y = -5.2 + 0.7 * x + np.random.normal(0, 0.1, len(x))

# w0 = -5.2 — сдвиг

# w1 = 0.7 — коэффициент наклона

# np.random.normal(0, 0.1, len(x)) — случайный шум с нормальным распределением (среднее 0, стандартное отклонение 0.1)


2⃣‼️ Теперь важно: у нас есть Y, являющийся одномерным вектором (такая вот у него структура - (20,)), поэтому превращаем его в вектор-столбец формы (20, 1). А делаем мы так, потому что нам нужно будет использовать матричное умножение (попозже будет пример и поймете).

3⃣📊 Строим матрицу признаков:

X = np.column_stack((np.ones(len(x)), x))


⚙️ Теперь она будет выглядеть так:

X =
[[ 1. -1. ]
[ 1. -0.9]
..............
[ 1. 0.9]]


4⃣🛍 Остается лишь найти вес w и задача готова:

w = np.linalg.inv(X.T @ X) @ X.T @ Y



‼️ Теперь ооочень важно, самое важное ‼️

👨‍💻 Объясню как можно проще: у нас был X и Y, выглядят они в начале вот так:

x = [-1.  -0.9 -0.8 ... 0.9]    # (20,)

Y = [-5.14 -5.05 -4.79 ... -4.58] # (20,)


🔵 То есть структура у них следующая:

x.shape == (20,)
Y.shape == (20,)


🔵 Затем, делаем из Y вектор-столбец:

Y = Y.reshape(-1, 1)  # (20, 1)


🔵 Что касаемо X, мы создаем его со свободным членом (это который b). А вот и та самая строка:

X = np.column_stack((np.ones(len(x)), x))  # (20, 2)


🔵 И вот так будут выглядеть наши данные:

X =
[[ 1. -1. ]
[ 1. -0.9]
...
[ 1. 0.9]]


🔵 Теперь наша моделька должна найти w0, и w1, то есть w = [w0, w1], тут нужно поподробнее:

w = np.linalg.inv(X.T @ X) @ X.T @ Y


🟰 L(w) = |Y - X @ w|² 🟰 — мы минимизируем функцию суммы квадратов ошибки, берем производную по w и как результат получаем:

🟰 w = (Xᵀ @ X)⁻ ¹ @ Xᵀ @ Y 🟰— подробнее мы рассмотрели в прошлом посте

🌹🔤🔤🔤🪷🌷

5⃣‼️ Подводим итог:

Y (20,) был одномерный, применили reshape и сделали его вектор-столбцом (20, 1) чтобы работать с умножением. Также и x был (20,), а стал матрицей X с двумя столбцами (20, 2). ЕДИНИЧКИ мы добавили. потому что в Y у нас прописано -5.2 (это наш свободный член), вот его мы и учитываем (поэтому добавляем столбец единиц).

⚙️ Затем мы решили вот это уравнение 🟰 w = (X.T @ X)^(-1) @ X.T @ Y 🟰и получили:


w = [[w0],
[w1]]


X.shape = (20, 2)

Y.shape = (20, 1)

w.shape = (2, 1)

X @ w = (20, 1) — наши предсказания!
Please open Telegram to view this post
VIEW IN TELEGRAM
4322
👨‍💻 Друзья, каналу ровно ГОД! Всех Вас я поздравляю, мы двигались и будем двигаться дальше

🌸🔤🌹🔤 🌸🔤🌹🔤 🌸🔤🌹🔤 🌸🔤🌹🔤
Please open Telegram to view this post
VIEW IN TELEGRAM
8432
👨‍💻 Друзья, пока что готовлю пост, выйдет в скором времени!
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👨‍💻 У нас есть матрица признаков 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