Задача 01A. k-point crossover

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется на языке Python реализовать методы точечного кроссовера.

Функция single_point_crossover(a, b, point) выполняет одноточечный кроссовер, значения справа от точки кроссовера меняются местами.

Функция two_point_crossover(a, b, first, second) выполняет двухточечный кроссовер, значения между точек кроссовера меняются местами.

Функция k_point_crossover(a, b, points) выполняет k-точечный кроссовер, значения между каждой чётной парой точек меняются местами.

Функции должны иметь следующий интерфейс


import numpy as np

def single_point_crossover(a: np.ndarray, b: np.ndarray, point: int) -> tuple[np.ndarray, np.ndarray]:
    """Performs single point crossover of `a` and `b` using `point` as crossover point.
    Chromosomes to the right of the `point` are swapped

    Args:
        a: one-dimensional array, first parent
        b: one-dimensional array, second parent
        point: crossover point

    Return:
        Two np.ndarray objects -- the offspring"""

    raise NotImplemetnedError()


def two_point_crossover(a: np.ndarray, b: np.ndarray, first: int, second: int) -> tuple[np.ndarray, np.ndarray]:
    """Performs two point crossover of `a` and `b` using `first` and `second` as crossover points.
    Chromosomes between `first` and `second` are swapped

    Args:
        a: one-dimensional array, first parent
        b: one-dimensional array, second parent
        first: first crossover point
        second: second crossover point

    Return:
        Two np.ndarray objects -- the offspring"""

    raise NotImplemetnedError()


def k_point_crossover(a: np.ndarray, b: np.ndarray, points: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
    """Performs k point crossover of `a` and `b` using `points` as crossover points.
    Chromosomes between each even pair of points are swapped

    Args:
        a: one-dimensional array, first parent
        b: one-dimensional array, second parent
        points: one-dimensional array, crossover points

    Return:
        Two np.ndarray objects -- the offspring"""

    raise NotImplemetnedError()

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функций.

Примеры тестов

Стандартный вход Стандартный выход
1 a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) b = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) prep = lambda x: ' '.join(map(str, x)) print(*map(prep, single_point_crossover(a, b, 4)), '', sep='\n') print(*map(prep, two_point_crossover(a, b, 2, 7)), '', sep='\n') print(*map(prep, k_point_crossover(a, b, np.array([1, 5, 8]))), '', sep='\n')
0 1 2 3 4 4 3 2 1 0
9 8 7 6 5 5 6 7 8 9

0 1 2 6 5 4 3 7 8 9
9 8 7 3 4 5 6 2 1 0

0 1 7 6 5 5 6 7 8 0
9 8 2 3 4 4 3 2 1 9
            

Задача 01B. Stochastic universal sampling

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется на языке Python реализовать алгоритм Stochastic universal sampling.

Функция должна иметь следующий интерфейс


import numpy as np

def sus(fitness: np.ndarray, n: int, start: float) -> list:
    """Selects exactly `n` indices of `fitness` using Stochastic universal sampling alpgorithm. 

    Args:
        fitness: one-dimensional array, fitness values of the population, sorted in descending order
        n: number of individuals to keep
        start: minimal cumulative fitness value

    Return:
        Indices of the new population"""

    raise NotImplementedError()

Параметрами функции являются:

Функция возвращает список индексов выбранных особей

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию функции.

Примеры тестов

Стандартный вход Стандартный выход
1 fitness = np.array([10, 4, 3, 2, 1]) print(*fitness[sus(fitness, 3, 6)])
10 4 1
            

Задача 01C. Распределение задач

Входной файл:input.txt   Ограничение времени:1 сек
Выходной файл:output.txt   Ограничение памяти:256 Мб
Максимальный балл:10000  

Условие

Группа разработчиков работает над проектом. Весь проект разбит на задачи, для каждой задачи указывается ее категория сложности (1, 2, 3 или 4), а также оценочное время выполнения задачи в часах. Проект считается выполненным, если выполнены все задачи. Для каждого разработчика и для каждой категории сложности задачи указывается коэффициент, с которым, как ожидается, будет соотноситься реальное время выполнения задачи данным разработчиком к оценочному времени. Считается, что все разработчики начинают работать с проектом в одно и тоже время и выделяют для работы одинаковое время. Необходимо реализовать программу, распределяющую задачи по разработчикам, с целью минимизировать время выполнения проекта (получить готовый проект за минимальный промежуток времени). Поиск решения необходимо реализовать с помощью генетического алгоритма.

Отправка решения и тестирование

Данная задача будет проверяться на ОДНОМ входном файле. Этот файл можно скачать ЗДЕСЬ.

В качестве решения принимается текстовый файл, содержащий ответ к задаче в требуемом формате (при его отправке следует выбрать в тестирующей системе среду разработки "Answer text").

Решение набирает количество баллов, вычисляемое по следующей формуле: Score = 106Tmax. Tmax — наибольшее среди всех разработчиков время, затраченное на выполнение выданных соответствующему разработчику задач.

Формат входного файла

Первая строка входного файла содержит целое число N количество задач.

Вторая строка — N целых чисел от 1 до 4 категорий сложности задач.

Третья строка — N вещественных положительных чисел оценочного времени для задач.

Четвертая строка – целое число M, количество разработчиков .

Следующие M строк содержат по 4 вещественных положительных числа — коэффициенты каждого разработчика.

Формат выходного файла

Первая и единственная строка выходного файла содержит N целых чисел wi — номер разработчика, назначенного на i - ю задачу.

Ограничения

Примеры тестов

Входной файл (input.txt) Выходной файл (output.txt)
1
3
1 1 4
5.2 3.4 4
2
1 1 2 5
0.7 1 1.2 1.5
1 2 2

Задача 01D. Распределение задач. Загрузка решения

Максимальный балл:5   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

Требуется загрузить решение задачи Распределение задач. Баллы за задачу устанавливаются после ручной проверки отправленного решения.

В качестве решения принимается файл с исходным кодом, которым был получен ответ к задаче. В систему требуется отправить ссылку на файл, размещённый в открытом доступе (Google Colab, Github, Google Drive и др.), указав среду разработки "Answer text". После отправки решение необходимо сдать преподавателю лично до начала зачётной недели.

Распределение баллов

Максимальное количество баллов за задачу — 5.


Задача 02A. Логистическая регрессия. Основы

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть задана логистическая регрессия для задачи бинарной классификации

f: X↦ y, X⊆ Rn, y = { − 1, 1}

f(x, θ) = σ(nxiθi)

