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 или более других столбцов и удалять их. Такие столбцы избыточны для расстояния Махаланобиса.

кстати, так как расстояние Махаланобиса эффективно масштабирование и вращение, вызов функции масштабирования выглядит излишним - любая причина, почему вы этого хотите?