Matlab — ошибка с линейным дискриминантным анализом

#matlab #classification

#matlab #классификация

Вопрос:

Я бегу

 Y_testing_obtained = classify(X_testing, X_training, Y_training);
  

и ошибка, которую я получаю, это

 Error using ==> classify at 246
The pooled covariance matrix of TRAINING must be positive definite.
  

X_training — это матрица размером 1550 x 5. Не могли бы вы, пожалуйста, рассказать мне, что означает эта ошибка, т. е. почему она появляется, и как ее обойти?
Спасибо

Комментарии:

1. Упомяните также размеры других переменных. X_testing, X_training должны иметь одинаковое количество столбцов, X_training, Y_training должны иметь одинаковое количество строк.

2. Классификация создает ковариационную матрицу на основе предоставленных вами значений. Ключ — это X_training и Y_training, и они должны быть правильно установлены. X_training строит ковариационную матрицу, поэтому убедитесь, что она правильная, прежде чем беспокоиться о X_testing.

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

Ответ №1:

Объяснение: Когда вы запускаете функцию classify без указания типа дискриминантной функции (как вы это делали), Matlab использует линейный дискриминантный анализ (LDA). Не вдаваясь в подробности о LDA, алгоритмам необходимо вычислить ковариационную матрицу X_testing , чтобы решить задачу оптимизации, и эта матрица должна быть положительно определенной (см. Википедию: Положительно определенная матрица). Основное предположение заключается в том, что ваши данные представлены многомерным распределением вероятностей, которое всегда имеет положительно определенную ковариационную матрицу, если только одна или несколько переменных не являются точными линейными комбинациями других.

Чтобы решить вашу проблему: возможно, что одна из ваших переменных является линейной комбинацией других. Вы можете попробовать выбрать разумное подмножество ваших переменных или выполнить анализ главных компонентов (PCA) на обучающих данных, а затем классифицировать, используя первые несколько основных компонентов. Или вы могли бы указать тип дискриминантной функции и выбрать один из двух наивных байесовских классификаторов, например:

 Y_testing_obtained = classify(X_testing, X_training, Y_training, 'diaglinear');
  

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

Наконец, вы также можете взглянуть на ответы, опубликованные на аналогичный вопрос на форуме Matlab.

Комментарии:

1. Спасибо! Только начал изучать классификацию и ‘diaglinear’ решил мою проблему, очень признателен за объяснение!

Ответ №2:

Попробуйте упорядочить данные с помощью функции cvshrink в Matlab