페어 와이즈 마할 라 노비스 거리


18

공변량 의 행렬 에서 모든 관측 쌍 사이의 R에서 샘플 Mahalanobis 거리를 계산해야합니다 . 효율적인 솔루션, 즉 거리 만 계산되고 바람직하게는 C / RCpp / Fortran 등으로 구현 되는 솔루션이 필요합니다 . 모집단 공분산 행렬 인 가 알려져 있지 않으며 샘플을 사용 한다고 가정합니다. 그 자리에 공분산 행렬이 있습니다.n ( n - 1 ) / 2 Σ×(1)/2Σ

R에서 pairwise Mahalanobis 거리 를 계산하는 "합의 된"방법이없는 것처럼 보이 므로이 질문에 특히 관심이 있습니다 . 즉, dist함수 나 함수 에서 구현되지 않습니다 cluster::daisy. 이 mahalanobis함수는 프로그래머의 추가 작업없이 쌍별 거리를 계산하지 않습니다.

이것은 이미 R 에서 Pairwise Mahalanobis 거리에 대해 요청 되었지만 솔루션이 올바르지 않은 것 같습니다.

다음은 정확하지만 비효율적입니다 ( × 거리 계산 이후).

set.seed(0)
x0 <- MASS::mvrnorm(33,1:10,diag(c(seq(1,1/2,l=10)),10))
dM = as.dist(apply(x0, 1, function(i) mahalanobis(x0, i, cov = cov(x0))))

이것은 C로 직접 코딩하기에 충분하지만이 기본 솔루션에 기존 솔루션이 있어야한다고 생각합니다. 하나 있습니까?

n (n-1) / 2 고유 거리 만 필요한 경우 n \ times n 거리를 HDMD::pairwise.mahalanobis()계산 하는 다른 해결책이 있습니다 . 유망한 것처럼 보이지만, 함수가에 의존하는 패키지에서 나오기를 원하지 않으므로 다른 사람들이 내 코드를 실행하는 기능이 심각하게 제한됩니다. 이 구현이 완벽하지 않으면 내 자신을 작성하고 싶습니다. 이 기능에 대한 경험이 있습니까?×(1)/2compositions::MahalanobisDist()rgl


어서 오십시오. 질문에 거리의 두 행렬을 인쇄 할 수 있습니까? 그리고 "비효율적"이란 무엇입니까?
ttnphns

1
표본 공분산 행렬 만 사용하고 있습니까? 그렇다면 1) 중심 X; 2) 중심 X의 SVD, 즉 UDV '를 계산하는 단계; 3) U의 행 사이의 페어 단위 거리 계산
vqv

질문으로 게시 해 주셔서 감사합니다. 나는 당신의 공식이 올바르지 않다고 생각합니다. 아래 답변을 참조하십시오.
user603

@vqv 그렇습니다. 표본 공분산 행렬입니다. 이를 반영하여 원본 게시물이 편집됩니다.
ahfoss

매우 유사한 질문 stats.stackexchange.com/q/33518/3277 도 참조하십시오 .
ttnphns

답변:


21

ahfoss의 "succint"솔루션에서 시작하여 SVD 대신 Cholesky 분해를 사용했습니다.

cholMaha <- function(X) {
 dec <- chol( cov(X) )
 tmp <- forwardsolve(t(dec), t(X) )
 dist(t(tmp))
}

삼각 시스템을 정방향으로 푸는 것이 더 빠르기 때문에 역 공분산으로 밀도가 높은 곱셈을 사용하기 때문에 더 빠릅니다 ( 여기 참조 ). 다음은 여러 설정에서 ahfoss 및 whuber 솔루션의 벤치 마크입니다.

 require(microbenchmark)
 set.seed(26565)
 N <- 100
 d <- 10

 X <- matrix(rnorm(N*d), N, d)

 A <- cholMaha( X = X ) 
 A1 <- fastPwMahal(x1 = X, invCovMat = solve(cov(X))) 
 sum(abs(A - A1)) 
 # [1] 5.973666e-12  Ressuring!

   microbenchmark(cholMaha(X),
                  fastPwMahal(x1 = X, invCovMat = solve(cov(X))),
                  mahal(x = X))
