Линейная корреляция
Условие
В некотором эксперименте было выполнено 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вxietainverse- функция, переводящаяxietaвxy
Задание 2. Реализуйте функцию
def plot(data:np.ndarray, new_data:np.ndarray)
Которая создает две диаграммы рассеяния в одном окне. Каждая диаграмма должна быть расположена на отдельных осях. Первая диаграмма строится по исходным данным xy, а вторая - по преобразованным xieta. Диаграммы должны сохраняться в файл scatter.png.
Указания
Линейную корреляцию в данных можно устранить разными способами. Вот один из самых простых:
- Нормализовать данные, т.е. вычесть среднее значение и поделить на среднеквадратичное отклонение. Отдельно для
xиy. После такого преобразования среднее значение каждой переменной будет равно нулю, а среднеквадратичное отклонение - единице. - Выполнить поворот переменных на угол pi / 4
Вы можете предложить другую процедуру, которая, например, будет выполнять один поворот вокруг некоторой точки, сохраняя при этом средние значения и не изменяя масштаб. Главное, чтобы преобразование исключало линейную корреляцию в данных.
Как проверять решение локально
Код решения и полученные изображения будут проверяться вручную. Работу функции decorrelate и факт создания файла в правильным именем можно проверить локально с помощью обычной процедуры: устанавливаем необходимые пакеты (один раз):
pip install -r requirements.txt
Запускаем тесты:
pytest -vs