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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
ВЕРНУТЬСЯ К НАВИГАЦИИ

4️⃣ Frobenius-норма (ord='fro', по умолчанию для матриц)


🧑‍💻 Frobenius-норма используется для матриц и вычисляется как корень из суммы квадратов всех элементов матрицы. Она является обобщением Евклидовой нормы для векторов. (Опять же, формулу можете почекать на главной картинке)

⚙️ Итак, поговорим немного о формуле:

A — матрица,

aᵢⱼ — элемент матрицы A в строке i и столбце j
.

▫️Теперь пример:


🔗 Возьмем матрицу с этого примера → матрица A = [1 -2] — верхняя строка и нижняя строка [3 -4] → дальше вычисляем квадраты всех элементов матрицы и складываем → получаем 30 → корень из 30 приблизительно 5.477

▫️Код:

import numpy as np 

a = np.array([[1, -2], [3, -4]])
fnorm = np.linalg.norm(a, ord = 'fro')
print(fnorm)


Если не указывать ord для матрицы, Frobenius-норма используется по умолчанию.


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤‍🔥1🤯1🤓1
Media is too big
VIEW IN TELEGRAM
ВЕРНУТЬСЯ К НАВИГАЦИИ

🧑‍💻1️⃣ Скалярное произведение векторов

Скалярное произведение двух векторов a и b — это сумма произведений их соответствующих компонентов


🔗 a⋅b=∣a∣∣b∣cos(θ)

🔗 ∣a∣ и ∣b∣ — длины векторов, θ — угол между ними


Если угол равен 90°, то скалярное произведение равно 0, так как cos(90°) = 0


Теперь напишем пример на Python:

import numpy as np
a = ([1, 2, 3])
b = ([4, 5, 6])

dot_product = np.dot(a, b)
print(dot_product)


Dot Product — это операция между двумя векторами, которая возвращает одно число (скаляр). Она вычисляется как сумма произведений соответствующих компонент векторов.


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥21🤯1
ВЕРНУТЬСЯ К НАВИГАЦИИ

2️⃣🔗 Что касаемо векторного произведения?

a × b = i ⋅ (a 2​b 3​−a 3​b 2​) − j ⋅ (a 1​b 3​−a 3​b 1​) + k ⋅ (a 1​b 2​−a 2​b 1​)

import numpy as np 

a = ([1, 2, 3])
b = ([4, 5, 6])
cross_product = np.cross(a, b)
print(cross_product)


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥11🥰1
ВЕРНУТЬСЯ К НАВИГАЦИИ

Строим график синусоиды


0️⃣ Импортируем две базовые библиотеки:

import matplotlib.pyplot as plt
import numpy as np


1️⃣ Создание фигуры (с помощью Figure)


fig = plt.figure(figsize=(5, 4))


🔗 Итак, 🟰plt.figure🟰 создаёт новый объект, на которой будут отображаться графики. А что касаемо параметров (5, 4) ? Параметры отвечают за размер фигуры:

первая цифра (5) — это ширина фигуры
вторая цифра (4) — это высота фигуры


Итак, создаётся фигура размером 5x4 дюйма


2️⃣ Добавляем оси

ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])


▫️Этот метод добавляет оси на заданную фигур.

▫️[0.1, 0.1, 0.8, 0.8] — Список, который задаёт положение и размер области для осей внутри фигуры в виде четырёх чисел и вот как это выглядит:

0.1 — отступ от левой границы фигуры.
0.1 — отступ от нижней границы фигуры.
0.8 — ширина осей относительно ширины фигуры.
0.8 — высота осей относительно высоты фигуры.


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2🥰1🤓1
ВЕРНУТЬСЯ К НАВИГАЦИИ

Это для понимания того, как работают параметры в этой строке:


ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])


🔽🔽🔽

fig = plt.figure(figsize=(8, 8))

# График 1: минимальные отступы (основной размер)
ax1 = fig.add_axes([0.0, 0.0, 0.8, 0.8]) # График занимает большую часть фигуры, отступов нет
ax1.set_title('Отступы: [0.0, 0.0, 0.8, 0.8]')