Unit: microseconds
expr          min       lq   median       uq      max neval
cholMaha    502.368 508.3750 512.3210 516.8960  542.806   100
fastPwMahal 634.439 640.7235 645.8575 651.3745 1469.112   100
mahal       839.772 850.4580 857.4405 871.0260 1856.032   100

 N <- 10
 d <- 5
 X <- matrix(rnorm(N*d), N, d)

   microbenchmark(cholMaha(X),
                  fastPwMahal(x1 = X, invCovMat = solve(cov(X))),
                  mahal(x = X)
                    )
Unit: microseconds
expr          min       lq    median       uq      max neval
cholMaha    112.235 116.9845 119.114 122.3970  169.924   100
fastPwMahal 195.415 201.5620 205.124 208.3365 1273.486   100
mahal       163.149 169.3650 172.927 175.9650  311.422   100

 N <- 500
 d <- 15
 X <- matrix(rnorm(N*d), N, d)

   microbenchmark(cholMaha(X),
                  fastPwMahal(x1 = X, invCovMat = solve(cov(X))),
                  mahal(x = X)
                    )
Unit: milliseconds
expr          min       lq     median       uq      max neval
cholMaha    14.58551 14.62484 14.74804 14.92414 41.70873   100
fastPwMahal 14.79692 14.91129 14.96545 15.19139 15.84825   100
mahal       12.65825 14.11171 39.43599 40.26598 41.77186   100

 N <- 500
 d <- 5
 X <- matrix(rnorm(N*d), N, d)

   microbenchmark(cholMaha(X),
                  fastPwMahal(x1 = X, invCovMat = solve(cov(X))),
                  mahal(x = X)
                    )
Unit: milliseconds
expr           min        lq      median        uq       max neval
cholMaha     5.007198  5.030110  5.115941  5.257862  6.031427   100
fastPwMahal  5.082696  5.143914  5.245919  5.457050  6.232565   100
mahal        10.312487 12.215657 37.094138 37.986501 40.153222   100

그래서 Cholesky는 균일하게 더 빠른 것 같습니다.


3
+1 잘 했어요! 이 솔루션이 더 빠른 이유에 대한 설명에 감사드립니다.
whuber

maha ()는 점까지의 거리가 아니라 쌍으로 된 거리 행렬을 어떻게 제공합니까?
sheß

1
당신 말이 맞아요, 그래서 내 편집은 전적으로 관련이 없습니다. 삭제하지만 언젠가는 패키지에 maha ()의 페어 단위 버전을 추가 할 것입니다. 이것을 지적 해 주셔서 감사합니다.
Matteo Fasiolo

1
사랑 스러울 것입니다! 기대하고 있습니다.
sheß

9

두 데이터 점 사이의 제곱 Mahalanobis 거리에 대한 표준 공식은 다음과 같습니다.

12=(엑스1엑스2)Σ1(엑스1엑스2)

여기서 는 관측치 해당 하는 벡터 입니다. 공분산 행렬은 일반적으로 관측 된 데이터에서 추정됩니다. 행렬 반전을 계산하지 않고이 연산에는 곱셈과 덧셈이 필요하며, 각각 번 반복됩니다. P × 1 명 I의 P (2) + (P)의 P를 2 + 2 P N ( N - 1 ) / 2엑스나는×1나는2+2+2(1)/2

다음과 같은 파생을 고려하십시오.

12=(엑스1엑스2)Σ1(엑스1엑스2)=(엑스1엑스2)Σ12Σ12(엑스1엑스2)=(엑스1Σ12엑스2Σ12)(Σ12엑스1Σ12엑스2)=(12)(12)

