def draw_polynomial(coefs):
n = len(coefs)
x = np.linspace(-1, 1, 1000)
y = sum([coefs[i] * x ** i for i in range(len(coefs))])
plt.plot(x, y, linestyle = '-', color = 'black', label = 'True polynom')
‼️ Еще один немаловажный момент: Как рисуется наша парабола? Суть в том, что нам нужно построить график функции:🟰 y = 2 - x²🟰 или🟰 y = 2 + 0·x - 1·x²🟰 🔵 Сначала, создаем точки по оси X: получаем массив из 1000 точек от -1 до 1
x = np.linspace(-1, 1, 1000)
# [-1. -0.998 -0.996 ... 0.996 0.998 1.0]🔵 Далее, нам нужно посчитать Y для каждого X (Применяем наш многочлен и подставляем каждый X в Y) — получаем массив Y
y = sum([coefs[i] * x ** i for i in range(len(coefs))])
# [1. 1.003996 1.007984 ... 1.007984 1.003996 1.0]🔵 Теперь рисуем все:
plt.plot(x, y, linestyle='-', color='black')
y
↑
2 | ●
1 | ● ●
0 +----------------→ x
-1 0 1
X = []
Y = []
for i in range(40):
x = random.uniform(-1, 1) # Берем случайное значение от 1 до 1
y = polynomial(coefs, x) + random.gauss(0, 0.1) # Это наша формула мнргочлена + шум
X.append(x)
Y.append(y)
def train_and_plot_polynomial_regression(X, Y, degree):
X = np.array(X).reshape(-1, 1)
Y = np.array(Y)
X = np.array(X).reshape(-1, 1) # X превращаем в столбец
Y = np.array(Y)
poly = PolynomialFeatures(degree=degree)
X_poly = poly.fit_transform(X)
[[1, 0.1, 0.01],
[1, 0.2, 0.04],
...
]
# Наша запись теперь выяглидит подобно [x⁰, x¹, x²]
model = LinearRegression()
model.fit(X_poly, Y
‼️ Полиномиальная регрессия — это по сути линейная регрессия, но с нелинейными признаками. Она расширяет линейную модель путём добавления новых признаков, которые являются степенями исходных признаков.
P.S Это новые x-корды, чтобы красиво построить график
X_plot = np.linspace(np.min(X), np.max(X), 100).reshape(-1, 1) # reshape делает из вектора столбец
X_plot_poly = poly.transform(X_plot)
Y_plot_poly = model.predict(X_plot_poly) # Делаем предсказания модели
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
def func(x):
return 0.5 * x**2 - 0.1 * 1/np.exp(-x) + 0.5 * np.cos(2*x) - 2.
coord_x = np.arange(-5.0, 5.0, 0.1)
coord_y = func(coord_x)
sz = len(coord_x)
w = [-1.59, -0.69, 0.278, 0.497, -0.106]
model_y = (
w[0] +
w[1] * coord_x +
w[2] * coord_x ** 2 +
w[3] * np.cos(2 * coord_x) +
w[4] * np.sin(2 * coord_x)
)
coord_y = func(coord_x)
model_y = (
w[0] +
w[1] * coord_x +
w[2] * coord_x ** 2 +
w[3] * np.cos(2 * coord_x) +
w[4] * np.sin(2 * coord_x)
)
Losses = abs(model_y - coord_y)
print(coord_y)
print('----------------------------------------')
print(model_y)
Q = np.mean(Losses)
sz = len(coord_x)
Q = 1/sz * sum([ Losses(model_y(x, w), func(x)) for x in coord_x ])
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Quiz
43%
A) Это вероятность ошибки модели на новых, ранее не виденных данных
43%
B) Это сумма ошибок модели на тренировочных данных
0%
C) Это точность модели на отложенной выборке
14%
D) Это разница между предсказанием и реальным значением на одной точке
Forwarded from CodeLab ML
Anonymous Quiz
19%
A) MAE (Mean Absolute Error)
31%
B) MSE (Mean Squared Error)
25%
C) RMSE (Root Mean Squared Error)
25%
D) R² (коэффициент детерминации)
‼️ Прежде всего — это формула вычисления весов (характерна для задач регрессии или классификации по прямой)
X =
[[1, 5.8, 1.2],
[1, 5.6, 1.5],
[1, 6.5, 1.5]]
y = [-1, -1, 1]
X.T =
[[1.0, 1.0, 1.0], # w0
[5.8, 5.6, 6.5], # x1
[1.2, 1.5, 1.5]] # x2
X = [(1, 5.6, 1.5),
(1, 6.5, 1.5),
(1, 6.1, 1.3)
]
X.shape == (3, 3)
X.T.shape = (3, 3)
Вот такие вот дела
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from CodeLab
Anonymous Quiz
20%
A) Чтобы ускорить градиентный спуск
0%
B) Чтобы улучшить точность модели на трейне
70%
C) Чтобы бороться с переобучением за счёт ограничения весов
10%
D) Чтобы убрать коррелированные признаки
Anonymous Quiz
45%
A) Модель точно предсказывает тренировочные данные, но плохо на тесте
9%
B) Модель хорошо предсказывает тест, но переобучена
27%
C) Модель слишком проста и недообучена
18%
D) Модель идеально сбалансирована
ДОЧИТЫВАЕМ В НАШЕМ ЧАТИКЕ
Please open Telegram to view this post
VIEW IN TELEGRAM
Что хотите увидеть следующим ❓
Anonymous Poll
20%
50%
10%
20%
Здесь, здесь, здесь и здесь мы уже рассмотрели эту тему (и весьма неплохо), но теперь будем углубляться и решать задачки.
‼️ Градиентный спуск — это алгоритм оптимизации, который итеративно изменяет внутренние параметры модели (веса, смещение).❓ Для чего ему их изменять? — Для минимизации функции потерь.❓ Что такое функция потерь? — По сути это оценка модели (разница между предсказаниями модели и реальными целевыми значениями).‼️ Итак, получается, что Градиентный спуск это алгоритм, который меняет параметры чтобы уменьшить разницу между предсказаниями и истинными значениями.
Как работает?
Вот тут нам и нужна формула:
✅ Это правило работает везде — в отрицательной и положительной области🟢 Градиент подсказывает, в какую сторону растёт функция🟢 Мы идём в противоположную сторону, чтобы уменьшить значение функции
Please open Telegram to view this post
VIEW IN TELEGRAM