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