# График 2: отступы увеличены
ax2 = fig.add_axes([0.3, 0.3, 0.5, 0.5]) # График с увеличенными отступами
ax2.set_title('Отступы: [1.3, 1.3, 0.5, 0.5]')

plt.show()


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤‍🔥1👍1🤯1
ВЕРНУТЬСЯ К НАВИГАЦИИ

3️⃣ А что дальше? Дальше мы создаем массив значений x от 0 до 2π с шагом 0.01.

xx = np.arange(0, 2 * np.pi, 0.01) #значения, по которым будут вычисляться точки на оси x


2π соответствует одному полному циклу синусоиды (360 градусов в радианах)


4️⃣ Дальше нам нужна строка, которая вычислит значения у для каждого x (естественно, применяем функцию sin(x), у нас синусоида, как никак 🙂)

yy = np.sin(xx)


▫️Функция np.sin в библиотеке NumPy позволяет вычислить синус для массива значений x, таких как np.arange(0, 2 * np.pi, 0.01)

▫️Она возвращает массив значений
y, который соответствует значениям синуса для каждого x


5️⃣ Строим график y=sin(x) (линию) с подписью label='y = sin(x)':

 ax.plot(xx, yy, label='y = sin(x)')


6️⃣

ax.set_title('График синусоиды') # заголовок графика
ax.set_xlabel('x (угол в радианах)') # подпись оси x
ax.set_ylabel('y (значение синуса)') # подпись оси y
ax.legend() # Отображает легенду, которая берет текст из label (пункт 5)
plt.show() # сам график


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥1👍1🤓1👨‍💻1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🧑‍💻 Весь код:


import matplotlib.pyplot as plt
import numpy as np


fig = plt.figure(figsize=(5, 4))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])


xx = np.arange(0, 2 * np.pi, 0.01) # От 0 до 2π с шагом 0.01
yy = np.sin(xx)


ax.plot(xx, yy, label='y = sin(x)')

ax.set_title('График синусоиды')
ax.set_xlabel('x (угол в радианах)')
ax.set_ylabel('y (значение синуса)')
ax.legend()

plt.show()


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2🤯1🤓1
Завтра выложу очень интересный пост, гайсы. Понимаю, что их сейчас нет, у меня сессия идет жесточайшая, но я надеюсь, что, вы, мои любимые подписичники, поймете меня 🧑‍💻 🙏
2🥰1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🧑‍💻 Всем добрый вечер! Надеюсь, вы хорошо проводите свое время, ведь сейчас будет пост, а значит, вы его проведете еще лучше...Итак, линейная регрессия

Допустим, есть у нас набор точек:

{x₁ = 50, y₁ = 10
{x₂ = 60, y₂ = 30
{x₃ = 70, y₃ = 40
{x₄ = 100, y₄ = 50


x — площадь дома, y — цена дома


Для начала, делаем визуал наших точек:

from matplotlib import pyplot as plt #Иморт библиотек

plt.scatter([50, 60, 70, 100], [10, 30, 40, 50], 50, 'g', 'o', alpha = 0.8) #В ппервых двух квадратных скобках это наши координаты x и y. Число 50 - это размер точек, g - green (цвет), o - Форма точек (круг). alpha = 0.8 - Прозрачность точек

plt.show()


Получившийся график в комментах ⬇️

ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤‍🔥1🥰1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🧑‍💻 Дальше выведем матрицу X (Единички для каждого объекта и 2 столбик это данные для обучения (площадь нашей хаты) )

import numpy as np

X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])

X


⚙️ Вывод:

array([[  1,  50],
[ 1, 60],
[ 1, 70],
[ 1, 100]])


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤‍🔥1🤯1
ВЕРНУТЬСЯ К НАВИГАЦИИ

⚙️ Теперь выведем матрицу для Y:

Вектор Y записывается в виде столбца


import numpy as np

Y = np.array([[10], [30], [40], [50]])

Y


⚙️ Вывод:

array([[  1,  50],
[ 1, 60],
[ 1, 70],
[ 1, 100]])


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥31🤓1
ВЕРНУТЬСЯ К НАВИГАЦИИ

0⃣🧑‍💻 Продолжаем изучать линейную регрессию и начнем мы с реализации формулы:

🟰ẇ = (Xᵀ * X)⁻¹ * Xᵀ * Y🟰

⚙️ Что это за формула и что здесь что? Я для вас кинул скрины в комменты, как эта формула получилась:

1⃣ У нас изначально была формула, возможно, вы ее видели раньше:

🟰 y = a * x + b🟰

2⃣ Заменим ее на обозначения w₁ и w₀, тогда формула приобретет вид:

🟰 y = w₁ * x + w₀ * 1 = w₁ * x₁ + w₀ * x₀ 🟰

w₀ — свободный член, который отвечает за сдвиг линии регрессии

w₁, w₂ — веса (коэффициенты) для признаков x₁, x₂


🔗 Остальные преобразования формул в комментах ⬇️⬇️⬇️

3⃣ Итак, как только вы посмотрите все преобразования этих формул, мы придем к виду, который я вам показал в начале:

🟰ẇ = (Xᵀ * X)⁻ ¹ * Xᵀ * Y🟰

4⃣ Теперь, начнем 'по кусочкам' выписывать формулу:

▫️Вчера мы выводили матрицу X и матрицу Y. Дак вот, теперь самое время с ними поработать

5⃣🔗 Умножим матрицу X (объекты - признаки) на себя же транспонированную.

Транспонированная матрица — это матрица, которая получается из исходной путём перестановки строк и столбцов. Другими словами, чтобы получить транспонированную матрицу, необходимо взять каждую строчку по очереди и переписать её в виде столбца, не меняя порядка следования.

⬇️⬇️⬇️
###
Берем блок кода с прошлого поста (там мы выводили матрицу для X)
###

import numpy as np

X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]]) # Создание массива (получаем матрицу 4 на 2)

X_T_X = (X.T).dot(X)

###
Транспанируем матрицу X.T. X.T — это транспонированная версия матрицы X. Строки становятся столбцами, а столбцы — строками.
###

X_T_X


🔗 Вывод:

array([[    4,   280],
[ 280, 21000]])


🔗 Мы перемножаем матрицу X.T

[[  1,   1,   1,   1],
[ 50, 60, 70, 100]]


🔗 На матрицу X

[[  1,  50],
[ 1, 60],
[ 1, 70],
[ 1, 100]]

Кстати, че за единицы? Я про единицы, которые рядом с нашими признаками:

Единицы в первом столбце нужны, чтобы модель линейной регрессии учитывала свободный член
🟰w₀🟰

⬇️⬇️⬇️
⚙️ Единицы нужны, чтобы линейная регрессия не привязывалась к точке (0, 0) и могла сдвигать прямую вверх или вниз. Грубо говоря, гайс, мы включаем столбец единиц чтобы включить w₀ (свободный член)

w₀ — это сдвиг прямой вверх или вниз
w₁ — это наклон прямой


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2❤‍🔥1👍1🥰1🤓1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🔗 Вот вам пример использования наших новых функций:

import numpy as np

# Матрица X
X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])

# Транспонированная матрица X
X_T = X.T

# Печатаем результаты
print("Исходная матрица X:")
print(X)

print("\nТранспонированная матрица X.T:")
print(X_T)

# Считаем X_T_X
X_T_X = X_T.dot(X)
print("\nПроизведение X.T @ X:")
print(X_T_X)


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍1🥰1🤯1👀1
ВЕРНУТЬСЯ К НАВИГАЦИИ

6⃣🔗 Таак, теперь находим обратную матрицу к ней, в нашей формуле она обозначена X⁻¹

⚙️ Последнее, что мы с вами сделали, это перемножили транспонированную матрицу на саму себя же:

import numpy as np

X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])

X_T_X = (X.T).dot(X)
X_T_X


🔗 Таак, мы просто красавчики, теперь найдем обратную ей матрицу, об этом я сказал в начале поста:

from numpy.linalg import inv

X_T_X_inverted = inv(X_T_X)

