Mahalonobis расстояние в R, ошибка: система вычислений сингулярных
Я хотел бы рассчитать многомерное расстояние от набора точек до центроида этих точек. Расстояние Махаланобиса, кажется, подходит для этого. Однако я получаю ошибку (см. ниже).
может кто-нибудь сказать мне, почему я получаю эту ошибку, и если есть способ обойти это?
Если вы скачать координаты и связанных с этим экологических данных, вы можете запустить следующий код.
require(maptools)
occ <- readShapeSpatial('occurrences.shp')
load('envDat.Rdata')
#standardize the data to scale the variables
dat <- as.matrix(scale(dat))
centroid <- dat[1547,] #let's assume this is the centroid in this case
#Calculate multivariate distance from all points to centroid
mahalanobis(dat,center=centroid,cov=cov(dat))
Error in solve.default(cov, ...) :
system is computationally singular: reciprocal condition number = 9.50116e-19
2 ответов
расстояние Махаланобиса требует от вас вычисления обратной ковариационной матрицы. Функция mahalanobis
внутренне использует solve
который является численным способом вычисления обратного. К сожалению, если некоторые из чисел, используемых в обратном вычислении, очень малы, предполагается, что они равны нулю, что приводит к предположению, что это сингулярная матрица. Вот почему он указывает, что они вычислительно единственном числе, потому что матрица не может быть вырожденной дали другая терпимость.
решение состоит в том, чтобы установить допуск, когда он предполагает, что они равны нулю. К счастью, mahalanobis
позволяет передать этот параметр (tol
) к solve
:
mahalanobis(dat,center=centroid,cov=cov(dat),tol=1e-20)
# [1] 24.215494 28.394913 6.984101 28.004975 11.095357 14.401967 ...
mahalanobis использует ковариационную матрицу, cov, (точнее, обратную ей) для преобразования системы координат, а затем вычисляет евклидово расстояние в новых координатах. Стандартная ссылка - Duda & Hart "классификация шаблонов и распознавание сцен"
похоже, что ваша матрица cov является сингулярной. Возможно, в "dat" есть линейно-зависимые столбцы, которые не нужны? Установка допуска на ноль не поможет, если ковариационная матрица действительно сингулярна. Первый вместо этого нужно искать столбцы, которые могут быть масштабированием какого-либо другого столбца или могут быть просто суммой 2 или более других столбцов и удалять их. Такие столбцы избыточны для расстояния Махаланобиса.
кстати, так как расстояние Махаланобиса эффективно масштабирование и вращение, вызов функции масштабирования выглядит излишним - любая причина, почему вы этого хотите?