#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