Khoảng cách cặp Mahalanobis


18

Tôi cần tính khoảng cách Mahalanobis mẫu trong R giữa mỗi cặp quan sát trong ma trận của hiệp phương sai. Tôi cần một giải pháp hiệu quả, tức là chỉ tính khoảng cách và tốt nhất là thực hiện trong C / RCpp / Fortran, v.v. Tôi giả sử rằng , ma trận hiệp phương sai dân số, chưa biết và sử dụng mẫu ma trận hiệp phương sai ở vị trí của nó.n ( n - 1 ) / 2 Σn×pn(n1)/2Σ

Tôi đặc biệt quan tâm đến câu hỏi này vì dường như không có phương pháp "đồng thuận" nào để tính toán khoảng cách Mahalanobis theo cặp , tức là nó không được thực hiện trong disthàm cũng như trong cluster::daisyhàm. Các mahalanobischức năng không tính toán khoảng cách cặp không có việc làm thêm từ các lập trình viên.

Điều này đã được hỏi ở đây khoảng cách Pairwise Mahalanobis trong R , nhưng các giải pháp ở đó có vẻ không chính xác.

Đây là một (vì đúng nhưng không hiệu quả khủng khiếp n×n khoảng cách được tính) phương pháp:

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))))

Điều này đủ dễ để tự viết mã bằng C, nhưng tôi cảm thấy như một cái gì đó cơ bản này nên có một giải pháp có sẵn. Có một cái không?

Có nhiều giải pháp khác mà rơi ngắn: HDMD::pairwise.mahalanobis()tính toán của n×n khoảng cách, khi chỉ có n(n1)/2 khoảng cách độc đáo được yêu cầu. compositions::MahalanobisDist()có vẻ đầy hứa hẹn, nhưng tôi không muốn chức năng của mình đến từ gói phụ thuộc vào rgl, điều này hạn chế nghiêm trọng khả năng chạy mã của tôi. Trừ khi việc thực hiện này là hoàn hảo, tôi muốn tự viết. Bất cứ ai có kinh nghiệm với chức năng này?


Chào mừng bạn Bạn có thể in hai ma trận khoảng cách trong câu hỏi của bạn? Và "không hiệu quả" đối với bạn là gì?
ttnphns

1
Bạn chỉ sử dụng ma trận hiệp phương sai mẫu? Nếu vậy, thì điều này tương đương với 1) định tâm X; 2) tính toán SVD của trung tâm X, nói UDV '; 3) tính toán khoảng cách theo cặp giữa các hàng của U.
vqv

Cảm ơn đã đăng bài này như một câu hỏi. Tôi nghĩ rằng công thức của bạn là không chính xác. Xem câu trả lời của tôi dưới đây.
dùng603

@vqv Có, ma trận hiệp phương sai mẫu. Bài viết gốc được chỉnh sửa để phản ánh điều này.
ahfoss

Xem thêm số liệu thống kê câu hỏi rất giống nhau.stackexchange.com / q / 33518/3277 .
ttnphns

Câu trả lời:


21

Bắt đầu từ giải pháp "succint" của ahfoss, tôi đã sử dụng phân tách Cholesky thay cho SVD.

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

Nó nên nhanh hơn, bởi vì giải quyết chuyển tiếp một hệ tam giác nhanh hơn sau đó nhân ma trận dày đặc với hiệp phương sai nghịch đảo ( xem tại đây ). Dưới đây là điểm chuẩn với các giải pháp của ahfoss và whuber trong một số cài đặt:

 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

Vì vậy, Cholesky dường như nhanh hơn đồng đều.


3
+1 Tốt lắm! Tôi đánh giá cao lời giải thích tại sao giải pháp này nhanh hơn.
whuber

Làm thế nào maha (), cung cấp cho bạn ma trận khoảng cách theo cặp, trái ngược với chỉ khoảng cách đến một điểm?
sheß

