<jupyter_start><jupyter_text>Нейронные сети. Основы  Реализация перцептрона Перцептрон - это модель, предложенная Френком Розенблаттом в 1957 году и являющаяся прообразом современных нейронных сетей. По своей сути она представляет из себя значительно упрощенную схему восприятия информации мозгом. Целью этого практического задания будет реализация собственной модели перцептрона. Давайте разберем схему работы этого алгоритма в деталях.* Мы работаем с тренировочной выборкой $S = \{(x_i, y_i)| i \in \{1,...,m\} \}$* Инициализируем веса $\omega^{(0)} \leftarrow 0$ нулевым вектором.* Инициализирует bias параметр $b = 0$.* В начальный момент времени номер шага $t=0$.* Задаем learning rate $\eta > 0$.* Пока значение $t < t_{\max}$    * случайно выбираем объект из тренировочной выборки $(x_i, y_i) \in S$.    * если выполняется условие $y_i (\langle \omega^{(t)}, x_i\rangle + b) \leq 0$ тогда        * $b^{(t+1)} \leftarrow b^{(t)} + \eta \times y_i$.        * $\omega^{(t+1)} \leftarrow \omega^{(t)} + \eta \times y_i \times x_i$.    * далее, обновляем $t \leftarrow t+1$.Таким образом, финальное значение ветора весов $\omega$ и bias параметра $b$ позволяют классифицировать новый объект $x$. Если $(\langle \omega, x \rangle + b) \geq 0$, то мы относим объект к классу $+1$, в противном случае мы относим объект к классу $-1$. Для начала загрузим датасет для задачи классификации цветков Ириса с помощь функции `load_iris` из `sklearn.datasets`. Давайте подготовим данные для задачи бинарной классификации. Для этого выберем первые 100 элементов из данного набора данных. Так же преобразуем класс $0$ в класс $-1$.<jupyter_code>import numpy as np
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
X, y = X[:100], y[:100]
num_features = X.shape[1]
y = np.array([1 if y_i == 1 else -1 for y_i in y])<jupyter_output><empty_output><jupyter_text>Реализуйте алгоритм перцептрона приведенный выше. Для выборки случайного объекта из тренировочного датасета по индексу используйте функцию `randint` из модуля `random` с параметрами 0 и n, где n - это размер тренировочно выборки. Перед запуском итераций алгоритма установите `random.seed(42)`. Вы можете реализовать перцептрон в качестве класса с интерфейсом, похожим на интерфейсы моделей из `scikit-learn`. Для этого достаточно реализовать функцию `fit` и `predict` для решения этого практического задания. Однако, ваша реализация может отличаться. Необходимое требование - это использование генератора случайных чисел, описанного выше.  *РЕШЕНИЕ*<jupyter_code>import random

class Perceptron:
    def __init__(self, num_features, eta, t_max):
        self.b = 0
        self.eta = eta
        self.w = np.zeros(num_features)
        self.t_max = t_max
        self.t = 0
    
    def fit(self, X, y, random_state=42):
        X = np.array(X)
        n = X.shape[0]
        random.seed(random_state)
        while (self.t < self.t_max):
            self.t += 1
            index = random.randint(0, n - 1)
            x_i = X[index]
            y_i = y[index]
            if y_i * (np.dot(x_i, self.w) + self.b) <= 0:
                self.b += self.eta * y_i
                self.w += self.eta * y_i * x_i
    
    def get_class(self, x):
        return 1 if x >= 0 else -1
    
    def predict(self, X):
        return np.array([self.get_class(np.dot(x_i, self.w) + self.b) for x_i in X])<jupyter_output><empty_output><jupyter_text>Следующим шагом является проверка нашей модели. Случайно разделите выборку на тренировочный и тестовый датасет, используя функцию `tran_test_split` с параметрами `test_size=0.25` и `random_state=10`. Запустите обучение модели с параметрами $\eta=0.1$ и $t_{\max}=40$. Оцените качество на тестовой выборке и запишите результат в переменную `score` с точность до двух знаков после запятой, используя метрику `accuracy`. Это значение и будет являться ответом на это практическое задание.  *РЕШЕНИЕ*<jupyter_code>from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=10)
model = Perceptron(num_features, 0.1, 40)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
score = round(accuracy_score(y_test, y_pred), 2)<jupyter_output><empty_output><jupyter_text>Строка с ответами<jupyter_code>print("score {0:.2f}".format(score))<jupyter_output>score 1.00
{'fraction_non_alphanumeric': 0.10412394622920938, 'fraction_numerical': 0.016176805650489862, 'mean_word_length': 3.9604519774011298, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 18, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '418270', 'license': 'MIT', 'n_tokens_mistral': 1773, 'n_tokens_neox': 1966, 'n_words': 481, 'path': 'W5/Perceptron.ipynb', 'repo_name': 'keddad/python-da-notes', 'size': '4389'}