σ(x) = 11 + e − x

Требуется реализовать следующие функции на языке Python.


import numpy as np

def logistic_func(theta: np.ndarray, x: np.ndarray) -> float:
    """Computes logistic regression value for sample x.
    
    Arguments:
        theta: 1d array of float, regression coefficients
        x: 1d array of float, sample to compute value for
    
    Returns:
        float, logistic regression value
    """
    pass

def logistic_func_all(theta: np.ndarray, X: np.ndarray) -> np.ndarray:
    """Computes logistic regression value for all samples in matrix X.
    
    Arguments:
        theta: 1d array of float, regression coefficients
        X: 2d array of float, row-major matrix of samples
        
    Returns:
        1d array of float, logistic regression values for all samples in matrix X
    """
    pass
    
def cross_entropy_loss(theta: np.ndarray, X: np.ndarray, y: np.ndarray) -> float:
    """Computes binary cross entropy loss for logistric regression with parameters `theta`
    on samples `X` and true labels `y`.
    
    Arguments:
        theta: 1d array of float, regression coefficients
        X: 2d array of float, row-major matrix of samples
        y: 1d array of int, true class lables from set {-1, 1}
        
    Returns:
        float, cross entropy loss value
    """
    pass
    

def grad_cross_entropy_loss(theta: np.ndarray, X: np.ndarray, y: np.ndarray) -> np.ndarray:
    """Computes gradient of binary cross entropy loss for logistic regression
    with parameters `theta` on samples `X` and true values `y`.
    
    Arguments:
        theta: 1d array of float, regresion coefficients
        X: 2d array of float, row-major matrix of samples
        y: 1d array of int, true class labels from set {-1, 1}
        
    Returns:
        1d array of float, cross entorpy gradient with respect to `theta`
    """
    pass

Формат выходных данных

Код должен содержать только реализацию функций.


Задача 02B. Poisson regression

Входной файл:Стандартный вход   Ограничение времени:3 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется написать на языке Python класс PoissonRegression, реализующий обобщённую линейную модель, использующую логарифмическую функцию связи

f(x, θ) = exp(ni = 1θi xi + θ0) ,

где n — количество признаков.

Модель оптимизирует следующую функцию потерь

l(X, y, θ) = 1mmi = 1(yilogyif(Xi, θ) − yi + f(Xi, θ)) + α2ni = 1θ2i ,

где m — количество примеров, α — параметр регуляризации.

Для оценки качества модели используется метрика D2

D2 = 1 − D(y, )D(y, y) ,

где y — среднее значение вектора y,

D(y, ) = 2mmi = 1(yilogyii − yi + i) .

Класс должен иметь следующий интерфейс


from __future__ import annotations

import numpy as np


class PoissonRegression:
    r"""Implements a generalized linear model with log link function[1]

        f(x, \theta) = \exp(\sum\limits_{i=1}^n\theta_ix_i + \theta_0)

    The model optimizes the following loss

        l(X, y, \theta) = \frac{1}{m}\sum\limits_{i=1}^n(y_i\log\frac{y_i}{f(X_i, \theta)} - y_i + f(X_i, \theta)) + \frac{\alpha}{2}\sum\limits_{i=1}^n\theta_i^2

    where n, m are numbers of features and samples respectively, $\alpha$ -- regularization strength.

    Parameters:

        use_bias: bool, default = True
            Whether the model uses bias term.

        alpha: float, default = 1
            L2 regularization strength.

    References:

        [1]: https://en.wikipedia.org/wiki/Generalized_linear_model#Link_function
    """
    
    def __init__(self, use_bias: bool = True, alpha: float = 1):
        """Initializes `use_bias` and `alpha` fields."""
        pass


    def predict(self, X: np.ndarray) -> np.ndarray:
        """Computes model value on feature matrix `X`.

        Arguments:

            X: 2d array of float, feature matrix.

        Returns:

            1d array of float, predicted values.
        """
        pass


    def loss(self, X: np.ndarray, y: np.ndarray) -> float:
        """Computes loss value on feature matrix `X` with target values `y`.

        Arguments:

            X: 2d array of float, feature matrix.
            y: 1d array of int, target values.

        Returns:

            loss value
        """
        pass


    def score(self, X: np.ndarray, y: np.ndarray) -> float:
        r"""Computes D^2 score on feature matrix `X` with target values `y`.

        The score is defined as

            D^2 = 1 - \frac{D(y, \hat{y})}{D(y, \overline{y})}

        where D(y, \hat{y}) = 2(y\log\frac{y}{\hat{y}} - y + \hat{y}).

        Arguments:
            
            X: 2d array of float, feature matrix.
            y: 1d array of int, target values.

        Returns:

            score value
        """
        pass


    def fit(self, X: np.ndarray, y: np.ndarray, *,
            eta: float = 1e-3, beta1: float = 0.9, beta2: float = 0.999,
            epsilon: float = 1e-8, tol: float = 1e-3, max_iter: int = 1000) -> PoissonRegression:
        """Optimizes model loss w.r.t model coefficitents using Adam[1] optimization algorithm.
        Initially model coefficients are initialized with zeros.

        Arguments:

            X: 2d array of float, feature matrix.
            y: 1d array of int, target values.
            eta: learning rate.
            beta1: first moment decay rate.
            beta2: second moment decay rate.
            tol: threshold for L2-norm of gradient.
            max_iter: maximal number of iterations.

        Returns:

            self

        References:

            [1]: https://ruder.io/optimizing-gradient-descent/index.html#adam
        """
        pass


    @property
    def coeffs(self) -> np.ndarray:
        """Returns 1d array of float, coefficients used by the model excluding bias term."""
        pass
    

    @property
    def bias(self) -> float:
        """Returns bias term used by the model. If `use_bias = False` returns 0."""
        pass

Для оптимизации должен быть использован алгоритм Adam. Оптимизация начинается с нулевой начальной точки θ = {0}ni = 0.

При решении задачи запрещено использовать любые модули, кроме numpy и scipy.special.

Формат выходных данных

Код решения должен содержать импортируемые модули, определение и реализацию класса.