1
Bạn đúng, không, vì vậy chỉnh sửa của tôi không hoàn toàn phù hợp. Tôi sẽ xóa nó, nhưng có thể một ngày nào đó tôi sẽ thêm phiên bản cặp đôi của maha () vào gói. Cảm ơn đã chỉ ra điều này.
Matteo Fasiolo

1
Điều đó thật đáng yêu! Đang chờ nó.
sheß

9

Công thức chuẩn cho khoảng cách Mahalanobis bình phương giữa hai điểm dữ liệu là

D12= =(x1-x2)TΣ-1(x1-x2)

Trong đó là vectơ p × 1 tương ứng với quan sát i . Thông thường, ma trận hiệp phương sai được ước tính từ dữ liệu quan sát được. Không tính nghịch đảo ma trận, thao tác này yêu cầu phép nhân p 2 + p và phép cộng p 2 + 2 p , mỗi lần lặp n ( n - 1 ) / 2 lần.xTôip×1Tôip2+pp2+2pn(n-1)/2

Hãy xem xét các dẫn xuất sau:

D12= =(x1-x2)TΣ-1(x1-x2)= =(x1-x2)TΣ-12Σ-12(x1-x2)= =(x1TΣ-12-x2TΣ-12)(Σ-12x1-Σ-12x2)= =(q1T-q2T)(q1-q2)

trong đó . Lưu ý rằngxTiΣ-1qTôi= =Σ-12xTôi. Điều này phụ thuộc vào thực tế làΣ-1xTôiTΣ-12= =(Σ-12xTôi)T= =qTôiT là đối xứng, do thực tế là đối với bất kỳ ma trận đường chéo đối xứngA=PEPT,Σ-12Một= =PEPT

Một12T= =(PE12PT)T= =PTTE12TPT= =PE12PT= =Một12

Nếu chúng ta để cho , và lưu ý rằng Σ - 1 là đối xứng, chúng ta thấy rằng Σ - 1Một= =Σ-1Σ-1 cũng phải đối xứng. NếuXlàma trậnn×pcủa các quan sát vàQlàma trậnn×psao cho hàngithcủaQqi, thìQcó thể được biểu thị ngắn gọn làXΣ-1Σ-12Xn×pQn×pTôithQqTôiQ . Điều này và kết quả trước đó ngụ ý rằngXΣ-12

các phép toán duy nhất được tính n ( n - 1 ) / 2 lần làphép nhân p và phép cộng 2 p (trái ngược vớiphép nhân p 2 + p p 2 + 2 p

Dk= =ΣTôi= =1p(QkTôi-QTôi)2.
n(n-1)/2p2pp2+pp2+2pbổ sung trong phương pháp trên), dẫn đến một thuật toán có thứ tự độ phức tạp tính toán thay vì O ban đầu ( p 2 n 2 ) .Ôi(pn2+p2n)Ôi(p2n2)
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)
}

Hấp dẫn. Xin lỗi, tôi không biết R. Bạn có thể tiết lộ những gì pair.diff()không và cũng đưa ra một ví dụ số với bản in của mỗi bước của chức năng của bạn? Cảm ơn.
ttnphns

Tôi đã chỉnh sửa câu trả lời để bao gồm đạo hàm biện minh cho các tính toán này, nhưng tôi cũng đã đăng một câu trả lời thứ hai có chứa mã ngắn gọn hơn nhiều.
ahfoss

7

Hãy thử điều hiển nhiên. Từ

DTôij= =(xTôi-xj)'Σ-1(xTôi-xj)= =xTôi'Σ-1xTôi+xj'Σ-1xj-2xTôi'Σ-1xj

nó theo sau chúng ta có thể tính toán vectơ

bạnTôi= =xTôi'Σ-1xTôi

trong thời gian và ma trậnÔi(p2)

V= =XΣ-1X'

trong thời gian , rất có thể sử dụng các hoạt động mảng nhanh (song song) tích hợp, và sau đó hình thành giải pháp nhưÔi(pn2+p2n)