여기서 입니다. 참고 . 이는 이 대칭 이라는 사실에 의존합니다. 이는 대칭 대각선 화 가능 행렬 ,나는=Σ12엑스나는 Σ 1엑스나는Σ12=(Σ12엑스나는)=나는Σ12=이자형

12=(이자형12)=이자형12=이자형12=12

우리가 할 수있는 경우 하고 있습니다 대칭, 우리는 것을 볼 또한 대칭이어야합니다. 경우 은 IS 관측 매트릭스와 은 IS 되도록 행렬 행 이다 다음 간결하게 표현 될 수있다 . 이 결과와 이전 결과는 Σ 1=Σ1Σ1 Xn×pQn×pithQqiQΣ12엑스××나는h나는엑스Σ12

N ( N - 1 ) / (2) P (2) P는 , P (2) + (P)의 P 2 + 2 P는 O ( P , N 2 + P 2 N ) O ( P 2 N 2 )

케이=나는=1(케이나는나는)2.
배로 계산되는 유일한 연산 은 곱셈과 더하기 ( 위의 방법에서 곱셈 및 더하기와 반대 )이므로 알고리즘은 다음과 같습니다. 는 원래 대신 계산 복잡도 순서 입니다.(1)/222+2+2영형(2+2)영형(22)
require(ICSNP) # for pair.diff(), C implementation

fastPwMahal = function(data) {

    # Calculate inverse square root matrix
    invCov = solve(cov(data))
    svds = svd(invCov)
    invCovSqr = svds$u %*% diag(sqrt(svds$d)) %*% t(svds$u)

    Q = data %*% invCovSqr

    # Calculate distances
    # pair.diff() calculates the n(n-1)/2 element-by-element
    # pairwise differences between each row of the input matrix
    sqrDiffs = pair.diff(Q)^2
    distVec = rowSums(sqrDiffs)

    # Create dist object without creating a n x n matrix
    attr(distVec, "Size") = nrow(data)
    attr(distVec, "Diag") = F
    attr(distVec, "Upper") = F
    class(distVec) = "dist"
    return(distVec)
}

흥미 롭군 죄송합니다, R을 몰라요. 당신은 무엇을 설명하고 pair.diff()함수의 모든 단계의 인쇄물을 수치로 보여줄 수 있습니까 ? 감사.
ttnphns

이 계산을 정당화하는 파생을 포함하도록 답변을 편집했지만 훨씬 간결한 코드가 포함 된 두 번째 답변을 게시했습니다.
ahfoss

7

명백한 것을 시도합시다. 에서

나는제이=(엑스나는엑스제이)'Σ1(엑스나는엑스제이)=엑스나는'Σ1엑스나는+엑스제이'Σ1엑스제이2엑스나는'Σ1엑스제이

우리는 벡터를 계산할 수 있습니다

나는=엑스나는'Σ1엑스나는

에서 시간 매트릭스영형(2)

V=엑스Σ1엑스'

에서 대부분 내장 고속 (병렬) 배열 연산을 이용하여 다음과 같은 용액을 형성 시간영형(2+2)

=2V

여기서 는 : 와 관련하여 외부 곱입니다+()나는제이=나는+제이.

R구현은 간결 (및 그것과 함께, 그 가정 수학적 공식화 평행 실제로 기록과 역 가역 인 여기)Σ=바르(엑스)h

mahal <- function(x, h=solve(var(x))) {
  u <- apply(x, 1, function(y) y %*% h %*% y)
  d <- outer(u, u, `+`) - 2 * x %*% h %*% t(x)
  d[lower.tri(d)]
}

다른 솔루션과의 호환성을 위해 전체 (대칭, 제로 온 더 디아 곤) 제곱 거리 행렬이 아닌 고유 한 대각선 이외의 요소 만 반환됩니다. 산점도는 결과가의 결과와 일치 함을 나타냅니다 fastPwMahal.