X_T_X_inverted


7⃣⚙️ Дописываем формулу до конца!

(Xᵀ * X)⁻ ¹ * Xᵀ * Y

w = X_T_X_inverted.dot(X.T).dot(Y)
print('w_1=%.5f, w_2=%.3f' % (w[0][0], w[1][0]))


🧑‍💻 Полный код:

import numpy as np
from numpy.linalg import inv

# Матрица X и вектор Y
X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])
Y = np.array([[10], [30], [40], [50]])

# Вычисление X^T * X
X_T_X = (X.T).dot(X)

# Обратная матрица (X^T * X)^-1
X_T_X_inverted = inv(X_T_X)

# Вычисление w = (X^T * X)^-1 * X^T * Y
w = X_T_X_inverted.dot(X.T).dot(Y)

print('w_1=%.5f, w_2=%.3f' % (w[0][0], w[1][0]))


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍2🥰1🤡1👨‍💻1
ВЕРНУТЬСЯ К НАВИГАЦИИ

Вот такой у нас получится вывод с прошлого поста. Что это вообще такое?


y = -17.5 + 0.714 * x — мы получили уравнение прямой

y — является целевой переменной (это как раз предсказываемое значение, цена нашей хаты)

x — это признак или независимая переменная (площадь нашей хаты)

w_1=-17.50000, w_2=0.714


Набор из 4 точек, которые мы построили тут (Смотрите коменты), описывает прямая линия с этим уравнением y = -17.5 + 0.714 * x

ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍2🥰1🤯1
⚙️ Гайс, уже сегодня выйдет продолжение, мы построим свой первый график линейной регрессии, так что ждите большой пост!
❤‍🔥3👨‍💻32🤯2🤓1
🧑‍💻🔗 Как обычно подготовил вам красивую картиночку, чтобы глаз радовался. Всем добрый вечер! ▫️Как договаривались, сегодня линейная регрессия и за насколько постов я постараюсь полностью разжевать вам код и объяснить что происходит.

Для начала, вспомним, о чем мы уже написали:

# имортируем библиотеки
import numpy as np
from numpy.linalg import inv
import matplotlib.pyplot as plt

# Наши данные
X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]]) # площадь дома (входной признак)
Y = np.array([[10], [30], [40], [50]]) # цена дома (целевая переменная)

# Матрица X_T_X - транспанированная матрица
X_T_X = (X.T).dot(X) # Матричное провзедение Xᵀ * X (вычисляет коэффициенты регресии)
X_T_X_inverted = inv(X_T_X) # Находим обратную матрицу для полученного значения Xᵀ * X

w = X_T_X_inverted.dot(X.T).dot(Y) # Здесь мы прописали саму формулу

print('w_1=%.5f, w_2=%.3f' % (w[0][0], w[1][0]))


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥3👍2🤯1🤡1🤓1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🧑‍💻 Что насчет последней строки вывода?

print('w_1=%.5f, w_2=%.3f' % (w[0][0], w[1][0]))


🔵'w_1=%.5f, w_2=%.3f' — это форматированная строка, которая определяет, как будут выведены значения w₀ и w₁

🔵% — оператор, который связывает строку с указанными значениями из скобок (w[0][0], w[1][0])

🔵w — это результат вычисления коэффициентов линейной регрессии. Это матрица (или двумерный массив) размером 2×1

🔗 Теперь поговорим о каждом подробнее:

🔵%.5f — форматирует w₀ как число с плавающей точкой (дробное число), ( .5 указывает, что нужно вывести 5 цифр после запятой.)

🔵%.3f — форматирует w₁ как число с плавающей точкой ( .3 указывает, что нужно вывести 3 цифры после запятой.)

⚙️ Что касается наших получившихся значений?

🔵 w[0][0] — это первый элемент матрицы w₀

🔵w[1][0] — это второй элемент матрицы w₁

🔗 w₀ и w₁ зависят от распределения входных данных (их значений и количества)

Вывод:

w₀ = -17,5
w₁ = 0.714


ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍1🤯1🤡1🤓1
ВЕРНУТЬСЯ К НАВИГАЦИИ