D= =bạnbạn-2V

nơi là sản phẩm ngoài có liên quan đến với + : ( một b ) i j = một i + b j .+(mộtb)Tôij= =mộtTôi+bj.

Một Rthực hiện một cách ngắn gọn song song với việc xây dựng toán học (và giả định, với nó, rằng thực sự là khả nghịch với nghịch đảo bằng văn bản h đây):Σ= =Var(X)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)]
}

Lưu ý, đối với khả năng tương thích với các giải pháp khác, chỉ trả về các phần tử đường chéo duy nhất, thay vì toàn bộ ma trận khoảng cách bình phương (đối xứng, không trên đường chéo). Scatterplots cho thấy kết quả của nó đồng ý với những người fastPwMahal.

Trong C hoặc C ++, RAM có thể được tái sử dụng và tính một cách nhanh chóng, obviating bất kỳ nhu cầu lưu trữ trung gian của u u .bạnbạnbạnbạn

Các nghiên cứu về thời gian với dao động từ 33 đến 5000p từ 10 đến 100 cho thấy việc thực hiện này nhanh hơn 1,5 đến 5 lần so với trong phạm vi đó. Sự cải thiện trở nên tốt hơn khi pn tăng lên. Do đó, chúng ta có thể mong đợi là vượt trội cho p nhỏ hơn . Sự hòa vốn xảy ra xung quanh p = 7 với n 100n335000p101001,55fastPwMahalpnfastPwMahalpp= =7n100. Liệu các lợi thế tính toán tương tự của giải pháp đơn giản này có liên quan đến các triển khai khác hay không có thể là vấn đề họ tận dụng các hoạt động mảng được vector hóa tốt như thế nào.


Có vẻ tốt. Tôi cho rằng nó có thể được thực hiện nhanh hơn nữa bằng cách chỉ tính các đường chéo thấp hơn, mặc dù tôi không thể nghĩ ra cách nào để làm điều này trong R mà không làm mất hiệu suất nhanh chóng applyouter... ngoại trừ việc thoát ra Rcpp.
ahfoss

áp dụng / bên ngoài không có lợi thế về tốc độ so với các vòng vanilla đồng bằng.
dùng603

@ user603 Tôi hiểu rằng về nguyên tắc - nhưng hãy thực hiện đúng lúc. Hơn nữa, điểm chính của việc sử dụng các cấu trúc này là cung cấp trợ giúp ngữ nghĩa cho việc song song hóa thuật toán: sự khác biệt trong cách chúng thể hiện nó là quan trọng. (Có thể đáng để nhớ lại câu hỏi ban đầu tìm cách triển khai C / Fortran / v.v.) Ahfoss, tôi đã nghĩ về việc giới hạn phép tính cho tam giác dưới và đồng ý rằng Rdường như không có gì để đạt được điều đó.
whuber

5

Nếu bạn muốn tính khoảng cách Mahalanobis mẫu , thì có một số thủ thuật đại số mà bạn có thể khai thác. Tất cả đều dẫn đến tính toán khoảng cách Euclide theo cặp, vì vậy hãy giả sử chúng ta có thể sử dụng dist()cho điều đó. Đặt là ma trận dữ liệu n × p , mà chúng ta giả sử là trung tâm sao cho các cột của nó có giá trị 0 và có thứ hạng p sao cho ma trận hiệp phương sai mẫu không có giá trị. (Định tâm yêu cầu các thao tác O ( n p ) .) Sau đó, ma trận hiệp phương sai mẫu là S = X T X / n .Xn×ppÔi(np)

S= =XTX/n.

Khoảng cách Mahalanobis mẫu của cũng giống như khoảng cách Euclide cặp của X L cho bất kỳ ma trận L nào thỏa mãn L L T = S - 1 , ví dụ: căn bậc hai hoặc hệ số Cholesky. Điều này xuất phát từ một số đại số tuyến tính và nó dẫn đến một thuật toán yêu cầu tính toán S , S - 1 và phân tách Cholesky. Độ phức tạp trường hợp xấu nhất là O ( n p 2 + p 3 ) .X

