Линейный дискриминантный анализ Фишера (LDA) - это алгоритм уменьшения размерности, который также можно использовать для классификации. В этом сообщении блога мы узнаем больше о LDA Fisher и реализуем его с нуля на Python.

LDA?

Линейный дискриминантный анализ (LDA) - это метод уменьшения размерности. Как следует из названия, методы уменьшения размерности сокращают количество измерений (то есть переменных) в наборе данных, сохраняя при этом как можно больше информации. Например, предположим, что мы построили связь между двумя переменными, где каждый цвет представляет другой класс.

ПОЧЕМУ?

Основная идея состоит в том, чтобы изучить набор параметров w ∈ R (d × d ′), которые используются для проецирования данных x ∈ R (d) в меньшее измерение d ′. На рисунке ниже (Епископ, 2006) показана иллюстрация. Исходные данные имеют 2 измерения, d = 2, и мы хотим спроецировать их на 1 измерение, d = 1.

Если мы проецируем двумерные точки данных на линию (1-D) из всех таких линий, наша цель - найти ту, которая максимизирует расстояние между средними значениями двух классов после проецирования. Если бы мы могли это сделать, мы могли бы добиться хорошего разделения между классами в 1-D. Это проиллюстрировано на рисунке слева и может быть отражено в идее максимизации «ковариации между классами». Однако, как мы видим, это вызывает много совпадений между проектируемыми классами. Мы также хотим минимизировать это перекрытие. Чтобы справиться с этим, LDA Фишера пытается минимизировать «внутриклассовую ковариацию» каждого класса. Минимизация этой ковариации приводит нас к проекции на рисунке справа, которая имеет минимальное перекрытие. Формализуя это, мы можем представить цель следующим образом.

где Sb ∈ R (d × d) и Sw ∈ R (d × d) - межклассовые и внутриклассовые ковариационные матрицы соответственно. Они рассчитываются как

где Xnk - n-й пример данных в k-м классе, Nk - количество примеров в классе k, m - общее среднее всех данных, а mk - среднее значение k-го класса. Теперь, используя двойственные лагранжианы и условия ККТ, задачу максимизации J можно преобразовать в решение:

что является проблемой собственных значений для матрицы inv (Sw) .Sb. Таким образом, нашим окончательным решением для w будут собственные векторы приведенного выше уравнения, соответствующие наибольшим собственным значениям. Для сокращения до размеров d ′ мы берем наибольшие собственные значения d ′, поскольку они будут содержать наибольшее количество информации. Также обратите внимание, что если у нас есть K классов, максимальное значение d ′ может быть K − 1. То есть мы не можем проецировать данные класса K в размерность больше K − 1. (Конечно, d 'не может быть больше, чем исходное измерение данных d). Это происходит по следующей причине. Обратите внимание, что матрица разброса между классами, Sb, была суммой K матриц, каждая из которых имеет ранг 1 и является внешним произведением двух векторов. Кроме того, поскольку общее среднее значение и среднее значение отдельного класса связаны, только (K − 1) из этих K матриц являются независимыми. Таким образом, Sb имеет максимальный ранг K − 1 и, следовательно, имеется только K − 1 ненулевых собственных значений. Таким образом, мы не можем проецировать данные более чем на K − 1 измерения.

КАК?

Вкратце, следующие ключевые шаги, которые необходимо выполнить:

  1. Сгруппируйте данные обучения по соответствующим классам. т.е. сформировать словарь и сохранить данные, сгруппированные по классам, к которым они принадлежат.
  2. Вычислить средний вектор заданных обучающих данных K-измерений, исключая целевой класс, а также вычислить вектор среднего класса для заданных обучающих данных.
  3. Вычислить матрицы SB и SW, необходимые для максимизации разницы между средними значениями данных классов и минимизации дисперсии данных классов.
  4. После этого вычисляем матрицу M, где M = (inv (SW)). (SB)
  5. Вычислите собственные значения M и получите пары собственных векторов для первых n (необходимых) измерений.
  6. Эти собственные векторы дают нам значение «w», используемое для преобразования точек в необходимое количество измерений.
  7. После применения преобразования к каждой точке, то есть Transformed_Point = w.dot (given_point), мы вычисляем пороговое значение, по которому мы будем классифицировать точки на положительный и отрицательный класс.
  8. Для расчета порога используйте нормальное распределение по Гауссу.

9. После вычисления нормального уравнения для обоих классов мы получаем значение порога, а затем классифицируем точки по пороговому значению.

Вот пошаговая инструкция по реализации Python:

После написания кода для запуска программы fischer на Python вам необходимо выполнить следующую команду:

python fischer.py имя_набора данных.csv

Это сгенерирует все графики и даст точность и оценку f1 для классификации.

Эксперименты:

  1. Набор данных - a1_d1.csv, который можно скачать здесь.

Ссылки:

  1. Бишоп, К. М. (2006). Распознавание образов. Машинное обучение, 128.

Пожалуйста, проверьте мой профиль GITHUB и профиль LinkedIn.

Заметка от AI In Plain English

Мы всегда заинтересованы в продвижении качественного контента. Если у вас есть статья, которую вы хотели бы отправить в какую-либо из наших публикаций, отправьте нам электронное письмо по адресу [email protected] с вашим именем пользователя Medium, и мы добавим вас в качестве автора.