diff --git a/.gitignore b/.gitignore index 3e3760376b450b5a9b9e6c9c8ff79d2305903cc0..6f029a75656df0b978fb4d0dc91eaa0abdac3d4f 100644 --- a/.gitignore +++ b/.gitignore @@ -122,4 +122,9 @@ venv.bak/ # mypy .mypy_cache/ .dmypy.json -dmypy.json \ No newline at end of file +dmypy.json + +#TeX rubbish +*.log +*.aux +*.synctex.gz diff --git a/documentation/description.tex b/documentation/description.tex new file mode 100644 index 0000000000000000000000000000000000000000..b05b43dd240469b6da551bc74eaedc7be876c2d9 --- /dev/null +++ b/documentation/description.tex @@ -0,0 +1,35 @@ + \section{Описание} + +Функция \texttt{supersvd} по двум заданным наборам пространственно--временных полей строит матрицу ковариации, а затем вычисляет её неполное сингулярное разложение. + +Функция \texttt{supersvd} принимает на вход 2 обязательных аргумента (два поля, максимально скоррелированные моды которых мы ищем) и 2 опциональных параметра: количество пар максимально скоррелированных мод (по умолчанию 3) и значение переключателя режима вычитания из поля его среднего по времени значения (по умолчанию \texttt{True}, то есть из поля \textit{вычитается} его среднее по времени значение). + +Пусть $X(t), Y(t)$ --- два меняющихся во времени поля, максимально скоррелированные моды которых мы ищем, причём $\operatorname{dim}(X)=nT \times nX$\footnote{Здесь и далее размерности массивов указаны в порядке, принятом в \texttt{C} и \texttt{Python}. В \texttt{Fortran} размерности массивов следует развернуть в обратном порядке} и $\operatorname{dim}(Y)\hm=nT \times nY$, где $nX$ и $nY$ могут быть одним или несколькими измерениями массивов (в случае среднемесячных данных INMCM $nX$ и $nY$ --- $120 \times 180$). +Функция \texttt{supersvd} вычисляет разложение вида: +\begin{equation} +\begin{aligned} +X(t) &= \overline{X} + XV_1 XC_1(t) + XV_2 XC_2(t) + \ldots + XV_k XC_k(t) + \ldots,\\ +Y(t) &= \overline{Y} + YV_1 YC_1(t) + YV_2 YC_2(t) + \ldots + YV_k YC_k(t) + \ldots, +\end{aligned} +\label{eq:svd} +\end{equation} +где +\begin{equation*} +\overline{X}=\frac{1}{nT}\sum_{t=1}^{nT} X(t),\qquad +\overline{Y}=\frac{1}{nT}\sum_{t=1}^{nT} Y(t), +\end{equation*} +а $k$ --- количество пар максимально скоррелированных мод. В \eqref{eq:svd} каждое новое слагаемое получается максимизацией корреляции между $XC_k(t)$ и $YC_k(t)$, а +$XV_k, YV_k$~--- два семейства ортогональных пространственных мод. + +Моды $XV_k, YV_k$ являются левыми и правыми сингулярными векторами матрицы ковариации $$C =\frac{1}{nT} \sum_{t=1}^{nT} (X(t) - \overline{X}) (Y(t) - \overline{Y})^{\mathsf T}.$$ + +Функция \texttt{supersvd} возвращает: +\begin{itemize} + \item массивы \texttt{x\_coeff}, \texttt{y\_coeff} временных коэффициентов $XC(t), YC(t)$ разложения \eqref{eq:svd} \big(раз\-мерности $k \times nT$\big); + \item массив \texttt{x\_vect} левых сингулярных векторов $XV$ \big(размерности $k \times nX$\big); + \item массив \texttt{y\_vect} правых сингулярных векторов $YV$ \big(размерности $k \times nY$\big); + \item массив \texttt{corrcoeff}, содержащий $k$ коэффициентов корреляции между $XC_k(t)$ и $YC_k(t)$; + \item массив \texttt{x\_variance\_fraction} (\texttt{y\_variance\_fraction}), содержащий доли дисперсии, приходящиеся на каждый из $k$ левых (правых) сингулярных векторов; + \item массив \texttt{eigenvalue\_fraction}, содержащий долю дисперсии матрицы ковариации, приходящуюся на $k$-ую пару сингулярных векторов; + \item массив \texttt{eigenvalues} сингулярных значений матрицы ковариации $C$. +\end{itemize} diff --git a/documentation/supersvd_doc.pdf b/documentation/supersvd_doc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a7d440e2d40b96881bc909101d0efaa70fdde310 Binary files /dev/null and b/documentation/supersvd_doc.pdf differ diff --git a/documentation/supersvd_doc.tex b/documentation/supersvd_doc.tex new file mode 100644 index 0000000000000000000000000000000000000000..0a68cf6928d3ae2b2ecabc37038716dc6bf35dfb --- /dev/null +++ b/documentation/supersvd_doc.tex @@ -0,0 +1,28 @@ +\documentclass[12pt, a4paper]{article} +\usepackage[T2A]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage[russian]{babel} +\usepackage[top=15mm,left=17.5mm, right=17.5mm, bottom=20mm]{geometry} +\usepackage{amsmath} +\usepackage{icomma} + +\newcommand*{\hm}[1]{#1\nobreak\discretionary{}% + {\hbox{$\mathsurround=0pt #1$}}{}} + +\title{\large Программа для вычисления максимально скоррелированных мод и ЭОФ} +\author{Мария Тарасевич, \texttt{mashatarasevich@gmail.com}} +\date{} + +\begin{document} +\maketitle + + +Написанная на языке \texttt{Python 3} программа состоит из двух файлов \texttt{main.py} и \texttt{supersvd.py}. В файле \texttt{supersvd.py} находится алгоритм вычисления максимально скоррелированных мод, а в \texttt{main.py} --- вспомогательный код, который анализирует ключи запуска программы, делает чтение входных данных из файлов, а также записывает в выходные файлы результаты работы алгоритма. + +Функцию \texttt{supersvd} можно напрямую использовать из кода на \texttt{Python}, в этом случае не обязательно сохранять массивы в виде файлов на диске. + +\input{description} + +\input{usage} + +\end{document} diff --git a/documentation/usage.tex b/documentation/usage.tex new file mode 100644 index 0000000000000000000000000000000000000000..212d1641f5294e1c90e12cee06772175d8a34dc4 --- /dev/null +++ b/documentation/usage.tex @@ -0,0 +1,29 @@ +\section{Использование} + +Функция \texttt{supersvd} может вызываться как и из другой \texttt{Python}-функции, принимая на вход массивы данных, так и из командной строки, принимая на вход бинарные файлы (\texttt{.STD}). Последняя возможность реализована в функции \texttt{main}. + + Функция \texttt{main} принимает на вход 3 обязательных аргумента: + \begin{itemize} + \item[\texttt{-x}] имя файла, содержащего первое из полей (например, \texttt{X.STD}); + \item[\texttt{-y}] имя файла, содержащего второе из полей (например, \texttt{Y.STD})\footnote{Если нужно посчитать ЭОФы, то в качестве первого и второго нужно задать одно и то же поле, то есть передать два раза имя одного файла.}; + \item[\texttt{-t}, \texttt{-{}-time}] длину временного интервала (например, в случае среднемесячных данных исторического эксперимента с INMCM это 165 лет). + \end{itemize} + + Также функция \texttt{main} принимает 7 необязательных (опциональных) параметров: + \begin{itemize} + \item[\texttt{-{}-type}] тип используемых данных --- \texttt{real} (4 байта) или \texttt{double} (8 байт), значение по умолчанию~--- \texttt{real}; + \item[\texttt{-k}] количество вычисляемых пар максимально скоррелированных мод, значение по умолчанию --- 3; + \item[\texttt{-xv}] имя файла, в который запишется массив \texttt{x\_vect}; + \item[\texttt{-yv}] имя файла, в который запишется массив \texttt{y\_vect}; + \item[\texttt{-xc}] имя файла, в который запишется массив \texttt{x\_coeff}; + \item[\texttt{-yc}] имя файла, в который запишется массив \texttt{y\_coeff}; + \item[\texttt{-stat}] имя файла (предпочтительно в формате \texttt{.CSV}), в который для каждого $k$ запишутся домноженные на 100\% элементы массивов: \texttt{corrcoeff}, \texttt{x\_variance\_fraction}, \texttt{y\_vari\-ance\_fraction}, \texttt{eigenvalue\_fraction}. + \end{itemize} + +Функция \texttt{main} также может быть запущена с ключом \texttt{-{}-dont-subtract-mean}: при этом из полей $X$, $Y$ \textit{не будут вычитаться} их средние по времени значения. + +Итак, чтобы вычислить с помощью функции \texttt{main} 4 максимально скоррелированные моды аномалий температуры и давления (типа \texttt{float}) и сохранить все возможные результаты, достаточно в командной строке выполнить:\\ +\verb|python3 main.py -x ts.std -y ps.std -t 1147 -k 4 -xv tsv.std -yv psv.std|\\ +\verb| -xc tsc.std -yc psc.std -stat c.csv| + +Информацию, сохраняемую в файл \texttt{c.csv}, функция \texttt{main} также выводит на экран. \ No newline at end of file