‼️ Если представить, что у нас 2 признака (x₁ и x₂): веса (это w) будут определять наклон прямой. bias(b) — расположение прямой, features(это координаты x) — это просто точка, которую мы проверяем, по какую сторону прямой она лежит.📱 В общем, def score() — функция для вычисления линейной комбинации признаков, на выходе просто получаем любое вещественное число, если очень коротко, это сырая оценка нашей модели (насколько сильно точка тянет в сторону класса 1 или 0)
def step(x):
if x >= 0:
return 1
else:
return 0
📱 То есть, берем входные (фичи, веса и смещение)➡️ сначала вызывается функция score(), возвращает она число (где точка относительно линии)➡️ это число сразу же подается в step(), которая возвращает 0 или 1➡️ prediction() возвращает результат как итоговое предсказание.
def prediction(weights, bias, features):
return step(score(weights, bias, features))
def error(weights, bias, features, label):
pred = prediction(weights, bias, features)
if pred == label:
return 0
else:
return np.abs(score(weights, bias, features))
pred = prediction(weights, bias, features) — Для начала, модель делает предсказания для точки (это функция выше: 0 ил 1).if pred == label: — Сравниваем предсказание с настоящей меткой label (label была выше)return np.abs(score(weights, bias, features)) — Берем по модулюfrom matplotlib import pyplot as plt
import numpy as np
import random
import utils
features = np.array([[1,0],[0,2],[1,1],[1,2],[1,3],[2,2],[2,3],[3,2]])
labels = np.array([0,0,0,0,1,1,1,1])
utils.plot_points(features, labels)
def score(weights, bias, features):
return features.dot(weights) + bias
def step(x):
if x >= 0:
return 1
else:
return 0
def prediction(weights, bias, features):
return step(score(weights, bias, features))
def error(weights, bias, features, label):
pred = prediction(weights, bias, features)
if pred == label:
return 0
else:
return np.abs(score(weights, bias, features))
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Бэкдор
This media is not supported in your browser
VIEW IN TELEGRAM
Открываем ЛЮБЫЕ домофоны с ChatGPT — нейронка поможет попасть в подъезд, если вы случайно забыли ключи.
Все просто:
1️⃣ Показываем нейронке домофон в режиме видео.
2️⃣ ИИ выдаст код для открытия ЛЮБОГО домофона. Мы проверили, в России работает на УРА!
Сохраняйте фичу.
👍 Бэкдор
Все просто:
Сохраняйте фичу.
Please open Telegram to view this post
VIEW IN TELEGRAM
from matplotlib import pyplot as plt
import numpy as np
import random
import utils
features = np.array([[1,0],[0,2],[1,1],[1,2],[1,3],[2,2],[2,3],[3,2]])
labels = np.array([0,0,0,0,1,1,1,1])
utils.plot_points(features, labels)
def score(weights, bias, features):
return features.dot(weights) + bias
def step(x):
if x >= 0:
return 1
else:
return 0
def prediction(weights, bias, features):
return step(score(weights, bias, features))
def error(weights, bias, features, label):
pred = prediction(weights, bias, features)
if pred == label:
return 0
else:
return np.abs(score(weights, bias, features))
def mean_perceptron_error(weight, bias, features):
total_error = 0
for i in range(len(features)):
total_error +- error(weight, bias, features[i], labels[i])
return total_error / len(features)
weights = [1, 2] # Начальные веса
bias = -4 # Смещение
for i in range(len(features)): # Проходим по всем точкам
print(prediction(weights, bias, features[i]), error(weights, bias, features[i], labels[i]))
def perceptron_trick(weights, bias, features, label, learning_rate = 0.01):
pred = prediction(weights, bias, features)
for i in range(len(weights)):
weights[i] += (label - pred) * features[i] * learning_rate
bias += (label - pred) * learning_rate
return weights, bias
pred = prediction(weights, bias, features) — считаем предсказание (0 или 1) для текущей точкеpredictions() — это функция, которая позволит понять, 'по какую сторону' границы оказалась точка.weights[i] += (label - pred) * features[i] * learning_rate — Итак, важная строчка — ведь это обновление весов. Как это работает⚙️ Если модель угадала (например, label=1, pred=1 или label=0, pred=0), то label - pred = 0➡️ веса не меняются.🔵 Если модель ошиблась:
label=1, pred=0➡️ label - pred = 1➡️ веса увеличиваются (подтягиваем границу ближе к этой точке).
label=0, pred=1➡️ label - pred = -1➡️ веса уменьшаются (отталкиваем границу от этой точки).
bias += (label - pred) * learning_rate — а тут идет обновление нашего смещения. работает по тому же принципу что и веса. ⚙️ Смещение bias двигает границу вверх/вниз (или влево/вправо), чтобы лучше разделять классы
return weights, biasКак то так
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier, export_text # Это и есть наше дерево решений
from sklearn.metrics import accuracy_score # Метрика для деревьев
from sklearn.model_selection import train_test_split # разделили данные
rng = np.random.default_rng(42)
n = 300
mean0 = [-1.0, 0.0] # Часть точек находится в этом диапазоне
mean1 = [1.3, 0.8] # Часть точек в этом
cov = [[0.7, 0.2], #
[0.2, 0.6]]
X0 = rng.multivariate_normal(mean0, cov, size = n // 2) # по 150 точек на класс
X1 = rng.multivariate_normal(mean1, cov, size = n // 2)
#
X = np.vstack([X0, X1])
y = np.hstack([np.zeros(n // 2), np.ones(n // 2)])
🔵 Матрица ковариации (ковариационная матрица, дисперсионно-ковариационная матрица) — это квадратная матрица, которая количественно оценивает, как изменяются две переменные относительно друг друга.🔵 Речь идет про переменную cov — она задает разброс и наклон точек🔘 Диагональ ([0,0] и [1,1]) — дисперсия по каждой оси➡️ ширина по X и по Y.🔘 Вне диагонали ([0,1] и [1,0]) — ковариация➡️ показывает, наклонены точки или нет.
cov = [[0.7, 0.2],
[0.2, 0.6]]
🔘 Можете чекнуть формулу дисперсии — так вот это среднее «квадратичное отклонение» значений от их среднего.🔘 Если по-простому: насколько сильно данные «размазаны» вокруг среднего значения.🔵 В ковариационной матрице:🔘 Диагонали (верхний левый и нижний правый) = дисперсии (разброс по каждой оси отдельно).🔘 Вне диагонали (верхний правый и нижний левый) = ковариации (как связаны оси друг с другом) — они одинаковые🔵 Следующим этапом идем смотреть формулу корреляции (Формула корреляции:
(Определение коэффициента корреляции Пирсона)
‼️ Ковариация и корреляция — понятия в статистике, которые отличаются тем, что ковариация — измеряет степень, в которой две переменные меняются вместе, а корреляция — не только степень, но и направление отношения между переменными.
❓ Чтобы Вам было понятно, зададим такой вопрос:
Растут ли две величины вместе или одна вверх, другая вниз?🔘 Если ковариация положительная➡️ X и Y вместе растут.🔘 Если отрицательная➡️ X растёт, Y падает.🔘 Если около 0➡️ связи почти нет.‼️ Проблема в том, что ковариация зависит от единиц измерения. Чтобы от такой проблемы избавиться➡️ придумали корреляцию — делить ковариацию на масштабы разброса X и Y.🔘 Эти масштабы — стандартные отклонения (корни из дисперсий).🧑💻 Например:🔵 Пусть у нас 3 человека:🔘 Рост (X): [1, 2, 3] метра, среднее — 2🔘 Вес (Y): [2, 4, 6] кг, среднее — 4🔘 Если подставим в формулу — получим 1.33 — Ковариация положительная, X и Y растут вместе. Но если мы пересчитаем ковариацию в сантиметрах или граммах, она вырастет в 100 раз!!!🔵 Дисперсия же говорит: насколько в среднем значения расходятся от среднего (разброс).🔵 Стандартное отклонение (σ) — это корень из дисперсии, то есть тот же разброс, но в тех же единицах, что и данные.🔵 Если у роста σ ≈ 10 см → большинство людей будут ±10 см от среднего.🔵 Если у веса σ ≈ 15 кг → большинство людей будут ±15 кг от среднего.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сейчас рассматриваю вариант изменить формат постов: ЛИБО чаще выходят, но небольшие, ЛИБО большие, но выходить будут реже.
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3,
random_state=7, stratify=y)
🔵 Xtr — обучающие признаки🔵 Xte — тестовые признаки🔵 ytr — обучающие метки🔵 yte — тестовые метки
idx: 0 1 2 3 4 5
X = [x0, x1, x2, x3, x4, x5]
y = [y0, y1, y2, y3, y4, y5]
NEXT POST
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
def loss(w, x, y):
M = np.dot(w, x) * y
return np.log2(1 + np.exp(-M))
w = [1, -1]
x = [2, 1]
w * x = 1 * 2 + (-1) * 1 = 2 - 1 = 1
M = (w * x) * y = 1 * 1 = 1
L = log₂(1 + e ⁻ ʷᵀ ˣ ʸ)
L = log₂(1 + e⁻ᴹ)
L = log₂(1 + e⁻¹)
e⁻¹ = 0.37
L = log₂(1 + 0.37) = 0.45
Итак, а теперь представим что y = - 1 (то есть w * x нам давал значение 1, сама обученная наша модель якобы так посчитала, а вот y (целевое значение) равен -1) — то есть в реальности у нас класс другой. Попробуем посчитать, учитывая что класс у нас ошибочный:
L = log₂(1 + e⁻(⁻¹))
L = log₂(1 + e¹)
L ≈ 1.894
Please open Telegram to view this post
VIEW IN TELEGRAM
11❤🔥3👀3🤬2
return np.log2(1 + np.exp(-M))
def df(w, x, y):
M = np.dot(w, x) * y
return -(np.exp(-M) * x.T * y) / ((1 + np.exp(-M)) * np.log(2))
L = log₂(1 + e ⁻ ʷᵀ ˣ ʸ)
L = log₂(1 + e⁻ᴹ) # Функция потерь для одной точки
return -(np.exp(-M) * x.T * y) / ((1 + np.exp(-M)) * np.log(2))
data_x = [(3.0, 4.9), (2.7, 3.9), (3.0, 5.5)....
data_y = [1, -1, 1, -1, -1.....
x_train = np.array([[1, x[0], x[1]] for x in data_x])
y_train = np.array(data_y)
n_train = len(x_train)
w = [0.0, 0.0, 0.0]
nt = np.array([0.5, 0.01, 0.01])
lm = 0.01
N = 1000
Qe = 0
np.random.seed(0)
for n in range(N):
k = np.random.randint(0, n_train - 1)
Qe = lm * loss(w, x_train[k], y_train[k]) + (1 - lm) * Qe
w = w - nt * df(w, x_train[k], y_train[k])
Q = (np.dot(x_train, w) * y_train < 0).mean()
Q = (np.dot(x_train, w) * y_train < 0).mean()
Тг не дает больше объяснять 😢
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥6👀2🤬1
Anonymous Quiz
24%
A) SGD использует весь датасет для одного шага обновления весов 📊
48%
B) SGD использует один случайный объект (или маленькую выборку) для одного шага 📈
12%
C) SGD не вычисляет градиент, а подбирает веса случайно ⚙️
16%
D) SGD работает только с нейросетями, а Batch GD — с линейной регрессией ✔️