C 또는 C ++에서, RAM은 재 - 사용될 수 의 중간 저장을위한 임의의 필요가 없도록, 즉시 계산 .

연구와 타이밍 의 범위 를 통해 및 에서부터 까지 이 구현은 지시 행 배 빠른 속도보다 그 범위에있다. 및 증가함에 따라 개선이 개선된다 . 결과적으로, 우리는 더 작은 보다 우수 할 것으로 기대할 수 있습니다 . 손익분기 는 부근에서 발생합니다.5000 , P 10 100 1.5 5 P , N , P를 P = 7 N 100335000101001.55fastPwMahalfastPwMahal=7100. 이 간단한 솔루션의 동일한 계산상의 이점이 다른 구현과 관련이 있는지 여부는 벡터화 된 배열 연산을 얼마나 잘 활용하는지의 문제 일 수 있습니다.


좋아 보인다 나는 오프 손의 빠른 성능을 잃지 않고 R에서이 작업을 수행하는 방법을 생각할 수 있지만 그것은 단지 낮은 대각선을 계산하여 더욱 신속하게 만들 수있는 가정 applyouter돌발를 제외하고 ... Rcpp.
ahfoss

적용 / 외부는 일반 바닐라 루프에 비해 속도 이점 이 없습니다 .
user603

@ user603 나는 원칙적으로 이해하지만 타이밍을 수행합니다. 또한, 이러한 구조를 사용하는 주요 요점은 알고리즘을 병렬화하는 의미 론적 도움을 제공 하는 것입니다. 알고리즘을 표현 하는 방법의 차이 가 중요합니다. (원래의 질문은 C / Fortran 등을 추구한다는 것을 기억할 가치가 있습니다.) Ahfoss, 나는 계산을 더 낮은 삼각형으로 제한하는 것에 대해 생각했으며 그로 인해 R얻을 수있는 것은 아무것도 없다고 동의 합니다.
whuber

5

샘플 Mahalanobis 거리 를 계산하려면 악용 할 수있는 몇 가지 대수 기법이 있습니다. 그것들은 모두 쌍으로 유클리드 거리를 계산하게하므로, 우리가 그것을 사용할 수 있다고 가정합시다 dist(). 가 데이터 행렬을 나타내도록 하자 . 여기서 우리는 열이 평균 0을 갖도록 중심화 되고 샘플 공분산 행렬이 특이 적이 지 않도록 순위 를 갖는다 고 가정한다 . (센터링에는 연산이 필요 합니다.) 그런 다음 샘플 공분산 행렬은N × P P O ( N , P ) S = X T X / N .엑스×영형()

에스=엑스엑스/.

의 쌍별 샘플 Mahalanobis 거리는 만족하는 모든 행렬 대한 의 쌍별 유클리드 거리와 같습니다 ( 예 : 제곱근 또는 C 레 스키 계수). 이것은 일부 선형 대수에서 비롯되며 , 및 Cholesky 분해 계산이 필요한 알고리즘으로 이어집니다 . 최악의 복잡도는 입니다.X L L L L T = S 1 S S 1 O ( n p 2 + p 3 )엑스

엑스
=에스1에스에스1영형(2+)

더 깊이,이 거리는 의 샘플 주성분 사이의 거리와 관련이 있습니다 . 하자 의 SVD 나타내는 . 그런 다음 및따라서 및 샘플 Mahalanobis 거리는 유클리드 거리가 회전 불변이기 때문에 의 계수로 스케일링 된 의 쌍별 유클리드 거리입니다. . 이것은 때 최악의 경우 복잡도 를 갖는 의 SVD 계산을 요구하는 알고리즘으로 이어진다 .X = U D V T X S = V D 2 V T / N S - 1 / 2 = V D - 1 V T n은 1 / 2 . X S - 1 / 2 = U V T n은 1 / 2 U 엑스엑스=V엑스