Задача 03A. Наивный байесовский классификатор

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть задан некоторый язык, описываемый множеством слов W, |W| = mmN. Требуется построить наивный байесовский классификатор f: B↦ C = {i}k − 1i = 0, где {0, 1}m⊇ B = lN∈ Wlw(μ)|w∈ W} — множество представлений всех возможных сообщений составленных на языке W в виде мешка слов, δw — мера Дирака, δx(A) = {1,x∈ A,0,x∉ A..

При этом процесс классификации происходит следующим образом

  1. Сформировать базовый классификатор с априорными вероятностями классов p(c∈ C) = 1k и условными вероятностями слов p(w∈ W|c∈ C) = 1m;
  2. Для каждого поступившего сообщения μi и его класса ci
    1. Получить предсказание ^ci по μi с использованием текущего классификатора;
    2. Обновить классификатор с использованием сообщения μi и настоящего значения его класса ci.

Формат входных данных

Первая строка входного файла содержит натуральные числа n, m, k — количество сообщений, мощность языка и количество классов соответственно. В каждой их следующих n строк содержится m чисел 0 или 1 и одно натуральное число ci — представление сообщения в виде мешка слов и значение его класса.

Формат выходных данных

Выходной файл должен содержать n натуральных чисел — предсказанное значение класса каждого сообщения на момент его получения.

Ограничения

10⩽ n⩽ 7500

8⩽ m⩽ 100

2⩽ k⩽ 10

Примеры тестов

Стандартный вход Стандартный выход
1
10 8 2
0 1 1 1 1 0 0 1 1
1 0 1 0 0 1 0 0 0
1 1 1 1 1 0 1 0 1
1 0 1 0 0 1 0 1 0
0 1 0 1 1 1 1 0 1
1 0 1 0 0 1 0 0 0
0 1 0 1 1 0 0 1 1
1 0 0 0 0 1 0 1 0
1 1 1 1 0 1 1 1 0
0 1 0 1 1 0 0 0 1
0
0
1
0
1
0
1
0
1
1

Задача 03B. Байесовский классификатор

Входной файл:input.txt   Ограничение времени:2 сек
Выходной файл:output.txt   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть задано вещественное пространство Rn. Требуется написать программу, классифицирующую точки с использованием байесовского классификатора B(x) = arg maxi = 0,m − 1(πi fNk(μi, Σi)(x)m − 1j = 0,i≠ jλi,j), где m — количество классов, πi — априорная вероятность класса, fNk(μi, Σi) — функция плотности многомерного нормального распределения Nk(μi, Σi) со средним μi и матрицей ковариации Σi, λi,j — штраф за ошибочною классификацию класса i в качестве класса j.

Формат входного файла

Первая строка входного файла содержит натуральные числа n, m, k, l — размерность пространства, количество классов, количество элементов обучающей и тестовой выборок соответственно. Далее следуют значения матрицы λm строк по m натуральных чисел. Далее следуют k строк обучающей выборки в формате xi,0, xi,1, …, xi,n − 1, ci, где xi,j вещественные числа — координаты точки i, ci{0,1,…,m − 1} — класс точки. Последние l строк содержат по n вещественных чисел — координаты точек тестовой выборки.

Формат выходного файла

Выходной файл должен содержать l целых чисел — предсказанные классы точек тестовой выборки.

Ограничения

n{2, 3}

2 ⩽ m ⩽ 9

2 ⩽ k, l ⩽ 103

1 ⩽ λi,j ⩽ 5

Примеры тестов

Входной файл (input.txt) Выходной файл (output.txt)
1
2 2 6 2
0 1
1 0
1 1 0
1 2 0
2 1 0
-1 -1 1
-1 -2 1
-2 -1 1
2 2
-2 -2
0 1

Задача 04A. Метод ближайших соседей. Основы

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать следующие функцию на языке Python.


def knn_predict_simple(X, y, x, k)     # array of pairs -- class and number of votes of neighbors

X — двумерный np.array — обучающая выборка

y — реальные значения классов в обучающей выборке

x — одномерный np.array-- тестовый пример

k — количество соседей, которые нужно рассматривать

Функция возвращает массив пар (класс, количество голосов) только для классов которые встречаются среди k ближайших соседей!

Для поиска ближайшего примера использовать евклидово расстояние.

Формат выходных данных

Код должен содержать только реализацию функции.


Задача 04B. Leave-one-out (метод скользящего контроля)

Входной файл:Стандартный вход   Ограничение времени:10 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать функцию leave-one-out score на языке Python. Результат функции должен быть целочисленным, то есть его НЕ следует нормировать на размер выборки.


def loo_score(predict, X, y, k)     # integer loo score for predict function

predict — функция predict(X, y, x, k) , обучающая некоторый алгоритм на выборке X, y с параметром k и дающая предсказание на примере x

X — двумерный np.array — обучающая выборка

y — реальные значения классов в обучающей выборке

k — количество соседей, которые нужно рассматривать

Формат выходных данных

Код должен содержать только реализацию функции.


Задача 04C. Border ratio

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть на некотором наборе точек X = {xi}ni = 1xiRm задана функция f: RmN. Требуется написать программу, вычисляющую значение border ratio α(x) =  − y2∥ x − y2, ∀ x∈ X, где y = arg miny∈ X, f(x)≠ f(y)∥ x − y2 = arg min∈ X, f(x) = f() − y2.

Формат входных данных

Первая строка входного файла содержит натуральные числа n, m — количество точек и размерность пространства соответственно. В следующих n строках содержится m вещественных чисел и одно натуральное число — координаты точки и значение функции в этой точке.

Формат выходных данных

Выходной файл должен содержать n вещественных чисел — значения border ratio каждой точки с точностью не менее трёх знаков после запятой.

Ограничения

6⩽ n⩽ 1500

2⩽ m⩽ 50

Примеры тестов

Стандартный вход Стандартный выход
1
6 2
0 0 0
0 2 1
1 2 0
4 2 1
3 0 1
4 0 0
0.5 1.0 1.0 0.5 1.0 1.0
2
10 2
0 0 0
0 2 0
4 2 0
6 2 0
4 4 1
6 1 1
6 6 1
0 5 2
0 6 2
0 7 2
0.6 1.0 1.0 1.0 1.0 1.0 0.25 1.0 0.75 0.6

Задача 05A. Entropy

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке Python функцию, вычисляющую значение энтропии заданной выборки.

entropy(y) =  − v = set(y)p(v)log p(v)

где set(y) — множество уникальных значений вектора y.


import numpy as np

def entropy(y: np.ndarray) -> float:
    """Computes entropy value for labels `y`.
    
    Arguments:
        y: 1d array of integers, sample labels
        
    Returns:
        float, entropy value for labels `y`"""
    pass

Функция принимает единственный параметр y — одномерный np.array, значения классов в обучающей выборке.

При решении задачи следует использовать натуральный логарифм.

Формат выходных данных

Код должен содержать только реализацию функции. Запрещено пользоваться любыми готовыми реализациями вычисления функции entropy.


Задача 05B. Gini

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке Python функцию, вычисляющую значение gini impurity заданной выборки.

gini(y) = 1 − v = set(y)p2(v)

где set(y) — множество уникальных значений вектора y.


import numpy as np

def gini(y: np.ndarray) -> float:
    """Computes gini impurity value for labels `y`.
    
    Arguments:
        y: 1d array of integers, sample labels
        
    Returns:
        float, gini impurity value for labels `y`"""
    pass

y — одномерный np.array — значения классов в выборке

Формат выходных данных

Код должен содержать только реализацию функции. Запрещено пользоваться любыми готовыми реализациями вычисления функции gini.

Примеры тестов

Стандартный вход Стандартный выход
1
3 2 4 4 2 0 1 3 0 1
0.8

Задача 05C. Decision tree split

Входной файл:Стандартный вход   Ограничение времени:10 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать следующие функцию на языке Python.


def tree_split(X, y, criterion)   # col, row of best split

X — двумерный np.array — обучающая выборка

y — одномерный np.array — значения классов в обучающей выборке

criterion — строковое значение — вид критерия 'var', 'gini' или 'entropy'

tree_split должен возвращать номер признака и номер значения из обучающей выборки, которое будет использоваться в качестве порогового

Таким образом, tree_split возвращает наилучшее бинарное разделение по правилу вида xcol ≤ X[row, col]

Формат выходных данных

Код должен содержать только реализацию функции.


Задача 06A. Kernel trick

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть заданы 4 набора точек: squares, circles, moons, spirals, которые можно скачать здесь.

Требуется на языке Python реализовать 4 функции, преобразующие соответствующие наборы точек так, чтобы они были идеально разделимы линейным методом опорных векторов, а именно sklearn.svm.SVC(kernel='linear').


import numpy as np

def transform_squares(X: np.ndarray) -> np.ndarray:
    pass

def transform_circles(X: np.ndarray) -> np.ndarray:
    pass

def transform_moons(X: np.ndarray) -> np.ndarray:
    pass

def transform_spirals(X: np.ndarray) -> np.ndarray:
    pass

При решении задачи запрещено использовать условные операторы и операторы сравнения.

Формат входных данных

Каждая функция принимает двумерный np.array, имеющий размеры (1200, 2). Функции проверяются в порядке их определения в задаче.

Формат выходных данных

Результатом работы функции должен являться двумерный массив преобразованных точек, имеющий тот же размер, что и исходный.


Задача 06B. Многомерный театр теней

Входной файл:Стандартный вход   Ограничение времени:2 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Спектакль многомерного театра теней проходит следующим образом

Театр существует уже очень давно, поэтому руководство приказало изменить спектакль, чтобы привлечь больше зрителей. Так как актёры не хотят изучать новые действия, было принято решение изменить их расположение относительно экрана с номером k, то есть те, кто находился за экраном, должны теперь оказаться перед ним, и наоборот. Однако при этом положение актёров относительно других экранов должно остаться прежним. Театр обратился к Вам с этой задачей, но скрыл расположение экранов, чтобы избежать раскрытия всех секретов спектакля, согласившись лишь предоставить информацию о том, с какой стороны экранов находится каждый из актёров. Работа будет принята, если правила расположения будут нарушены не более чем у 5% актёров.

Формат входных данных

Первая строка входного файла содержит натуральные числа n, m, l, k — количество актёров, размерность пространства, количество экранов и индекс, для которого нужно изменить расположение. В следующих n строках содержится по m вещественных чисел — текущее положение актёра, и l чисел 0 или 1 — положение актёра относительно экрана.

Формат выходных данных

Выходной файл должен содержать n строк по m вещественных чисел — новые положения актёров. Так как размер файла может оказаться очень большим, числа необходимо выводить не более чем с тремя знаками после запятой.

Ограничения

25⩽ n⩽ 7500

10⩽ m⩽ 175

2⩽ l⩽ 5

0⩽ k < l

Примеры тестов

Стандартный вход Стандартный выход
1
25 10 2 0
-0.2 -3.2 -0.5  0.5 -1.6 -3.1  1.0  3.6  2.1 -3.3 1 1
 0.6 -3.0  0.5  0.7 -0.9 -3.4  3.5  2.9  3.8 -2.9 1 1
-0.3 -2.1 -0.3  0.7 -0.4 -3.5  3.7  1.0 -2.8 -2.5 0 1
 0.8 -4.0  0.3 -0.6 -0.0 -3.4  2.6 -3.4 -2.3  1.8 0 0
 0.8 -1.9 -0.2  0.8 -1.4 -2.0  2.1  3.6 -3.3 -3.1 0 1
 0.5 -3.4 -1.2 -1.0  0.2 -2.7  2.9 -2.1  2.9  3.1 1 0
-0.5 -3.6  2.2 -0.2 -1.0 -2.4  2.8 -5.0  3.0  3.0 1 0
 0.6 -1.1 -0.1  0.8 -1.9 -3.2  1.8  2.2 -1.1 -2.6 0 1
-0.6 -5.7 -1.4  0.3  0.6 -2.9  3.8 -7.1  3.0 -0.0 1 0
 0.3 -3.5 -0.4  0.9 -0.3 -2.9  1.8  2.6 -3.3 -2.6 0 1
 0.6 -2.8 -0.6 -0.2  0.1 -3.8  3.6 -2.6  3.8  2.3 1 0
-1.2 -2.5 -0.0  1.6  0.1 -2.9  4.1 -2.2 -3.0  2.3 0 0
-0.1 -2.9  2.5  0.3 -0.2 -1.4  4.6  3.7 -5.4 -2.9 0 1
-0.6 -3.4  0.8  0.2  0.8 -3.6  3.8 -3.4  3.4  2.1 1 0
 1.1 -3.0  0.1 -0.2 -1.1 -3.7  4.6  2.1  4.3 -2.8 1 1
-1.4 -2.2 -1.5  1.4  0.3 -2.7  3.7 -3.3 -3.7  4.8 0 0
-0.7 -2.5 -0.8  0.4 -0.2 -1.9  3.7 -2.3 -3.4  3.4 0 0
-0.6 -2.5  0.4 -0.8  1.9 -2.7  4.3  3.9 -3.7 -3.1 0 1
-2.0 -5.1 -0.9  2.1  1.4 -3.9  1.6 -4.9  2.1  2.0 1 0
-0.6 -2.1 -1.2  1.3  1.1 -2.6  1.0  3.2  1.9 -2.7 1 1
 0.7 -2.8  1.5  0.1 -0.8 -3.9  4.4 -2.3  4.2  2.4 1 0
 0.0 -3.5 -0.3  1.3  0.8 -0.4  2.8  2.3  2.4 -3.1 1 1
-0.4 -2.5 -2.0  0.1 -0.7 -3.8  4.6 -2.0 -4.0  2.4 0 0
 0.0 -3.1  0.3  1.2  0.0 -0.7  4.3 -3.5 -5.2  2.4 0 0
 0.1 -2.1  0.2 -0.0  0.3 -2.1  2.8  1.2 -3.4 -2.3 0 1
 0.7 -1.6 -0.3  0.6 -2.3 -3.4  1.5  3.2 -1.0 -3.4
 1.6 -1.0  0.7  0.9 -1.8 -3.7  4.2  2.4  0.1 -3.0
-0.6 -2.7 -0.4  0.6 -0.1 -3.4  3.5  1.2 -1.6 -2.5
 0.7 -4.2  0.3 -0.6  0.1 -3.4  2.5 -3.3 -1.8  1.8
 0.4 -2.7 -0.3  0.7 -1.0 -1.9  1.8  3.8 -1.8 -3.1
 1.4 -1.7 -1.0 -0.8 -0.6 -3.0  3.5 -2.5 -0.4  3.0
 0.4 -2.0  2.4 -0.1 -1.7 -2.7  3.3 -5.4 -0.1  2.9
 0.5 -1.3 -0.1  0.8 -1.8 -3.2  1.7  2.3 -0.6 -2.6
 0.5 -3.6 -1.2  0.5 -0.4 -3.3  4.5 -7.6 -0.9 -0.1
 0.1 -3.9 -0.4  0.9 -0.1 -2.8  1.7  2.7 -2.6 -2.6
 1.6 -1.0 -0.4 -0.0 -0.7 -4.1  4.2 -3.0  0.4  2.2
-1.5 -3.1 -0.1  1.5  0.4 -2.8  3.9 -2.0 -1.8  2.3
-0.8 -4.3  2.4  0.2  0.4 -1.2  4.1  4.0 -2.8 -2.9
 0.4 -1.5  1.0  0.4 -0.1 -3.9  4.4 -3.9 -0.2  2.0
 2.1 -1.0  0.3 -0.0 -2.0 -4.0  5.3  1.6  0.5 -2.9
-1.9 -3.1 -1.6  1.3  0.7 -2.5  3.4 -3.1 -2.0  4.8
-1.1 -3.3 -0.9  0.3  0.2 -1.8  3.4 -2.1 -1.9  3.4
-0.9 -3.0  0.3 -0.8  2.1 -2.6  4.1  4.0 -2.7 -3.1
-0.9 -3.1 -0.7  2.3  0.5 -4.3  2.3 -5.4 -1.7  1.9
 0.3 -0.5 -1.0  1.4  0.4 -2.9  1.5  2.8 -1.2 -2.8
 1.6 -1.0  1.7  0.3 -1.6 -4.2  5.0 -2.7  0.8  2.3
 1.0 -1.6 -0.1  1.5 -0.1 -0.7  3.4  1.8 -1.2 -3.2
-1.0 -3.7 -2.1 -0.0 -0.2 -3.6  4.2 -1.7 -1.8  2.4
-0.8 -4.6  0.1  1.1  0.7 -0.4  3.8 -3.1 -2.4  2.5
-0.3 -2.8  0.1 -0.1  0.6 -2.0  2.6  1.4 -2.0 -2.3

Задача 07A. Canny

Входной файл:input.jpg   Ограничение времени:2 сек
Выходной файл:output.txt   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке Python набор функций, выполняющие этапы применения оператора Кэнни:


import numpy as np

from typing import Tuple


def gaussian_blur(img: np.ndarray, kernel: Tuple[int, int], sigma: float) -> np.ndarray:
    '''Blurs an image using Gaussian filter.

    Arguments:
        img: input image, a 2d np.ndarray.
        kernel: gaussian kernel size.
        sigma: gaussian kernel standard deviation.

    Returns:
        Blurred image, a 2d np.ndarray of the same size and dtype as `img`.
    '''
    pass


def magnitude_and_direction(img: np.ndarray, kernel: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
    '''Applies a filter to the image and computes magnitude and direction of the gradient.
    The filter is applied using 'reflect' mode for border pixels, i.e. dcb|abcd|cba
    
    Arguments:
        img: input image, a 2d np.ndarray.
        kernel: the filter kernel, a 2d np.ndarray with odd dimension sizes.
            The kernel is applied over x dimension, kernel.T is applied over y

    Returns:
        Magnitude and direction of the gradient, two 2d np.ndarray objects of the same size and dtype as `img`.
        The direction values lie in range [0, 2 * pi].
    '''
    pass


def edge_thinning(magnitude: np.ndarray, direction: np.ndarray) -> np.ndarray:
    '''Performs edge thinning step of Canny algorithm using 0°, 45°, 90°, 135°, 180° (=0°) gradient direction 
    as described here https://en.wikipedia.org/wiki/Canny_edge_detector#Gradient_magnitude_thresholding_or_lower_bound_cut-off_suppression.
    If the angle is equally close to two groups, the group with lower angle value is selected.

    Arguments:
        magnitude: magnitude of image gradient, a 2d np.ndarray.
        direction: direction of image gradient, a 2d np.ndarray.

    Returns:
        Boolean mask of suppressed pixels (False if a pixel is suppresed, True if preserved), a 2d np.ndarray of the same size as `magnitude` and dtype bool.
    '''
    pass


def edge_tracking(magnitude: np.ndarray, mask: np.ndarray, low_threshold: float, high_threshold: float) -> np.ndarray:
    '''Performs edge tracking step of Canny algorithm. The thresholds are inclusive.

    Arguments:
        magnitude: magnitude of image gradient, a 2d np.ndarray.
        mask: pixel suppression mask, obtained by edge_thinning function.
        low_threshold: weak pixel threshold.
        high_threshold: strong pixel threshold.

    Returns:
        A 2d np.ndarray of the same size as `magnitude` and dtype bool, representing detected edges.
    '''
    pass

Формат выходного файла

Код решения должен содержать только импортируемые модули, определение и реализацию функций.

Примеры тестов

Входной файл (input.jpg) Выходной файл (output.txt)
1

input.jpg
img = cv.imread('input.jpg') img = cv.cvtColor(img, cv.COLOR_BGR2GRAY).astype(float) blur = gaussian_blur(img, (5, 5), 1) magnitude, direction = magnitude_and_direction(blur, np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]])) mask = edge_thinning(magnitude, direction) edges = edge_tracking(magnitude, mask, 0.1 * np.max(magnitude), 0.2 * np.max(magnitude)) cv.imwrite('sample.png', edges.astype(int) * 255)

