Найти тему
Nuances of programming

Анализ независимых компонент в Python

Оглавление

Источник: Nuances of Programming

Предположим, вы на вечеринке беседуете с милой девушкой. Вас атакует множество звуков: разговоры людей по всему дому, громко играющая на фоне музыка. Тем не менее ничто из этого не мешает вам сосредоточиться на том, что говорит девушка, потому что люди обладают врожденной способностью различать звуки.

Однако, если бы происходящее было сценой фильма, микрофон, который использовался бы для записи разговора, не обязательно обладал бы способностью различать все звуки в комнате. И вот здесь в игру вступает анализ независимых компонент, АНК. 

АНК — это вычислительный метод, разделяющий многомерный сигнал на компоненты. Используя АНК, можно выделить нужный компонент (беседа с девушкой, например) из комплекса сигналов. 

Алгоритм анализа независимых компонент 

АНК можно разбить на следующие шаги: 

  • Центрирование массива x вычитанием среднего значения.
  • Избавление от корреляции.
  • Выбор случайного начального значения для демикширования матрицы w.
  • Расчет нового значения w.
  • Нормализация w.
  • Проверка сходимости алгоритма. Если сходимости нет — возврат к шагу 4. 
  • Вычисление скалярного произведения w и x для получения независимых источников сигналов. 
-2

Избавление от корреляции

Прежде чем применять алгоритм АНК, необходимо избавиться от корреляции. Это означает, что мы преобразовываем сигнал таким образом, чтобы потенциальные корреляции между его компонентами исчезли (ковариация стала равна 0), а дисперсия каждого компонента стала равна 1. Также можно сказать, что ковариационная матрица будет равна единичной матрице. 

Единичная матрица
Единичная матрица
Ковариационная матрица
Ковариационная матрица

Фактический способ, которым мы избавляемся от корреляции, включает в себя разложение по собственным значениям его ковариационной матрицы. Соответствующее математическое уравнение может быть описано так: 

-5

Где D — это диагональная матрица собственных значений (каждая лямбда является собственным значением ковариационной матрицы), 

-6
-7

а E — ортогональная матрица собственных значений.

-8

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

-9

где

-10

Код Python 

Давайте посмотрим, как реализовать АНК в Python, используя Numpy. 

Для начала импортируем следующие библиотеки:

-11

Определяем функцию для обновления демикшированной матрицы w:

-12

Наконец, определяем основной метод, вызывающий функции предварительной обработки, инициализирующий w случайным набором значений и итерационно обновляющий w. На сходимость указывает тот факт, что идеальная w будет ортогональной, следовательно, произведение w и ее транспонированной матрицы будет примерно равно 1. После расчета оптимального значения w для каждого компонента возьмем скалярное произведение полученной матрицы и сигнала x, чтобы получить источники:

-13

Определяем функцию для построения и сравнения оригинальных, смешанных и предсказанных сигналов:

-14

Дальше для примера создадим метод для искусственного смешивания сигналов из различных источников:

-15

Затем создадим три сигнала, каждый из которых имеет собственный шаблон:

-16

В следующем примере вычисляем скалярное произведение матрицы A и сигналов для получения комбинации всех трех. Затем используем АНК, чтобы разделить смешанный сигнал на исходные: 

-17

-18

Теперь используем АНК для разложения смеси реальных аудиодорожек и отображения результата. Если вы хотите попробовать сделать это сами, можете найти аудиодорожки здесь

-19

-20

Sklearn

Наконец, посмотрим, как можно получить тот же результат, используя scikit-learn.

-21

-22

Jupyter Notebook

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Cory Maklin: Independent Component Analysis (ICA) In Python