에스=V2V/
에스1/2=V1V1/2.
엑스에스1/2=V1/2
XO(np2)n>p엑스영형(2)>

다음은이 답변을 작성하는 데 사용중인 iPad에서 테스트 할 수없는 두 번째 방법의 R 구현입니다.

u = svd(scale(x, center = TRUE, scale = FALSE), nv = 0)$u
dist(u)
# these distances need to be scaled by a factor of n

2

이것은 훨씬 간결한 솔루션입니다. 그것은 여전히 ​​역 제곱근 공분산 행렬 (이 질문에 대한 다른 답변 참조)과 관련된 파생을 기반으로하지만 기본 R과 통계 패키지 만 사용합니다. 약간 더 빠릅니다 (내가 실행 한 일부 벤치 마크에서 약 10 % 빠름). 제곱 된 Maha 거리와 달리 Mahalanobis 거리를 반환합니다.

fastPwMahal = function(x1,invCovMat) {
  SQRT = with(svd(invCovMat), u %*% diag(d^0.5) %*% t(v))
  dist(x1 %*% SQRT)
}

이 함수에는 역공 분산 행렬이 필요하고 거리 객체를 반환하지 않지만이 제거 된 버전의 함수는 교환 사용자를 쌓는 데 더 일반적으로 유용 할 것으로 생각됩니다.


3
이것은 SQRTCholesky 분해 로 대체함으로써 개선 될 수있다 chol(invCovMat).
vqv

1

Fortran95 서브 루틴을 작성하여 비슷한 문제를 해결했습니다. 당신이하는 것처럼, 나는 거리 사이의 중복을 계산하고 싶지 않았습니다 . Comptraned Fortran95는 R 또는 Matlab과 같은 기본 매트릭스 계산에서 거의 편리하지만 루프에서는 훨씬 빠릅니다. Cholesky 분해 및 삼각형 치환에 대한 루틴은 LAPACK에서 사용할 수 있습니다.2

인터페이스에서 Fortran77 기능 만 사용하는 경우에도 서브 루틴은 다른 사용자를 위해 충분히 이식 가능합니다.


1

R 패키지 "biotools"를 사용하여 매우 쉬운 방법이 있습니다. 이 경우, 제곱 거리 Mahalanobis Matrix를 얻게됩니다.

#Manly (2004, p.65-66)

x1 <- c(131.37, 132.37, 134.47, 135.50, 136.17)
x2 <- c(133.60, 132.70, 133.80, 132.30, 130.33)
x3 <- c(99.17, 99.07, 96.03, 94.53, 93.50)
x4 <- c(50.53, 50.23, 50.57, 51.97, 51.37)

#size (n x p) #Means 
x <- cbind(x1, x2, x3, x4) 

#size (p x p) #Variances and Covariances
Cov <- matrix(c(21.112,0.038,0.078,2.01, 0.038,23.486,5.2,2.844, 
        0.078,5.2,24.18,1.134, 2.01,2.844,1.134,10.154), 4, 4)

library(biotools)
Mahalanobis_Distance<-D2.dist(x, Cov)
print(Mahalanobis_Distance)

제곱 거리 행렬의 의미를 설명해 주시겠습니까? 각각 : 두 점 / 벡터 사이의 거리에 관심이 있으므로 행렬이 무엇을 알 수 있습니까?
Ben

1

이것은 이전 답변이 다른 스레드 에서 여기로 이동 한 코드로 확장되었습니다 .

나는 선형 방정식 시스템의 해법을 사용 하는 모자 매트릭스 접근법을 통해 SPSS에서 페어 단위 Mahalanobis 거리의 사각형 대칭 행렬을 오랫동안 계산해 왔습니다 (공분산 행렬의 반전보다 빠릅니다).

