C++ и Python

Линейная корреляция (5)

Линейная корреляция

Условие

В некотором эксперименте было выполнено N измерений двух величин x и y. Посмотрев на полученные результаты, исследователь обнаружил линейную корреляцию между x и y. Анализировать распределения независимых величин удобнее, поэтому исследователь решил сделать линейное преобразование, переводящее переменные (x, y) в переменные (xi, eta), и только после этого работать с данными. Новые переменные полжны иметь нулевую корреляцию. Вам необходимо помочь экспериментатору реализовать его замысел.

Задание 1. Реализуйте функицю

def decorrelate(xy:np.ndarray) -> (np.ndarray, callable, callable)

Аргумент xy является массивом numpy формы (N, 2). Первый столбец соответствует величине x, а второй - величине y. Функция decorrelate возвращает кортеж, содержащий

  • xieta - массив numpy с формой как у входного массива. Столбцы этого массива соответствуют величинам xi и eta, коэффициент корреляции между xi и eta должен быть равен нулю;
  • direct - функция, переводящая xy в xieta
  • inverse - функция, переводящая xieta в xy

Задание 2. Реализуйте функцию

def plot(data:np.ndarray, new_data:np.ndarray)

Которая создает две диаграммы рассеяния в одном окне. Каждая диаграмма должна быть расположена на отдельных осях. Первая диаграмма строится по исходным данным xy, а вторая - по преобразованным xieta. Диаграммы должны сохраняться в файл scatter.png.

Указания

Линейную корреляцию в данных можно устранить разными способами. Вот один из самых простых:

  1. Нормализовать данные, т.е. вычесть среднее значение и поделить на среднеквадратичное отклонение. Отдельно для x и y. После такого преобразования среднее значение каждой переменной будет равно нулю, а среднеквадратичное отклонение - единице.
  2. Выполнить поворот переменных на угол pi / 4

Вы можете предложить другую процедуру, которая, например, будет выполнять один поворот вокруг некоторой точки, сохраняя при этом средние значения и не изменяя масштаб. Главное, чтобы преобразование исключало линейную корреляцию в данных.

Как проверять решение локально

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

pip install -r requirements.txt

Запускаем тесты:

pytest -vs