🔗 Разбираем следующий блок кода:

margin = 10
X_min = X[:, 1].min() - margin
X_max = X[:, 1].max() + margin


1⃣🔵margin — отступ для улучшения вида графика (в комментах скину оба графика (с margin) и (без margin))

margin = 10


2⃣🔵X[:, 1] — извлекает значения площади из X (Вторая колонка, где речь идет про площадь)

🔵X_min и X_max — минимальное и максимальное значение площади с добавлением отступов (отступ как раз margin).

X_min = X[:, 1].min() - margin


🔵.min() — берется минимальное значение в этом столбце (у нас это 50).

🔵margin — уменьшается минимальное значение на 10 для расширения границы слева. (50 - 10 = 40)

🔵Если говорить про X_max, то тут напротив, берется максимальное значение в столбце X (у нас это 100), а затем + margin (то есть + 10), получаем 110

ВЕРНУТЬСЯ К НАВИГАЦИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍2🤡1🤓1
📈 Создаем точки для нашей линии:

🔗 Создаем 100 равномерно распределенных точек между X_min и X_max, это точки для оси x, по которым строится прямая.

X_support = np.linspace(X_min, X_max, num=100)


⚙️ Вычисляем значения y для всех точек из X_support (применяя уравнение регрессии y = w₀ + w₁ * x)

Y_model = w[0][0] + w[1][0] * X_support


📊 Теперь настраиваем график:

plt.figure(figsize=(8, 6)) # Создает график размером 8x6 дюймов


🔗 Задаем диапазон по оси x

plt.xlim(X_min, X_max)


🔗 Задаем диапазон по оси y от 0 до максимального значения y + отступ (margin)

plt.ylim(0, Y[:, 0].max() + margin)


⚙️ Теперь добавляем данные на график:

plt.scatter(X[:, 1], Y[:, 0], color='green', label='Исходные данные')


🔗 X[:, 1] — координаты по оси x (второй столбец x — это площади)

🔗 Y[:, 0] — координаты по оси y (цены домов)

plt.plot(X_support, Y_model, color='blue', label='Линейная регрессия')


🔗 X_support — координаты по оси x

🔗 Y_model — координаты по оси y (предсказание модели)

plt.xlabel('Площадь дома') # Подписываем оси
plt.ylabel('Цена дома') # Подписываем оси
plt.title('Линейная регрессия: Цена дома от площади') # Заголовок
plt.legend() # Добавляем легенду
plt.grid() # Сетка на графике


plt.show() # Вызываем наш график


П О Л Н Ы Й К О Д

import numpy as np
from numpy.linalg import inv
import matplotlib.pyplot as plt

# Данные
X = np.array([[1, 50], [1, 60], [1, 70], [1, 100]])
Y = np.array([[10], [30], [40], [50]])

# Матрица X_T_X и обратная матрица
X_T_X = (X.T).dot(X)
X_T_X_inverted = inv(X_T_X)

# Коэффициенты w
w = X_T_X_inverted.dot(X.T).dot(Y)
print('w_1=%.5f, w_2=%.3f' % (w[0][0], w[1][0]))

# Построение линейной модели
margin = 10
X_min = X[:, 1].min() - margin
X_max = X[:, 1].max() + margin

# Поддержка для прямой
X_support = np.linspace(X_min, X_max, num=100)
Y_model = w[0][0] + w[1][0] * X_support

# Настройка графика
plt.figure(figsize=(8, 6))
plt.xlim(X_min, X_max)
plt.ylim(0, Y[:, 0].max() + margin)

# Точки данных
plt.scatter(X[:, 1], Y[:, 0], color='red', label='Исходные данные')

# Прямая регрессии
plt.plot(X_support, Y_model, color='blue', label='Линейная регрессия')

# Добавление подписей
plt.xlabel('Площадь дома')
plt.ylabel('Цена дома')
plt.title('Линейная регрессия: Цена дома от площади')
plt.legend()
plt.grid()

plt.show()
❤‍🔥2🤓2👍1🤯1
Ну и сам результат
👍2🤓21🤯1