나는 R 사용자가 아니기 때문에 SPSS에서 @ahfoss ' 이 레시피 를 "my"레시피와 함께 1000 건의 400 변수에 대한 데이터에 재현하려고 시도했으며 상당히 빠른 길을 찾았습니다.


pairwise Mahalanobis 거리의 전체 행렬을 계산하는 가장 빠른 방법은 hat matrix 입니다. 즉, 매우 빠른 행렬 곱셈 및 반전 함수가 내장 된 고급 언어 (예 : R)를 사용하는 경우 루프가 전혀 필요하지 않으며 사례 별 루프를 수행하는 것보다 빠릅니다.H

정의 . 제곱 쌍 단위의 마할 라 노비스 거리 의 이중 중심 행렬은 과 같습니다. 여기서 모자 행렬은 열 중심에서 계산 된 . 데이터 .X ( X ' X ) - 1 X ' XH(1)엑스(엑스'엑스)1엑스'엑스

따라서 데이터 행렬의 중심 열, 모자 행렬을 계산하고 (n-1)을 곱하고 이중 중심과 반대되는 연산을 수행합니다. 제곱 된 Mahalanobis 거리의 행렬을 얻습니다.

"Double centering"은 유클리드 및 Mahalanobis와 같은 제곱 거리를 데이터 클라우드 의 기하학적 중심 에서 정의 된 스칼라 곱 으로 기하학적으로 정확하게 변환하는 것입니다 . 이 연산은 암묵적으로 코사인 정리를 기반으로합니다 . 다변량 데이터 구멍 사이의 제곱 유클리드 거리 행렬이 있다고 가정합니다. 넌 (다변량 평균) 클라우드의 중심을 찾아 해당 내적 (내적)에 의해 각 페어의 거리를 바꿀이를 거리에 기초 링크에 도시 된 바와 같이, s는 중심하고 그 벡터 사이의 각도. 의 스칼라 제품의 매트릭스의 대각선 상에 서서h 2 h 1 h 2 코스hh2h1h2코사인비 대각선 항목입니다. 그런 다음 코사인 정리 공식을 직접 사용하면 "이중 센트 레이트"행렬을 제곱 거리 행렬로 쉽게 변환 할 수 있습니다.

설정에서 "이중 센트 레이트"행렬은 구체적으로 유클리드 스칼라 곱이 아닌 모자 행렬 (n-1을 곱한 값)이므로 결과 제곱 거리 행렬은 제곱 유클리드 거리 행렬이 아닌 제곱 마할 라 노비스 거리 행렬입니다.

행렬 표기법에서 : 열 벡터 인 의 대각선 이라고하자 . 열을 정사각 행렬로 전파하십시오. ; 그런 다음 .H ( N - 1 ) D 2 m H L = H + H ' - (2) H ( N - 1 )HH(1)H= {H,H,...}미디엄h2=H+H'2H(1)

SPSS 및 속도 프로브의 코드는 다음과 같습니다.


이 첫 번째 코드 fastPwMahal인용 된 답변 의 @ahfoss 함수 에 해당합니다 . 수학적으로 동일합니다. 그러나 @ahfoss가 대칭 행렬의 삼각형 (요소별로)을 계산하는 동안 (행렬 연산을 통해) 완전한 대칭 행렬 거리를 계산하고 있습니다.

matrix. /*Matrix session in SPSS;
        /*note: * operator means matrix multiplication, &* means usual, elementwise multiplication.
get data. /*Dataset 1000 cases x 400 variables
!cov(data%cov). /*compute usual covariances between variables [this is my own matrix function].
comp icov= inv(cov). /*invert it
call svd(icov,u,s,v). /*svd
comp isqrcov= u*sqrt(s)*t(v). /*COV^(-1/2)
comp Q= data*isqrcov. /*Matrix Q (see ahfoss answer)
!seuclid(Q%m). /*Compute 1000x1000 matrix of squared euclidean distances;
               /*computed here from Q "data" they are the squared Mahalanobis distances.
/*print m. /*Done, print
end matrix.

Time elapsed: 3.25 sec

다음은 속도를 높이기 위해 수정 한 것입니다.

matrix.
get data.
!cov(data%cov).
/*comp icov= inv(cov). /*Don't invert.
call eigen(cov,v,s2). /*Do sdv or eigen decomposition (eigen is faster),
/*comp isqrcov= v * mdiag(1/sqrt(s2)) * t(v). /*compute 1/sqrt of the eigenvalues, and compose the matrix back, so we have COV^(-1/2).
comp isqrcov= v &* (make(nrow(cov),1,1) * t(1/sqrt(s2))) * t(v). /*Or this way not doing matrix multiplication on a diagonal matrix: a bit faster .
comp Q= data*isqrcov.
!seuclid(Q%m).
/*print m.
end matrix.

Time elapsed: 2.40 sec

엑스(엑스'엑스)1엑스'(엑스'엑스)1엑스'solve(X'X,X')

matrix.
get data.
!center(data%data). /*Center variables (columns).
comp hat= data*solve(sscp(data),t(data))*(nrow(data)-1). /*hat matrix, and multiply it by n-1 (i.e. by df of covariances).
comp ss= diag(hat)*make(1,ncol(hat),1). /*Now using its diagonal, the leverages (as column propagated into matrix).
comp m= ss+t(ss)-2*hat. /*compute matrix of squared Mahalanobis distances via "cosine rule".
/*print m.
end matrix.

[Notice that if in "comp ss" and "comp m" lines you use "sscp(t(data))",
 that is, DATA*t(DATA), in place of "hat", you get usual sq. 
 euclidean distances]

Time elapsed: 0.95 sec

0

귀하가 게시 한 공식은 귀하가 컴퓨팅하고 있다고 생각하는 것을 계산하는 것이 아닙니다 (U- 통계).

내가 게시 한 코드 cov(x1)에서 스케일링 행렬로 사용합니다 (이는 데이터의 쌍별 차이의 분산입니다). 사용하고 있습니다 cov(x0)(원래 데이터의 공분산 행렬). 나는 이것이 당신의 실수라고 생각합니다. 페어 와이즈 차이를 사용하는 요점은 데이터의 다변량 분포가 대칭의 중심을 대칭이라는 가정에서 당신을 해소한다는 것입니다 (또는 있기 때문에, 그 문제에 대한 대칭의 중심을 추정해야하기 crossprod(x1)에 비례한다 cov(x1)). 분명히, cov(x0)당신이 그것을 사용함으로써 그것을 잃게됩니다.

이것은 원래 답변에서 링크 된 논문에 잘 설명되어 있습니다.


1
우리는 여기서 두 가지 다른 것에 대해 이야기하고 있다고 생각합니다. 내 방법은 Mahalanobis 거리를 계산하며, 몇 가지 다른 공식에 대해 확인했습니다. 내 스레드 는 이제이 스레드에서 Matteo Fasiolo(및 가정) whuber에 의해 독립적으로 확인되었습니다 . 당신은 다릅니다. 나는 당신이 계산하는 것을 이해하는데 관심이 있지만, 일반적으로 정의 된 Mahalanobis 거리와 분명히 다릅니다.
ahfoss

@ahfoss : 1) mahalanobis는 X와 대칭 점 사이의 거리입니다. 귀하의 경우, X는 * (n-1) / 2 행렬 od 쌍 차이이며, 대칭 중심은 벡터 0_p이며 메트릭은 코드에서 cov (X1)이라고합니다. 2) 먼저 U- 통계량을 사용하는 이유를 스스로에게 물어보십시오. 논문에서 설명 하듯이 cov (x0)를 사용하면 그 목적이 무효화됩니다.
user603

엑스엑스영형

cov(x0)에스에스τ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.