XL
LLLT= =S-1SS-1Ôi(np2+p3)

Sâu hơn, những khoảng cách liên quan đến khoảng cách giữa các thành phần chủ yếu mẫu của . Hãy để X = U D V T biểu thị SVD của X . Khi đó S = V D 2 V TXX= =BạnDVTX S - 1 / 2 = V D - 1 V T n 1 / 2 . Vì vậy, X S - 1 / 2 = U V T n 1

S= =VD2VT/n
S-1/2= =VD-1VTn1/2.
và mẫu Mahalanobis khoảng cách chỉ là khoảng cách Euclide cặp củaUthu nhỏ lại bởi một nhân tố của
XS-1/2= =BạnVTn1/2
Bạn , bởi vì khoảng cách Euclide là bất biến xoay vòng. Điều này dẫn đến một thuật toán yêu cầu tính toán SVD củaXcó độ phức tạp trường hợp xấu nhấtO(np2)khin>p.nXÔi(np2)n>p

Đây là một triển khai R của phương pháp thứ hai mà tôi không thể kiểm tra trên iPad mà tôi đang sử dụng để viết câu trả lời này.

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

Đây là một giải pháp ngắn gọn hơn nhiều. Nó vẫn dựa trên đạo hàm liên quan đến ma trận hiệp phương sai căn bậc hai (xem câu trả lời khác của tôi cho câu hỏi này), nhưng chỉ sử dụng cơ sở R và gói số liệu thống kê. Nó dường như nhanh hơn một chút (nhanh hơn khoảng 10% trong một số điểm chuẩn tôi đã chạy). Lưu ý rằng nó trả về khoảng cách Mahalanobis, trái ngược với khoảng cách Maha bình phương.

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

Hàm này yêu cầu ma trận hiệp phương sai nghịch đảo và không trả về một đối tượng khoảng cách - nhưng tôi nghi ngờ rằng phiên bản rút gọn này của hàm sẽ hữu dụng hơn đối với người dùng trao đổi.


3
Điều này có thể được cải thiện bằng cách thay thế SQRTbằng phân tách Cholesky chol(invCovMat).
vqv

1

n2

Nếu bạn chỉ sử dụng các tính năng của Fortran77 trong giao diện, chương trình con của bạn vẫn đủ khả năng di động cho người khác.


1

Có một cách rất dễ dàng để làm điều đó bằng cách sử dụng Gói "biotools". Trong trường hợp này, bạn sẽ nhận được Ma trận Mahalanobis bình phương.

#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)

Bạn có thể vui lòng giải thích cho tôi một ma trận khoảng cách bình phương có nghĩa là gì? Một cách tôn trọng: Tôi quan tâm đến khoảng cách giữa hai điểm / vectơ vậy ma trận nói lên điều gì?
Ben

1

Đây là phần mở rộng với mã câu trả lời cũ của tôi được chuyển đến đây từ một chủ đề khác .

Tôi đã thực hiện một tính toán trong một thời gian dài của một ma trận đối xứng vuông có khoảng cách Mahalanobis theo cặp trong SPSS thông qua cách tiếp cận ma trận mũ bằng cách giải hệ phương trình tuyến tính (vì nó nhanh hơn so với đảo ngược ma trận hiệp phương sai).

Tôi không phải là người dùng R nên tôi đã thử sao chép @ahfoss ' công thức này ở đây trong SPSS cùng với công thức "của tôi", trên dữ liệu 1000 trường hợp bằng 400 biến và tôi đã tìm thấy cách của mình nhanh hơn đáng kể.


H

