Распространенной проблемой в статистике является вычисление обратного корня квадратного от симметричной положительно определенной матрицы. Что было бы наиболее эффективным способом вычисления этого?
Я натолкнулся на некоторую литературу (которую я еще не читал), и некоторый случайный код R здесь , который я воспроизведу здесь для удобства
# function to compute the inverse square root of a matrix
fnMatSqrtInverse = function(mA) {
ei = eigen(mA)
d = ei$values
d = (d+abs(d))/2
d2 = 1/sqrt(d)
d2[d == 0] = 0
return(ei$vectors %*% diag(d2) %*% t(ei$vectors))
}
Я не совсем уверен, что понимаю линию d = (d+abs(d))/2
. Есть ли более эффективный способ вычисления обратного корня квадратного корня матрицы? Функция R eigen
вызывает LAPACK .
linear-algebra
numerical-analysis
matrix
tchakravarty
источник
источник
d[d<0] = 0
, что более выразительно.Ответы:
Код , который вы опубликовали ИСПОЛЬЗУЕТ собственное значение разложение симметричной матрицы к вычислительному .A- 1 / 2
Заявление
d = (D + абс (г)) / 2
эффективно принимает любую отрицательную запись в d и устанавливает ее в 0, оставляя неотрицательные записи в покое. То есть любое отрицательное собственное значение обрабатывается так, как если бы оно было 0. Теоретически, все собственные значения A должны быть неотрицательными, но на практике часто встречаются небольшие отрицательные собственные значения, когда вы вычисляете собственные значения предположительно положительно определенного ковариационная матрица, которая почти единственная.A
Если вам действительно требуется инверсия квадратного корня симметричной матрицы из , и A достаточно мало (не больше, чем, скажем, 1000 на 1000), то это примерно так же хорошо, как любой другой метод, который вы можете использовать.A A
Во многих случаях вы можете вместо этого использовать коэффициент Холецкого, обратный к ковариационной матрице (или практически такой же, коэффициент Холецкого для самой ковариационной матрицы). Вычисление коэффициента Холецкого обычно на порядок быстрее, чем вычисление разложения по собственным значениям для плотные матрицы и значительно более эффективные (как в вычислительном времени, так и в требуемом хранилище) для больших и разреженных матриц. Таким образом, использование факторизации Холецкого становится очень желательным, когда велико и редко.A
источник
По моему опыту, метод Хайама с полярным Ньютоном работает намного быстрее (см. Главу 6 « Функции матриц » Н. Хайама). В этой короткой заметке есть графики, которые сравнивают этот метод с методами первого порядка. Кроме того, приводятся ссылки на несколько других подходов матрица-квадрат-корень, хотя в основном полярная итерация Ньютона, кажется, работает лучше (и избегает выполнения вычислений по собственным векторам).
источник
Оптимизируйте свой код:
Вариант 1 - Оптимизируйте свой код R:
a. Вы можете
apply()
выполнить функцию,d
которая будет какmax(d,0)
иd2[d==0]=0
в одном цикле.б. Попробуйте работать
ei$values
напрямую.Вариант 2. Использование C ++:
переписать всю функцию в C ++ с помощью
RcppArmadillo
. Вы все еще сможете позвонить из R.источник