sample.png

Задача 07B. Hough Lines

Входной файл:Стандартный вход   Ограничение времени:4 сек
Выходной файл:Стандартный выход   Ограничение памяти:1024 Мб
Максимальный балл:3000  

Условие

Требуется реализовать на языке Python функцию, выполняющую классическое преобразование Хаффа для поиска прямых. Функция должна иметь следующий интерфейс


import numpy as np
from typing import List, Tuple

def hough_lines(
    image: np.ndarray,
    rho: float,
    theta: float,
    threshold: int,
    min_theta: float = 0,
    max_theta: float = np.pi) -> list[tuple[float, float, int]]:
    """Finds lines in a binary image using the standard Hough transform.

    Arguments:
        image: 2d np.ndarray of bool
        rho: distance resolution
        theta: angle resolution
        theshold: only lines with votes > `threshold` are returned
        min_theta: minimal angle value
        max_theta: maximal angle value

    Returns:
        lines: a list of tuples (distance, angle, votes), detected lines sorted by votes in descending order
    """
    pass

При реализации функции сетка по расстоянию должна строиться на интервале [ − (w + h), w + h + rho). При построении аккумулятора голос отдаётся за расстояние, округлённое к ближайшему индексу (round half to even). После построения аккумулятора должна проводиться его фильтрация согласно правилу i,j = {ai,j,ai − 1,jai,j,ai,j − 1ai,j,ai + 1,j⩽ ai,j,ai,j + 1⩽ ai,j0,else..

При решении задачи запрещено использовать любые готовые реализации алгоритма.

Формат входных данных

Аргументы функции:

Формат выходных данных

Функция возвращает список троек (расстояние, угол, количество голосов) для каждой прямой в порядке убывания по количеству голосов.

Ограничения

Гарантируется, что 0⩽ min_theta⩽ max_thetaπ.

Примеры тестов

Стандартный вход Стандартный выход
1

lines.jpg
image = cv2.Canny(cv2.imread('lines.jpg'), 500, 550).astype(bool) print(*(f'{i} {j:.3f} {k}' for i, j, k in hough_lines(image, 1, np.pi / 360, 210)), sep='\n')
 450 0.314 636
 460 0.314 580
 216 0.785 580
-908 2.635 429
 522 2.094 420
 933 1.370 393
 944 1.370 373
 532 2.094 369
 590 2.199 328
 227 0.785 305
-897 2.635 288
-115 2.915 286
1464 0.646 283
  57 1.815 281
 582 2.199 279
  65 1.815 271
 373 1.274 265
  55 1.815 263
 381 1.274 259
  63 1.815 258
-106 2.915 255
-833 2.801 225
-826 2.793 218
-824 2.801 218
-817 2.793 217
1475 0.646 212

Задача 07C. Hough Circles

Входной файл:Стандартный вход   Ограничение времени:3 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:3000  

Условие

Требуется реализовать на языке Python функцию, выполняющую преобразование Хаффа для поиска окружностей. Функция должна иметь следующий интерфейс


import numpy as np
from typing import List, Tuple

def hough_circles(
    image: np.ndarray,
    accumulator_resolution: float,
    min_distance: int,
    canny_threshold: int,
    center_threshold: int,
    radius_threshold: int,
    min_radius: int,
    max_radius: int) -> List[Tuple[float, float, float, int]]:
    """Finds circles in a gray image using Hough transform
    
    Arguments:
        image: 2d np.ndarray of float
        accumulator_resolution: step size for accumulators
        min_distance: minial distance between circle centers
        canny_threshold: upper threshold for Canny edge detector
        center_threshold: minimal number of votes for a center to be accepted
        radius_threshold: minimal number of votes for a radius to be accepted
        min_radius: minimal circle radius
        max_radius: maximal circle radius
        
    Returns:
        circles: a list of tuples (x, y, radius, votes), detected circles sorted by votes in descending order
    """
    pass

При построении аккумуляторов, голос отдаётся за индекс, округлённый к ближайшему целому (rounding half to even).

После построения аккумулятора для центров окружностей должна проводиться его фильтрация согласно правилу i,j = {ai,j,ai − 1,jai,j,ai,j − 1ai,j,ai + 1,j⩽ ai,j,ai,j + 1⩽ ai,j0,else..

При выборе радиуса окружности лучшим считается такой радиус r с количеством голосов c, для которого частное cr является максимальным.

При решении задачи запрещено использовать любые готовые реализации алгоритма.

Формат входных данных

Аргументы функции:

Формат выходных данных

Функция возвращает список четвёрок (x, y, радиус, количество голосов) для каждой окружности в порядке убывания по количеству голосов.

Примеры тестов

Стандартный вход Стандартный выход
1

circles.png
image = cv2.cvtColor(cv2.imread('circles.png'), cv2.COLOR_BGR2GRAY) print(*(f'{x} {y} {r} {c}' for x, y, r, c in hough_circles(image, 1, 50, 250, 50, 50, 50, 250)), sep='\n')
301 217 203 143
216 163 100 139
384 273 101 138
352 135 101 131
246 305 100 126

Задача 08A. OneRule boosting

Входной файл:Стандартный вход   Ограничение времени:2 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Пусть имеется задача классификации f(x) = yxNny{0,1}. Требуется написать программу, строящую классификатор методом градиентного бустинга, используя в качестве базовой модели OneRule регрессор. Получаемый классификатор имеет вид F(x) = 11 + e − H(x), где H(x) = h0 + ki = 1hi(x), 1⩽ k⩽ n, h0 — независимое приближение, hi обученные OneRule регрессоры. В качестве функции ошибки используется L(y, F(x)) =  − (ylog(F(x)) + (1 − y)log(1 − F(x))).

При построении классификатора необходимо использовать следующий алгоритм

Входные данные:

Алгоритм:

  1. Обозначить
  2. Вычислить независимое приближение h0 = log|{yj|yj∈ y,yj = 1}||{yj|yj∈ y,yj = 0}|;
  3. Обозначить H0(x) = h0F0(x) = 11 + e − H0(x);
  4. Для каждого i = 0, k − 1
    1. Вычислить остатки ri,j =  − ∂ L(yj, Fi(Xj))∂ F(Xj) = yj − Fi(Xj), j = 1,m;
    2. Обучить OneRule регрессоры на остатках, R = {{trt |t∈ Tl,rt = {ri,j|Xj,l = t}} | l∈ I};
    3. Выбрать лучший регрессор h = arg minh∈ R{mj = 1(ri,j − h(xj))2m};
    4. Обозначить
      • hi + 1 = {tsum(rt)sum(Pt)|(t, rt)∈ h,Pt = {Fi(Xj)(1 − Fi(Xj))|Xj,l = t}};
      • Hi + 1(x) = Hi(x) + hi + 1(x);
      • Fi + 1(x) = 11 + e − Hi + 1(x);
      • I = I{l}, где l — номер признака, на котором был обучен лучший регрессор;
  5. Fk — искомый классификатор

Формат входных данных

Первая строка входного файла содержит натуральные числа m,n,k — количество примеров, признаков и базовых регрессоров соответственно. В следующих m строках содержится n + 1 целое число — значения признаков и номер класса примера. Гарантируется, что уникальные значения каждого признака образуют множество {i|i0,s − 1}.

Формат выходных данных

Первая строка выходного файла должна содержать независимое приближение h0. В следующих k строках необходимо вывести описания базовых регрессоров — номер признака, на котором был обучен регрессор, и список предсказываемых регрессором значений в порядке возрастания значения признака. Вещественные числа необходимо вывести с точностью не менее трёх знаков после запятой.

Ограничения

10⩽ m⩽ 1750

5⩽ n⩽ 6034n⩽ k⩽ n

3⩽ s50

Примеры тестов

Стандартный вход Стандартный выход
1
10 4 4
2 0 0 0 1
1 2 0 0 0
2 2 0 1 1
0 2 1 0 1
2 0 1 0 1
0 2 0 0 1
0 1 1 0 1
0 2 0 1 0
1 0 0 0 0
1 0 0 1 0
0.405
0 0.625 -2.5 1.667
3 0.813 -1.88
2 -0.113 1.14
1 -0.56 1.05 0.26

Задача 09A. Dense

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке Python класс, описывающий полносвязный слой нейронной сети:


import numpy as np
from typing import Optional, Tuple, Union

class Dense:
    """Implements fully-connected layer"""

    def __init__(self, n_in: int, n_out: int, use_bias: bool = True):
        """Initializes Dense layer.
        The weights are initialized using uniformly distributed values in range [-1, 1]. Bias vector is not initialized if `use_bias` is False.
        Weigths matrix has the shape (`n_in`, `n_out`), bias vector has the shape (`n_out`, ).
        
        Arguments:
            n_in: Positive integer, dimensionality of input space.
            n_out: Positive integer, dimensionality of output space.
            use_bias: Whether the layer uses a bias vector."""
        pass

    @property
    def weights(self) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray]:
        """Returns weights used by the layer."""
        pass

    @property
    def input(self) -> np.ndarray:
        """Returns the last input received by the layer"""
        pass
    
    def __call__(self, x: np.ndarray) -> np.ndarray:
        """Performs the layer forward pass.

        Arguments:
            x: Input array of shape (`batch_size`, `n_in`)

        Returns:
            An array of shape (`batch_size`, `n_out`)"""
        pass

    def grad(self, gradOutput: np.ndarray) -> tuple[np.ndarray, tuple[np.ndarray, np.ndarray]] | tuple[np.ndarray, tuple[np.ndarray]]:
        """Computes layer gradients

        Arguments:
            gradOutput: Gradient of loss function with respect to the layer output, an array of shape (`batch_size`, `n_out`).

        Returns:
            A tuple object:
                Gradient of loss function with respect to the layer input, an array of shape (`batch_size`, `n_in`)
                Gradient of loss function with respect to the layer's weights:
                    An array of shape (`n_in`, `n_out`).
                    Optional array of shape (`n_out`, )."""
        pass

Для реализации класса разрешено использовать только модуль numpy.

Формат выходных данных

Код решения должен содержать только импортируемые модули, определение и реализацию класса.


Задача 09B. Activations

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:18  

Условие

Требуется реализовать на языке Python классы, описывающие различные функции активации:


import numpy as np


class Activation:
    """Base activation class"""

    def __init__(self):
        self._input = None

    @property
    def input(self):
        """Returns the last input received by the activation"""
        return self._input

    def __call__(self, x: np.ndarray) -> np.ndarray:
        """Computes activation output
        
        Arguments:
            x: Input array of shape (`batch_size`, ...)

        Returns:
            An array of the same shape as `x`"""
        raise NotImplementedError()

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        """Computes loss gradient with respect to the activation input.
        
        Arguments:
            gradOutput: Gradient of loss function with recpect to the activation output.
                An array of the same shape as the array received in `__call__` method.

        Returns:
            An array of the same shape as `gradOutput`"""
        raise NotImplementedError()
    

class ReLU(Activation):
    """Implements ReLU activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class LeakyReLU(Activation):
    """Implements LeakyReLU activation layer"""

    def __init__(self, slope: float = 0.03):
        """Initializes LeakyReLU layer.

        Arguments:
            slope: the slope coeffitient of the activation."""
        pass

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class GeLU(Activation):
    """Implements GeLU activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class SiLU(Activation):
    """Implements SiLU (swish) activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class Softplus(Activation):
    """Implements Softplus (SmoothReLU) activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class ELU(Activation):
    """Implements ELU activation layer"""

    def __init__(self, alpha: float = 1):
        """Initializes ELU layer.

        Arguments:
            alpha: the alpha coeffitient of the activation."""
        pass

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class Sigmoid(Activation):
    """Implements Sigmoid activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class Tanh(Activation):
    """Implements Tanh activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass


class Softmax(Activation):
    """Implements Softmax activation layer"""

    def __call__(self, x: np.ndarray) -> np.ndarray:
        """Computes Softmax activation output
        
        Arguments:
            x: Input array of shape (`batch_size`, `n_features`)

        Returns:
            An array of the same shape as `x`"""
        pass

    def grad(self, gradOutput: np.ndarray) -> np.ndarray:
        pass

Функции активации тестируются в порядке их определения в задаче циклично, то есть activation_idx = (test_idx − 1mod 9.

Формат выходных данных

Код решения должен содержать только импортируемые модули, определение и реализацию классов.


09C. Conv2D

Входной файл:Стандартный вход  
Выходной файл:Стандартный выход  

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


import numpy as np

class Conv2D:
    """Implements 2d convolution layer"""
    
    def __init__(self, 
             n_in: int,
             n_out: int,
             kernel_size: tuple[int, int],
             strides: tuple[int, int] = (1, 1),
             padding: str = 'valid',
             use_bias: bool = True,
             dilations: tuple[int, int] = (1, 1)
        ):
        """Initialized Conv2D layer.
        The weights are initialized using uniformly distributed values in range [-1, 1]. Bias vector is not initialized if `use_bias` is False.
        Weights tensor has the shape (`kernel_size[0]`, `kernel_size[1]`, `n_in`, `n_out`), bias vector has the shape (`n_out`, ).

        Arguments:
            n_in: Positive integer, dimensionality of input space.
            n_out: Positive integer, dimensionality of output space.
            kernel_size: Pair of positive integers, convolution kernel dimensions.
            strides: Pair of positive integers, convolution strides along each dimension.
            padding: Either 'valid' or 'same', padding to be used by the layer, see explanation below.
            use_bias: Whether the layer uses a bias vector.
            dilations: Pair of positive integers, convolution kernel dilations along each dimension.

        Padding:
            'valid': no padding is applied.
            'same': padding along every dimension is computed as follows
                if dimension_size % stride == 0:
                    total_pad = max((kernel_size - 1) * dilation + 1 - stride)
                else:
                    total_pad = max((kernel_size - 1) * dilation + 1 - dimension_size % stride)
                pad_before = total_pad // 2
                pad_after = total_pad - pad_before"""
        pass

    @property
    def weights(self) -> tuple[np.ndarray, np.ndarray] | tuple[np.ndarray]:
        """Returns weights used by the layer. Weight tensor and bias vector if use_bias is True"""
        pass

    def __call__(self, x: np.ndarray) -> np.ndarray:
        """Performs the layer forward pass.

        Arguments:
            x: Input array of shape (`batch_size`, `height`, `width`, `n_in`).

        Returns:
            An array of shape (`batch_size`, `new_height`, `new_width`, `n_out`)."""
        pass

    def grad(self, x: np.ndarray, gradOutput: np.ndarray) -> tuple[np.ndarray, tuple[np.ndarray, np.ndarray] | tuple[np.ndarray]]:
        """Computes layer gradients

        Arguments:
            gradOutput: Gradient of loss function with respect to the layer output, an array of shape (`batch_size`, `new_height`, `new_width`, `n_out`).

        Returns:
            A tuple object:
                Gradient of loss function with respect to the layer input, an array of shape (`batch_size`, `height`, `width`, `n_in`)
                Gradient of loss function with respect to the layer's weights:
                    An array of shape (`kernel_size[0]`, `kernel_size[1]`, `n_in`, `n_out`).
                    Optional array of shape (`n_out`, )."""
        pass

Для реализации класса разрешено использовать только модуль numpy.

Формат выходных данных

Код решения должен содержать только импортируемые модули, определение и реализацию класса.


Задача 10A. Устный экзамен

Максимальный балл:10   Ограничение времени:1 сек
  Ограничение памяти:512 Мб

Условие

Билет выбирается независимо и случайно из следующего списка:

Генетический алгоритм.
  • Многопараметрическая оптимизация. Доминантность и оптимальность по Парето.
  • Функция качества (fitness).
  • Общая идея генетического алгоритма.
  • Представление особи.
  • Методы селекции: пропорционально качеству, stochastic universal sampling, с наследием, турнирная, элитизм.
  • Методы кроссовера: 1,2,k-точечный, равномерный, для перестановок.
  • Мутация. Влияние на скорость обучения.
  • Управление популяцией. Сегрегация, старение, распараллеливание.
Обобщённые линейные модели.
  • Сигмоида и логит.
  • Метод наибольшего правдоподобия.
  • Логистическая регрессия. Вариант для меток -1, 1.
  • Функции связи. Регрессия Пуассона.
Байесовский классификатор.
  • Условная вероятность. Теорема Байеса.
  • Наивный классификатор.
  • Оценка функции плотности.
  • Мультиномиальный классификатор, сглаживание оценок. Классификация спама.
  • Гауссовый байесовский классификатор.
Метод k ближайших соседей.
  • Базовая идея. Классификатор k-NN. Преимущества и недостатки.
  • Кроссвалидация методом "без одного" (leave-one-out).
  • Показатель пограничности (Border ratio).
  • Понятия выброса, прототипа, усвоенной точки. Алгоритм Харта.
  • Регрессия методом k-NN.
  • Взвешенные соседи.
  • Эффективные методы поиска ближайших соседей (краткое описание).
Кластеризация.
  • Постановка задачи кластеризации.
  • Метод k-средних (K-means). Выбор начального состояния.
  • Алгоритмы, основанные на плотности, основная идея. DBSCAN, OPTICS.
Деревья решений.
  • Понятие энтропии, определение информации по Шеннону.
  • Понятие дерева решений. Процесс обучения.
  • Gini impurity, information gain.
  • Случайный лес (Random forest).
  • Bagging, выборка признаков.
  • Дерево регрессии.
  • Сокращение дерева (pruning).
Бустинг (Boosting).
  • Понятие бустинга.
  • Градиентный бустинг.
  • OneRule Boosting.
  • Adaboost.
  • Бустинг деревьев.
Метод опорных векторов (SVM)
  • Постановка задачи линейного SVM для линейно разделимой выборки.
  • Линейный SVM в случае линейно неразделимой выборки.
  • Задача оптимизации SVM. Двойственная задача.
  • Kernel trick. Виды ядер.
Классическое машинное зрение.
  • Фильтрация изображений. Sobel, Gauss.
  • Алгоритм детекции границ Canny.
  • Алгоритм Хаффа поиска прямых (Hough lines).
  • Алгоритм Хаффа поиска окружностей (Hough circles).
Нейронные сети.
  • Полносвязный слой. (Dense, Fully connected).
  • Свёрточный слой. (Convolution).
  • Pooling.
  • Функции активации.
  • Метод обратного распространения ошибки.

Экзамен проводится очно. В случае невозможности очного присутствия необходимо заранее договориться с преподавателем о дистанционной сдаче.

После взятия билета студент готовится в ответу. При подготовке можно использовать произвольные материалы и доступ в Интернет.

В докладе необходимо максимально кратко упомянуть все важные элементы доставшейся темы/вопроса. После доклада преподаватель задаёт несколько уточняющих вопросов. Время на ответ 10 минут + 5 минут на вопросы.


1.052s 0.012s 81