положительные полуопределенные матрицы и численная устойчивость? - PullRequest
4 голосов
/ 22 января 2010

Я пытаюсь выполнить факторный анализ для матрицы совместного использования (C), которая вычисляется из матрицы терминов-документов (TD) следующим образом: C = TD * TD '

В теории C должен быть положительно-полуопределенным, но это не так, и алгоритм факторного анализа не может работать с ним из-за этого. Я не могу изменить алгоритм по причинам скорости).

Я смотрю, и это может быть проблемой численной стабильности: Простой алгоритм генерации положительно-полуопределенных матриц - ответ 2.

Какой хороший способ продолжить?

Ответы [ 3 ]

7 голосов
/ 22 января 2010

Я бы сделал собственное разложение матрицы:

C=Q D Q^-1

Если ваша матрица действительно положительно полуопределена, то все собственные значения (записи на диагонали D) должны быть неотрицательными. (Это, вероятно, тест, который выполняет ваш алгоритм факторного анализа, чтобы определить, является ли матрица положительной полуопределенной.)

Если вы испытываете числовые проблемы, некоторые из собственных значений, вероятно, будут чуть меньше нуля. Попробуйте установить эти записи в ноль, вычислите Q D Q^-1, чтобы получить новый, исправленный C, а затем отправьте это в свой алгоритм факторного анализа.

С другой стороны, если вы обнаружите, что ваша матрица C имеет действительно отрицательные собственные значения, то вы знаете, что где-то ошибаетесь в построении C.

3 голосов
/ 09 августа 2010

Не имея возможности комментировать, я должен буду повторить комментарий SplittingField, с придиркой, которая образует C = TD * TD ' квадраты номер условия TD, а не удваивать его. Эквивалентным и гораздо более устойчивым к нахождению собственного разложения C будет выполнение разложения по сингулярным числам (SVD) на TD. Вы получаете номер условия в качестве бонуса: отношение наибольшего единственного значения к наименьшему единственному значению является номером условия матрицы, а логарифм с основанием 10, это оценка того, сколько десятичных цифр вы потеряли. Вы использовали C в своих вычислениях (конечно, если самое маленькое единственное значение равно 0, ваша проблема единственная!)

1 голос
/ 28 августа 2011

Прежде всего, существуют методы для исправления «патологий» матриц с отрицательными собственными значениями - напомним, матрица возникает в результате ряда вычислений и обычно таких шагов, которые приводят в первую очередь к патологиям. Неверно принимать тот факт, что, поскольку матрица имеет малые, почти нулевые отрицательные собственные значения, это «плохая» матрица. Скорее, поработайте над исправлением патологий. Что касается SVD, я согласен, что это один из лучших подходов, однако я не часто использую его в работе, потому что он очень дорог в вычислительном отношении. Однако, если у вас есть один или несколько элементов матрицы, которые равны нулю, то есть матрица разрежена, то вы должны использовать SVD, так как это будет один из единственных методов, которые будут работать.

...