Định nghĩaH(n-1)X(X'X)-1X'X

Vì vậy, các cột trung tâm của ma trận dữ liệu, tính toán ma trận mũ, nhân với (n-1) và thực hiện thao tác ngược lại với định tâm kép. Bạn có được ma trận khoảng cách Mahalanobis bình phương.

hh2h1h2cos

Trong cài đặt của chúng tôi, ma trận "nhân đôi" đặc biệt là ma trận (nhân với n-1), không phải là các sản phẩm vô hướng euclide và ma trận khoảng cách bình phương kết quả là ma trận khoảng cách Mahalanobis bình phương, không phải ma trận khoảng cách euclide bình phương.

Trong ký hiệu ma trận: Gọi là đường chéo của H ( n - 1 ) , một vectơ cột. Tuyên truyền cột vào ma trận vuông : ; rồi D 2HH(n-1)H= {H,H,...}Dmmộthmộttôi2= =H+H'-2H(n-1)

Mã trong SPSS và đầu dò tốc độ bên dưới.


Mã đầu tiên này tương ứng với chức năng @ahfoss fastPwMahalcủa câu trả lời được trích dẫn . Nó tương đương với nó về mặt toán học. Nhưng tôi đang tính toán ma trận đối xứng hoàn toàn của khoảng cách (thông qua các phép toán ma trận) trong khi @ahfoss tính toán một tam giác của ma trận đối xứng (yếu tố theo yếu tố).

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

Sau đây là sửa đổi của tôi về nó để làm cho nó nhanh hơn:

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

Cuối cùng là "phương pháp ma trận mũ". Đối với tốc độ, tôi đang tính toán ma trận mũ (các dữ liệu phải được tập trung đầu tiên) X(X'X)-1X'(X'X)-1X'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

Công thức bạn đã đăng không phải là tính toán những gì bạn nghĩ rằng bạn đang tính toán (thống kê U).

Trong mã tôi đã đăng, tôi sử dụng cov(x1)như ma trận chia tỷ lệ (đây là phương sai của sự khác biệt theo cặp của dữ liệu). Bạn đang sử dụng cov(x0)(đây là ma trận hiệp phương sai của dữ liệu gốc của bạn). Tôi nghĩ rằng đây là một sai lầm trong phần của bạn. Toàn bộ quan điểm của việc sử dụng các khác biệt theo cặp là nó giúp bạn thoát khỏi giả định rằng phân phối đa biến của dữ liệu của bạn đối xứng quanh một trung tâm đối xứng (hoặc phải ước tính trung tâm đối xứng cho vấn đề đó, vì crossprod(x1)tỷ lệ thuận với cov(x1)). Rõ ràng, bằng cách sử dụng cov(x0)bạn mất điều đó.

Điều này được giải thích rõ trong bài báo mà tôi liên kết đến trong câu trả lời ban đầu của mình.


1
Tôi nghĩ rằng chúng ta đang nói về hai điều khác nhau ở đây. Phương pháp của tôi tính toán khoảng cách Mahalanobis, mà tôi đã xác minh đối với một vài công thức khác. Công thức của tôi hiện cũng đã được xác minh độc lập bởi Matteo Fasiolovà (tôi giả sử) whubertrong chuỗi này. Của bạn là khác nhau. Tôi muốn tìm hiểu những gì bạn đang tính toán, nhưng nó rõ ràng khác với khoảng cách Mahalanobis như được xác định thông thường.
ahfoss

@ahfoss: 1) mahalanobis là khoảng cách của X đến một điểm đối xứng trong số liệu của chúng. Trong trường hợp của bạn, X là một ma trận * (n-1) / 2 ma trận khác nhau theo cặp, trung tâm đối xứng của chúng là vectơ 0_p và số liệu của chúng là cái mà tôi gọi là cov (X1) trong mã của tôi. 2) tự hỏi tại sao bạn sử dụng thống kê U ở vị trí đầu tiên, và như bài báo giải thích, bạn sẽ thấy rằng sử dụng cov (x0) đánh bại mục đích đó.
dùng603

XXÔip

cov(x0)SGSτLQD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.