{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Домашнее задание №2\n", "\n", "В общем итоге необходимо реализовать 10 функций:\n", "- Матрица Вандермонда;\n", "- Максимальный остаток;\n", "- Обработка данных (5 функции):\n", " 1. Чистка данных;\n", " 2. Вычисление mean и std;\n", " 3. Нормализация;\n", " 4. Масштабирование;\n", " 5. Нормирование;\n", "- Заполнение матрицы (3 функции):\n", " 1. Крест;\n", " 2. Квадрат;\n", " 3. Шахматная доска\n", "\n", "```{warning}\n", "Ни одна из этих функций не должна содержать в себе циклов.\n", "```\n", "\n", "## Матрица Вандермонда\n", "\n", "Для заданного набора чисел $x = \\{x_i, i=1,..,n\\}$ [определитель Вандермонда](https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_%D0%92%D0%B0%D0%BD%D0%B4%D0%B5%D1%80%D0%BC%D0%BE%D0%BD%D0%B4%D0%B0) --- определитель следующей матрицы.\n", "\n", "$$\n", "\\begin{pmatrix}\n", "1 & x_1 & \\cdots & x_1^{n-1} \\\\\n", "1 & x_2 & \\cdots & x_2^{n-1} \\\\\n", "\\vdots & \\vdots & \\ddots & \\vdots \\\\\n", "1 & x_n & \\cdots & x_n^{n-1}\n", "\\end{pmatrix}. \n", "$$\n", "\n", "Метод [np.vander](https://numpy.org/doc/stable/reference/generated/numpy.vander.html?highlight=vander#numpy.vander) принимает на вход массив `x` и возвращает матрицу Вандермонда, но в зеркальном отражении относительно вертикальной оси.\n", "\n", "Реализовать функцию `vander`, принимающую на вход набор чисел `x` в виде массива `ndarray` и возвращающую матрицу Вандермонда для этого набора чисел именно в таком виде, в каком она представлена выше. \n", "\n", "```python\n", "def vander(x):\n", " ...\n", "```\n", "```{warning}\n", "Ваша функция не должна содержать вызовов функции `np.vander`.\n", "```\n", "\n", "## Максимальный остаток\n", "\n", "Рассмотрим набор целых чисел $x = \\{x_i \\in \\mathbb{N}, i=1,..,n\\}$. Пусть $mod_{ij}$ --- остаток от деления $x_i$ на $x_j$. Найти максимальный такой остаток.\n", "\n", "```python\n", "def largest_mod(x):\n", " ...\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Обработка данных\n", "\n", "Представим себе эксперимент, в котором измеряется $m$ величин $x_i$ в моменты времени $t_i, i=1,...,n$. Будем считать, что все измерения поступают нам в виде матрицы `X` (двумерный массив `ndarray`) размера $n \\times m$, $j$-й столбец которой соответствует измеряемой величине $x_j$, а $i$-я строка --- моменту времени $t_i$, т.е. `X[i, j]` --- измерение величины $x_j$ в момент времени $t_i$.\n", "\n", "### 1. Чистка данных\n", "\n", "Допустим, что если измерение $X_{ij}$ (измерение $x_j$ при $t=t_i$) не удалось произвести, то в массив попадает значение `X[i, j] = np.nan`. Ваша задача реализовать процедуру чистки таблицы `X` от всех строк, в которых есть хотя бы один `np.nan`.\n", "\n", "```python\n", "def clear(X):\n", " ...\n", " \n", " \n", "X = np.array([[0, 1, 2], [1, np.nan, 2], [np.nan, np.nan, np.nan], [-1, -2, -3]])\n", "print(clear(X)) # [[0, 1, 2], [-1, -2, -3]]\n", "```\n", "\n", "```{tip}\n", "Вам могут помочь функции [np.isnan](https://numpy.org/doc/stable/reference/generated/numpy.isnan.html), [np.any](https://numpy.org/devdocs/reference/generated/numpy.any.html) и [np.all](https://numpy.org/doc/stable/reference/generated/numpy.all.html). \n", "```\n", "\n", "\n", "### 2. Нормализация\n", "\n", "В статистике рассматриваются характеристики таких числовых рядов. Например, среднее величина, среднеквадратичное отклонение, минимальное и максимальное значения, и многие другие.\n", "\n", "В ряде задач удобнее анализировать такие данные, если они находятся в удобном диапазоне. Рассмотрим три подхода, чтобы преобразовать эти данные в удобный диапазон на примере измерений одной величины $x$ в моменты времени $t_i$.\n", "- Рассмотрим новый ряд $y = \\{y_i, i=1,...,n\\}$, который получается их набора $x$ по формуле\n", "\n", "$$\n", "y_i = \\frac{x_i - \\bar{x}}{S}.\n", "$$\n", "Здесь $\\bar{x}$ --- среднее значение чисел $x$, а $S$ --- среднеквадратичное отклонение, которые определяются формулами\n", "\n", "$$\n", "\\bar{x} = \\frac{1}{n}\\sum_{i=1}^n x_i,\n", "$$\n", "\n", "$$\n", "S = \\sqrt{\\frac{1}{n}\\sum_{i=1}^{n} (x_i - \\bar{x})^2}.\n", "$$\n", "\n", "Среднее значение получившегося ряда чисел $y$ заведомо равно 0, а среднеквадратичное отклонение --- единице.\n", "\n", "- Отмасштабируем данные в отрезок $[0, 1]$. Для этого найдем минимальное и максимальное значения $x_{min}$ и $x_{max}$ в $x$ и применим следующее преобразование:\n", "\n", "$$\n", "y_i = \\frac{x_i - x_{min}}{x_{max} - x_{min}}.\n", "$$\n", "\n", "- Представим измерения $x=\\{x_i, i=1,...,n\\}$ в виде вектора и отнормируем его:\n", "\n", "$$\n", "y = \\frac{x}{||x||}.\n", "$$\n", "\n", "Ваша задача реализовать нормализацию данных тремя этими способами сразу для таблицы таких измерений `X`. \n", "\n", " \n", "#### 2.1. Векторная реализации нормализации каждой строки двумерного массива\n", "\n", "##### 2.1.1. Вычисление mean и std\n", "a) Напишите функцию, которая принимает на вход матрицу и возвращает два массива:\n", "- mean --- массив средних значений каждого столбца (`mean[j]` --- среднее столбца исходного массива `X[:, j]`).\n", "- std --- массив среднеквадратичных отклонений каждого столбца (`std[j]` --- среднеквадратичное отклонение строки исходного массива `X[:, j]`).\n", "\n", "\n", "```python\n", "def mean_and_std(X):\n", " n, m = X.shape\n", " # здесь ваш код\n", " return mean, std\n", "```\n", "\n", "```{tip}\n", "Обратите внимание на аргумент axis функции [np.sum](https://numpy.org/doc/stable/reference/generated/numpy.sum.html#numpy.sum).\n", "```\n", "\n", "```{warning}\n", "Ваша функция не должна содержать вызовов функций `np.mean` и `np.std`.\n", "```\n", "##### 2.1.2. Нормализация\n", "Дополнить предыдущий пример, реализовав функцию `process`, которая принимает на вход массив `X` и возвращает массив `Y`, у которого столбец `Y[:, j]` представляет из себя нормализацию столбца `X[:, j]`.\n", "\n", "```python\n", "def process(X):\n", " ...\n", "```\n", "```{warning}\n", "Ваша функция может содержать вызов функции `stat2d` или вызывать библиотечные функции `np.mean` и `np.std`.\n", "```\n", "\n", "#### 2.2. Векторная реализация масштабирования каждой строки двумерного массива\n", "\n", "Реализуйте функцию `scale`, которая принимает на вход массив `X` и возвращает массив `Y`, такой, что каждый его столбец `Y[:, j]` представляет отмасштабированный столбец `X[:, j]` в отрезок $[0, 1]$.\n", "\n", "```python\n", "def scale(X):\n", " ...\n", "```\n", "\n", "```{warning}\n", "Разрешается использовать функции `np.min` и `np.max`.\n", "```\n", "\n", "#### 2.3 Векторная реализация нормирования \n", "\n", "Реализуйте функции `normalize`, нормирующую все столбцы матрицы.\n", "```python\n", "def normalize(X):\n", " ...\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Заполнение матриц\n", "\n", "\n", "### Крест\n", "\n", "Реализовать функцию, которая создать матрицу заданного размера $n$, элементы которой определяются следующим образом\n", "\n", "$$ \n", "\\begin{cases}\n", "a_{ij} = 1, \\quad m < i \\leq n - m \\text{ или } m < j \\leq n - m \\\\\n", "a_{ij} = 0, \\quad \\text{ иначе}.\n", "\\end{cases} \n", "$$\n", "\n", "Размер матрицы определяется параметром `n`, размер нулевых квадратов по углам параметром `m`. При `n=6` и `m=2` матрица должна выглядеть следующим образом.\n", "\n", "$$\n", "\\begin{equation}\n", "\\begin{pmatrix}\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "1 & 1 & 1 & 1 & 1 & 1 \\\\\n", "1 & 1 & 1 & 1 & 1 & 1 \\\\\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "\\end{pmatrix}.\n", "\\end{equation}\n", "$$\n", "\n", "```python\n", "def cross(n, m):\n", " ...\n", "```\n", "\n", "```{note}\n", "Для удобства можно считать, что `m < n` и оба они четны. \n", "```\n", "\n", "### Квадрат\n", "\n", "Реализовать функцию, которая создаёт матрицу заданного размера $n$, элементы которой определяются следующим образом\n", "\n", "$$ \\begin{cases}\n", "a_{ij} = 1, \\quad m < i \\leq n - m \\text{ и } m < j \\leq n - m \\\\\n", "a_{ij} = 0, \\quad \\text{ иначе}\n", "\\end{cases} $$\n", "\n", "Размер матрицы определяется параметром `n`, размер маленького квадрата из единицы параметром `m`. При `n=6` и `m=2` матрица должна выглядеть следующим образом.\n", "\n", "$$\n", "\\begin{equation}\n", "\\begin{pmatrix}\n", "0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "0 & 0 & 1 & 1 & 0 & 0 \\\\\n", "0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 0 & 0 & 0 & 0 \\\\\n", "\\end{pmatrix}.\n", "\\end{equation}\n", "$$\n", "\n", "```python\n", "def square(n, m):\n", " ...\n", "```\n", "\n", "\n", "```{note}\n", "Для удобства можно считать, что `m < n` и оба они четны. \n", "```\n", "\n", "\n", "### Шахматная доска\n", "\n", "Реализовать функцию, которая создаёт матрицу заданного размера `n`, содержащую единицы и нули, расположенные в шахматном порядке.\n", "\n", "$$\\begin{pmatrix}\n", "1 & 0 & 1 & \\cdots & 1 & 0 \\\\\n", "0 & 1 & 0 & \\cdots & 0 & 1 \\\\\n", "1 & 0 & 1 & \\cdots & 1 & 0 \\\\\n", "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots & \\vdots \\\\\n", "1 & 0 & 1 & \\cdots & 1 & 0 \\\\\n", "0 & 1 & 0 & \\cdots & 0 & 1 \n", "\\end{pmatrix}. $$\n", "\n", "```python\n", "def chess_board(n):\n", " ...\n", "```\n", "\n", "```{note}\n", "Для удобства можно считать, что `n` четно.\n", "```\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }