\documentclass[prb, notitlepage, aps, 11pt]{revtex4-2}%
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[english, russian]{babel}
\usepackage{listings}
\usepackage{amssymb}
\usepackage{graphicx,amsmath}
\usepackage{enumitem}
\usepackage{nicefrac}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{amsfonts}
\usepackage{comment}
\usepackage{bm}
\usepackage{delimset}
\usepackage[pdftitle = a]{hyperref}
\usepackage{datetime}
\hypersetup{
    colorlinks=true,
    linkcolor=blue,
    filecolor=magenta,
    urlcolor=cyan,
    pdfpagemode=FullScreen,
}

\begin{document}

% \begin{center}
%     версия от \today \quad \currenttime
% \end{center}

\title{\texorpdfstring{
    Численные методы, осень 2022\\
    Задание 2 [SVD-разложение и его применения] \\
    Всего баллов: 40 \ Срок сдачи: 21 октября
    }{}
}

\maketitle

\section*{Рекомендованная литература}

\begin{itemize}
\item Лекции 4-5 из \cite{trefethen1997numerical}
\item Лекция 2 из \cite{tyrtyshnikov2012brief}
\item \href{https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues}{StackExchange: в чём смысл собственных векторов, собственных чисел и анализа главных компонент}
\end{itemize}

\section*{Упражнения}

\begin{enumerate}

\begin{comment}
\item (5) Construct (manually) SVD decomposition of the following matrices:
$$
(a)\quad\begin{bmatrix}
3 & 0\\
0 & -2
\end{bmatrix},\quad
(b)\quad\begin{bmatrix}
0 & 2\\
0 & 0\\
0 & 0
\end{bmatrix},\quad
(c)\quad\begin{bmatrix}
1 & 1\\
1 & 1
\end{bmatrix}.
$$
For the case (b), construct both full and reduced SVD decomposition via \path{np.linalg.svd}. 
\end{comment}

\item (10) В этом упражнении мы познакомимся с 
тремя основными алгоритмами вычисления сингулярного разложения, доступными в Python: \path{numpy.linalg.svd}, \path{scipy.sparse.linalg.svds} и \path{sklearn.utils.extmath.randomized_svd}.

\begin{itemize}
    \item Создайте матрицу $A$ размера $n\times n \ (n=2000)$ со случайными элементами из стандартного нормального распределения.
    
    \item С помощью этих трёх алгоритмов (и теоремы Эккарта-Янга?) аппроксимируйте матрицу $A$ матрицами ранга 2.
    Вы получите матрицы $A_\text{svd}$, $A_\text{svds}$ и $A_\text{rsvd}$. Измерьте времена выполнения.

    \item Вычислите нормы отклонений: $\norm{A-A_\text{svd}}_F \quad \norm{A-A_\text{svds}}_F \quad \norm{ A - A_\textrm{rsvd}}_F$\\ Объясните результат.
\end{itemize} 
\item (5) Пусть матрица $A$ размером $m\times n$ имеет сингулярное разложение $A = U\Sigma V^T$.
Выразите через $U$, $\Sigma$ и $V$ сингулярные разложения следующих матриц:
\begin{enumerate}[label=(\roman*)]
    \item $\left(A^T A\right)^{-1}$
    \item $\left(A^T A\right)^{-1}A^T$
    \item $A\left(A^T A\right)^{-1}$
    \item $A\left(A^T A\right)^{-1}A^T$
\end{enumerate}

\item (10) Рассмотрим матрицу:
$$
\begin{bmatrix}
-2 & 11\\
-10 & 5
\end{bmatrix}
$$
\begin{itemize}
    \item Выпишите сингулярные числа, а также левые и правые сингулярные векторы матрицы $A$. Так как SVD-разложение не единственно, найдите то разложение, в котором матрицы $U$ и $V$ имеют наименьшее количество отрицательных элементов.

    \item Нарисуйте единичный круг и его образ под действием оператора $A$. Изобразите сингулярные векторы и отметьте их координаты.

    \item Чему равна спектральная норма и норма Фробениуса матрицы $A$?

    \item Найдите $A^{-1}$ с помощью SVD-разложения.

    \item Найдите собственные числа $\lambda_1$ и $ \lambda_2$ матрицы $A$.
\end{itemize}

\item (5) В файле \path{A.npy} находится матрица $A$ размера $n\times n$. Определите наилучшее приближение следующего вида, в котором переменные разделяются: $A_{ij} \approx h_i\eta_j$. Чему равна относительная ошибка такой аппроксимации?
$$
\delta_{\textrm{err}}=\frac{\sqrt{\sum_{ij}\left(A_{ij}-h_i\eta_j\right)^2}}{\sqrt{\sum_{ij}A_{ij}^2}}
$$
Сколько понадобится слагаемых, чтобы приближение стало точным?
$$
A_{ij} = \sum_{\alpha=1}^K h_{\alpha i}\eta_{\alpha j}
\qquad
K = {} ?
$$

\item (10) В этом упражнении мы применим SVD-разложение к задаче уменьшения размерности. Начнём с загрузки датасета:

\lstset{language=Python}
\lstset{frame=lines}
\lstset{label={lst:code_direct}}
\lstset{basicstyle=\ttfamily}

\begin{lstlisting}
    from sklearn.datasets import load_digits
    digits = load_digits()
    A = digits.data
    y = digits.target
\end{lstlisting}

Каждая строка массива \path{A} состоит из 64 чисел с плавающей точкой, которые задают черно-белое изображение $8 \times 8$. Это изображение цифры. Сами цифры (метки данных) указаны в массиве \path{y}.

\begin{itemize}
    \item Изучите датасет. Постройте изображения нескольких цифр, например, 0, 3, 7

    \item Отнормируйте датасет \path{A}.

    \item С помощью SVD-разложения спроецируйте датасет, cделайте его из $N \!{\times} 64$--мерного $N \!{\times} 2$--мерным. Постройте двумерный \path{scatter_plot}, окрасьте точки, соответствующие разным цифрам, в разные цвета.
\end{itemize}

\end{enumerate}

\bibliography{library.bib}
\end{document}
