পেয়ারওয়াই মহালানোবিস দূরত্ব


18

আমাকে কোভারিয়েটগুলির একটি between ম্যাট্রিক্সে প্রতিটি জোড় পর্যবেক্ষণের মধ্যে আর মধ্যে নমুনা মহালানোবিসের দূরত্ব গণনা করতে হবে । আমি একটি সমাধান কার্যকরী যে প্রয়োজন, অর্থাত্ শুধুমাত্র দূরত্বের গণনা করা হয়, এবং বিশেষ করে সি / RCpp বাস্তবায়িত / ফোরট্রান ইত্যাদি আমি অনুমান যে জনসংখ্যার সহভেদাংক ম্যাট্রিক্স, অজানা এবং নমুনা ব্যবহার covariance ম্যাট্রিক্স তার জায়গায়।এন ( এন - 1 ) / 2 Σn×pn(n1)/2Σ

আমি এই প্রশ্নে বিশেষভাবে আগ্রহী যেহেতু মনে হচ্ছে আর-তে জুটিবদ্ধ মহালানোবিস দূরত্ব গণনা করার জন্য কোনও ".ক্যমত্য" পদ্ধতি নেই বলে মনে হচ্ছে , এটি distফাংশনে বা কার্যক্রমে কার্যকর হয় না cluster::daisymahalanobisফাংশন প্রোগ্রামার থেকে অতিরিক্ত কাজ ছাড়া pairwise দূরত্বের হিসাব নেই।

এটি ইতিমধ্যে এখানে আরে জোড়ের দিকের মহালানোবিসের দূরত্ব জিজ্ঞাসা করা হয়েছিল , তবে সেগুলির সমাধানগুলি ভুল বলে মনে হচ্ছে।

এখানে একটি সঠিক তবে মারাত্মকভাবে অক্ষম (যেহেতু দূরত্ব গণনা করা হয়) পদ্ধতি:n×n

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

এটি নিজেকে সি তে কোড করার পক্ষে যথেষ্ট সহজ, তবে আমি মনে করি কিছুটা এই বেসিকের একটি পূর্বনির্ধারিত সমাধান থাকা উচিত। একটি আছে?

অন্যান্য সমাধানগুলি সংক্ষিপ্ত হয়: দূরত্ব HDMD::pairwise.mahalanobis()গণনা করে , যখন কেবল অনন্য দূরত্ব প্রয়োজন। প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে তবে আমি চাই না যে আমার ফাংশন এমন কোনও প্যাকেজ থেকে আসে যা নির্ভর করে , যা আমার কোড চালানোর জন্য অন্যের ক্ষমতাকে মারাত্মকভাবে সীমাবদ্ধ করে। যদি এই বাস্তবায়নটি নিখুঁত না হয় তবে আমি বরং নিজের লেখা চাই। এই ফাংশন নিয়ে কারও অভিজ্ঞতা আছে?এন ( এন - 1 ) / 2n×nএন(এন-1)/2compositions::MahalanobisDist()rgl


স্বাগত. আপনি কি আপনার প্রশ্নে দূরত্বের দুটি ম্যাট্রিকেস মুদ্রণ করতে পারবেন? এবং আপনার জন্য "অদক্ষ" কি?
ttnphns

1
আপনি কি কেবল নমুনা কোভেরিয়েন্স ম্যাট্রিক্স ব্যবহার করছেন? যদি তা হয় তবে এটি 1) কেন্দ্রীভূত এক্স এর সমতুল্য; 2) কেন্দ্রিক এক্স এর এসভিডি কম্পিউটিং, ইউডিভি বলুন '; 3) মার্কিন যুক্তরাষ্ট্রে
vqv

এটি একটি প্রশ্ন হিসাবে পোস্ট করার জন্য ধন্যবাদ। আমি মনে করি যে আপনার সূত্রটি সঠিক নয়। আমার উত্তর নীচে দেখুন।
ব্যবহারকারী 60

@vqv হ্যাঁ, নমুনা কোভেরিয়েন্স ম্যাট্রিক্স। মূল পোস্টটি এটি প্রতিফলিত করতে সম্পাদিত হয়।
আহফস

খুব অনুরূপ প্রশ্ন stats.stackexchange.com/q/33518/3277 দেখুন
ttnphns

উত্তর:


21

আহফসসের "সাকসিন্ট" সমাধান থেকে শুরু করে, আমি এসভিডির জায়গায় কোলেস্কি পচন ব্যবহার করেছি।

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

এটি আরও দ্রুত হওয়া উচিত, কারণ ত্রিভুজাকার সিস্টেমকে ফরোয়ার্ড-সমাধান করা দ্রুত হয় তবে বিপরীত কোভারিয়েন্সের সাথে ঘন ম্যাট্রিক্সের গুণটি ( এখানে দেখুন )। বেশ কয়েকটি সেটিংসে অহফসস এবং হুশহুসের সমাধান সহ মানদণ্ড এখানে রয়েছে:

 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

তাই কোলেস্কি সমান দ্রুত বলে মনে হচ্ছে।


3
+1 ভাল হয়েছে! এই সমাধানটি কেন দ্রুত হয় তার ব্যাখ্যাটির জন্য আমি প্রশংসা করি।
হোবার

কীভাবে মহা () আপনাকে একজোড়া দূরত্বের বিপরীতে জোড়াযুক্ত দূরত্ব-ম্যাট্রিক্স দেয়?
সে

1
আপনি ঠিক বলেছেন, এটি হয় না তাই আমার সম্পাদনা সম্পূর্ণ প্রাসঙ্গিক নয়। আমি এটি মুছে ফেলব, তবে সম্ভবত একদিন আমি প্যাকেজে মাহা () এর জোড়াযুক্ত সংস্করণ যুক্ত করব। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
মাত্তেও ফ্যাসিওলো

1
যে আনন্দদায়ক হতে হবে! এটির অপেক্ষায় রইলাম।
সে

9

দুটি ডেটা পয়েন্টের মধ্যে স্কোয়ারড মহালানোবিসের দূরত্বের জন্য আদর্শ সূত্র

D12=(x1x2)TΣ1(x1x2)

যেখানে পর্যবেক্ষণের সাথে সম্পর্কিত একটি p ob 1 ভেক্টর i । সাধারণত পর্যবেক্ষণ করা ডেটা থেকে কোভেরিয়েন্স ম্যাট্রিক্স অনুমান করা হয়। ম্যাট্রিক্স বিপর্যয় গণনা করা হচ্ছে না, এই ক্রিয়াকলাপে পি 2 + পি গুণ এবং পি 2 + 2 পি সংযোজন, প্রতিটি পুনরাবৃত্তি এন ( এন - 1 ) / 2 বার প্রয়োজন।xip×1ip2+pp2+2pএন(এন-1)/2

নিম্নলিখিত উপকরণ বিবেচনা করুন:

ডি12=(এক্স1-এক্স2)টিΣ-1(এক্স1-এক্স2)=(এক্স1-এক্স2)টিΣ-12Σ-12(এক্স1-এক্স2)=(এক্স1টিΣ-12-এক্স2টিΣ-12)(Σ-12এক্স1-Σ-12এক্স2)=(কুই1টি-কুই2টি)(কুই1-কুই2)

যেখানে । নোট করুন যেএক্সটিআইΣ-1কুইআমি=Σ-12এক্সআমি। এটিΣ-1 এরউপর নির্ভর করেএক্সআমিটিΣ-12=(Σ-12এক্সআমি)টি=কুইআমিটি হ'ল প্রতিসম, যা কোনও প্রতিসাম্যযুক্ত তির্যক ম্যাট্রিক্স=পিপিটি এর কারণে,Σ-12একজন=পিপিটি

একজন12টি=(পি12পিটি)টি=পিটিটি12টিপিটি=পি12পিটি=একজন12

যদি আমরা এবং নোট করুন যে Σ - 1 টি প্রতিসম হয়, আমরা দেখতে পাই যে এটি Σ - 1একজন=Σ-1Σ-1 অবশ্যই প্রতিসম হতে হবে। তাহলেএক্সহয়এন×পিপর্যবেক্ষণ ম্যাট্রিক্স এবংপ্রশ্নহলএন×পিম্যাট্রিক্স যেমন যেআমিটিসারিপ্রশ্নহলকুইআমি, তারপরপ্রশ্নsuccinctly যেমন প্রকাশ করা যেতে পারেএক্সΣ-1Σ-12এক্সএন×পিপ্রশ্নঃএন×পিআমিটিপ্রশ্নঃকুইআমিপ্রশ্নঃ । এটি এবং পূর্ববর্তী ফলাফলগুলি বোঝায়এক্সΣ-12

n ( n - 1 ) / 2 বার গণনা করা কেবলমাত্র অপারেশনগুলিহল পি গুণ এবং 2 পি সংযোজন ( পি 2 + পি গুণ এবং পি 2 + 2 পি এর বিপরীতে

ডি=Σআমি=1পি(প্রশ্নঃআমি-প্রশ্নঃআমি)2
এন(এন-1)/2পি2পিপি2+ +পিপি2+ +2পিউপরোক্ত পদ্ধতিতে সংযোজন), এর ফলে একটি অ্যালগরিদম আসল ( পি 2 এন 2 ) এর পরিবর্তে গণনা সংক্রান্ত জটিলতার অর্ডার হয় ।হে(পিএন2+ +পি2এন)হে(পি2এন2)
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)
}

মজাদার. দুঃখিত, আমি আর জানি না। আপনি কি করতে পারেন pair.diff()এবং আপনার ফাংশনের প্রতিটি পদক্ষেপের প্রিন্টআউটগুলির সাথে একটি সংখ্যার উদাহরণও দিতে পারেন? ধন্যবাদ।
ttnphns

আমি এই গণনাগুলিকে ন্যায্যতাযুক্ত ডেরাইভেশন অন্তর্ভুক্ত করার জন্য উত্তরটি সম্পাদনা করেছি, তবে আমি আরও একটি সংক্ষিপ্ত কোড সহ একটি দ্বিতীয় উত্তরও পোস্ট করেছি।
আহফস

7

আসুন চেষ্টা করা যাক। থেকে

ডিআমি=(এক্সআমি-এক্স)'Σ-1(এক্সআমি-এক্স)=এক্সআমি'Σ-1এক্সআমি+ +এক্স'Σ-1এক্স-2এক্সআমি'Σ-1এক্স

এটি অনুসরণ করে আমরা ভেক্টর গণনা করতে পারি

তোমার দর্শন লগ করাআমি=এক্সআমি'Σ-1এক্সআমি

মধ্যে সময় এবং ম্যাট্রিক্সহে(পি2)

ভী=এক্সΣ-1এক্স'

মধ্যে সময়, সম্ভবত বিল্ট-ইন দ্রুত (parallelizable) অ্যারে অপারেশন ব্যবহার করে, এবং তারপর হিসাবে সমাধান গঠনহে(পিএন2+ +পি2এন)

ডি=তোমার দর্শন লগ করাতোমার দর্শন লগ করা-2ভী

যেখানে হ'ল + : ( a b ) i j = a i + b j এর সাথে বাইরের পণ্য + +(একটি)আমি=একটিআমি+ +

একটি Rবাস্তবায়ন সংক্ষেপে গাণিতিক গঠনের সাথে সমান্তরাল হয় (এবং ধরে নেওয়া হয়, এটি দিয়ে যে আসলে এখানে বিপরীত লিখিত এইচ দিয়ে বিভক্ত ):Σ=var(এক্স)

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 ++, র্যাম পুনরায় ব্যবহার করা যাবে এবং মাছি উপর নির্ণিত, এর মধ্যবর্তী সঞ্চয়ের জন্য দরকার obviating তোমার দর্শন লগ করা তোমার দর্শন লগ করাতোমার দর্শন লগ করাতোমার দর্শন লগ করাতোমার দর্শন লগ করাতোমার দর্শন লগ করা

সঙ্গে অধ্যয়ন টাইমিং ছোটো থেকে 33 মাধ্যমে 5000 এবং পি ছোটো থেকে 10 থেকে 100 ইঙ্গিত এই বাস্তবায়ন 1.5 থেকে 5 বার তুলনায় দ্রুততর যে পরিসীমা মধ্যে। P এবং n বৃদ্ধি পাওয়ার সাথে সাথে উন্নতি আরও ভাল হয় । ফলস্বরূপ, আমরা আরও কম পি জন্য উন্নত হতে পারে আশা করতে পারেন । বিরতি-এমনকি প্রায় ঘটে পি = 7 জন্য এন 100এন335000পি101001.55fastPwMahalপিএনfastPwMahalপিপি=7এন100। অন্যান্য বাস্তবায়নের ক্ষেত্রে এই সরল সমাধানের একই গণ্য সুবিধাগুলি ভেক্টরাইজড অ্যারে ক্রিয়াকলাপ থেকে তারা কতটা সুবিধা নেয় তা বিবেচ্য বিষয় হতে পারে।


ভাল লাগছে। আমি এটা মাত্র নিম্ন কর্ণ গণনা করে আরও বেশি দ্রুত করা সম্ভব হয়েছে, যদিও আমি বন্ধ সরাসরি দ্রুত কর্মক্ষমতা হারানো ছাড়া আর এই কাজটি করার জন্য একটি উপায় মনে করতে পারেন অনুমান applyএবং outer... আউট ভঙ্গ ছাড়া Rcpp
আহফস

প্লেইন-ভ্যানিলা লুপগুলির উপরে প্রয়োগ / বাহিরের কোনও গতির সুবিধা নেই
ব্যবহারকারী 60

@ ব্যবহারকারী 603 আমি নীতিগতভাবে এটি বুঝতে পারি - তবে সময় নির্ধারণ করুন। তদুপরি, এই কনস্ট্রাক্টগুলি ব্যবহারের মূল বিষয়টি হল অ্যালগোরিদমের সমান্তরাল করার জন্য শব্দার্থ সহায়তা প্রদান: তারা কীভাবে এটি প্রকাশ করে তার মধ্যে পার্থক্য গুরুত্বপূর্ণ। (এটি মূল প্রশ্নটি সি / ফোর্টরান / ইত্যাদি বাস্তবায়ন প্রত্যাহারের জন্য মূল্যবান হতে পারে)) আহফস, আমি গণনাটিও নীচের ত্রিভুজের মধ্যে সীমাবদ্ধ করার বিষয়ে ভেবেছিলাম এবং তাতে সম্মত Rহয়েছি যে এর দ্বারা লাভ করার কিছুই নেই বলে মনে হয়।
whuber

5

আপনি যদি নমুনা মহালানোবিসের দূরত্ব গণনা করতে চান তবে কিছু বীজগণিত কৌশল রয়েছে যা আপনি কাজে লাগাতে পারেন। তারা সকলেই যুগলতরূপে ইউক্লিডিয়ান দূরত্বগুলি গণনা করতে পরিচালিত করে, তাই আমরা ধরে নিই আমরা এর dist()জন্য ব্যবহার করতে পারি । যাক বোঝাতে এন × P তথ্য ম্যাট্রিক্স, যা আমরা যে তার কলাম আছে তাই কেন্দ্রে থাকা উচিত অনুমান গড় 0 এবং র্যাঙ্ক আছে পি যাতে নমুনা সহভেদাংক ম্যাট্রিক্স nonsingular হয়। (কেন্দ্রীকরণের জন্য ( এন পি ) অপারেশন প্রয়োজন ) ) তারপরে নমুনা কোভারিয়েন্স ম্যাট্রিক্সটি এস = এক্স টি এক্স / এন এক্সএন×পিপিহে(এনপি)

এস=এক্সটিএক্স/এন

এর pairwise নমুনা মহলানবিশ দূরত্বের এর pairwise ইউক্লিডিয় দুরুত্ব হিসাবে একই এক্স এল কোনো ম্যাট্রিক্স জন্য এল পরিতৃপ্ত এল এল টি = এস - 1 , যেমন বর্গমূল বা Cholesky ফ্যাক্টর। এটি কিছু লিনিয়ার বীজগণিত থেকে অনুসরণ করে এটি একটি অ্যালগরিদমের দিকে নিয়ে যায় যা এস , এস - 1 এর গণনা এবং কোলেস্কির পচে যাওয়া প্রয়োজন। সবচেয়ে খারাপ ক্ষেত্রে জটিলতা হ'ল ( এন পি 2 + পি 3 )এক্স

এক্সএল
এলএলএলটি=এস-1এসএস-1হে(এনপি2+ +পি3)

আরও গভীরভাবে, এই দূরত্বগুলি এর নমুনা মূল উপাদানগুলির মধ্যে দূরত্বগুলির সাথে সম্পর্কিত । যাক এক্স = ইউ ডি ভি টি এর SVD বোঝাতে এক্স । তারপর এস = ভী ডি 2 ভী টি / এন এবং এস - 1 / 2 = ভী ডি - 1 ভী টি এন 1 / 2তাই এক্স এস - 1 / 2 = ইউ ভি টি এন 1এক্সএক্স=ইউডিভীটিএক্স

এস=ভীডি2ভীটি/এন
এস-1/2=ভীডি-1ভীটিএন1/2
এবং নমুনা মহলানবিশ দূরত্বের মাত্র এর pairwise ইউক্লিডিয় দুরুত্বইউএকটি গুণক দ্বারা স্কেল করা
এক্সএস-1/2=ইউভীটিএন1/2
ইউ , কারণ ইউক্লিডিয়ান দূরত্বটি আবর্তন অলৌকিক। এটি একটি অ্যালগরিদমের দিকে নিয়ে যায় যাতেএক্সএর এসভিডি গণনা প্রয়োজনযা সবচেয়ে খারাপ ক্ষেত্রে জটিলতাO(np2) থাকেযখনএন>পি হয়এনএক্সহে(এনপি2)এন>পি

এখানে দ্বিতীয় পদ্ধতির একটি আর বাস্তবায়ন যা আমি এই উত্তরটি লেখার জন্য ব্যবহার করছি সেই আইপ্যাডে পরীক্ষা করতে পারছি না।

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

এটি অনেক বেশি সংক্ষিপ্ত সমাধান। এটি এখনও বিপরীতমুখী স্কোয়ার রুট কোভারিয়েন্স ম্যাট্রিক্সের জড়িত ডাইরিভিশনের উপর ভিত্তি করে (এই প্রশ্নের আমার উত্তরটি দেখুন) তবে কেবল বেস আর এবং স্ট্যাটাস প্যাকেজটি ব্যবহার করে। এটি সামান্য দ্রুত বলে মনে হচ্ছে (আমি চালিত কিছু মানদণ্ডে প্রায় 10% দ্রুত)। নোট করুন যে এটি বর্ধিত মহা দূরত্বের বিপরীতে মহালানোবিস দূরত্ব ফিরিয়ে দেয়।

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

এই ফাংশনটির জন্য একটি বিপরীত কোভেরিয়েন্স ম্যাট্রিক্স প্রয়োজন, এবং কোনও দূরত্বের কোনও জিনিস ফেরত দেয় না - তবে আমার সন্দেহ হয় যে ফাংশনটির এই স্ট্রিপড ডাউন সংস্করণ এক্সচেঞ্জ ব্যবহারকারীদের স্ট্যাক করার জন্য আরও সাধারণভাবে কার্যকর হবে।


3
SQRTCholesky পচন সঙ্গে প্রতিস্থাপন করে এটি উন্নত করা যেতে পারে chol(invCovMat)
vqv

1

এন2

আপনি যদি কেবল ইন্টারফেসে ফোর্টরান 7777-বৈশিষ্ট্যগুলি ব্যবহার করেন তবে আপনার সাবরোটাইন এখনও অন্যের জন্য যথেষ্ট পোর্টেবল।


1

আর প্যাকেজ "বায়োটুলগুলি" ব্যবহার করে এটি করার একটি খুব সহজ উপায়। এক্ষেত্রে আপনি একটি স্কোয়ার দূরত্বের মহালানোবিস ম্যাট্রিক্স পাবেন।

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

স্কোয়ার দূরত্বের ম্যাট্রিক্স বলতে কী বোঝাতে পারো? বিশেষত: আমি দুটি পয়েন্ট / ভেক্টরগুলির মধ্যে দূরত্বের বিষয়ে আগ্রহী তাই একটি ম্যাট্রিক্স কী বলে?
বেন

1

এটি কোড সহ আমার প্রবীণ উত্তরটি অন্য থ্রেড থেকে সরানো সহ প্রসারিত ।

লিনিয়ার সমীকরণের সিস্টেমের সমাধান ব্যবহার করে একটি টুপি ম্যাট্রিক্স পদ্ধতির মাধ্যমে এসপিএসএসে জুড়েওয়ালা মহালানোবিস দূরত্বের বর্গাকার প্রতিসাম্য ম্যাট্রিক্সের গণনা করার জন্য আমি দীর্ঘদিন ধরে যাচ্ছি (এটি কোভারিয়েন্স ম্যাট্রিক্সের বিপরীতকরণের চেয়ে দ্রুত)।

আমি আর ব্যবহারকারীর নই তাই আমি এসপিএসএস-এ এই স্পেসিপিটি @ এফফস'কে পুনরুত্পাদন করার চেষ্টা করেছি যেখানে "আমার" রেসিপিটি রয়েছে, 400 টি ভেরিয়েবল দ্বারা 1000 কেসগুলির একটি ডেটাতে এবং আমি আমার পথটি বেশ দ্রুত খুঁজে পেয়েছি।


এইচ

এইচ(এন-1)এক্স(এক্স'এক্স)-1এক্স'এক্স

সুতরাং, ডেটা ম্যাট্রিক্সের কেন্দ্রের কলামগুলি, টুপি ম্যাট্রিক্স গণনা করুন, (এন -1) দ্বারা গুণ করুন এবং ডাবল-কেন্দ্রিংয়ের বিপরীতে অপারেশন করুন। আপনি স্কোয়ারড মহালানোবিস দূরত্বের ম্যাট্রিক্স পান।

212কোসাইন্

আমাদের সেটিংসে, "ডাবল-কেন্দ্রের" ম্যাট্রিক্সটি বিশেষত টুপি ম্যাট্রিক্স (এন -1 দ্বারা গুণিত হয়), ইউক্লিডিয়ান স্কেলার পণ্য নয়, ফলস্বরূপ স্কোয়ারের দূরত্বের ম্যাট্রিক্সটি এইভাবে স্কোয়ারড মহালানোবিস দূরত্বের ম্যাট্রিক্স হয়, স্কুয়ারড ইউক্যালিডিয়ান দূরত্বের ম্যাট্রিক্স নয়।

এইচএইচ(এন-1)H= {H,H,...}ডিমিএকটিএকটি2=এইচ+ +এইচ'-2এইচ(এন-1)

এসপিএসএস এবং গতির তদন্তের কোডটি নীচে।


এই প্রথম কোডটি উদ্ধৃত উত্তরের @Ahfoss ফাংশনের fastPwMahalসাথে সম্পর্কিত । এটি গাণিতিকভাবে সমান। তবে আমি @ মেট্রিক্স ম্যাট্রিক্সের একটি ত্রিভুজকে (উপাদান অনুসারে উপাদান) গণনা করার সময় দূরত্বের (ম্যাট্রিক্স অপারেশনের মাধ্যমে) সমান্তরাল ম্যাট্রিক্সের সম্পূর্ণ গণনা করছি।

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

আপনি যে সূত্রটি পোস্ট করেছেন তা আপনি কী গণনা করছেন বলে গণনা করছেন না (একটি ইউ-স্ট্যাটিস্টিকস)।

আমি যে কোড পোস্ট করেছি তাতে আমি cov(x1)স্কেলিং ম্যাট্রিক্স হিসাবে ব্যবহার করি (এটি ডেটারের জোড়াযুক্ত পার্থক্যের বৈকল্পিক)। আপনি ব্যবহার করছেন cov(x0)(এটি আপনার মূল ডেটার সমবায় ম্যাট্রিক্স)। আমি মনে করি এটি আপনার পক্ষে ভুল। জোড়যুক্ত পার্থক্যগুলি ব্যবহার করার পুরো বিষয়টিটি এটি আপনাকে এই ধারণার হাত থেকে মুক্তি দেয় যে আপনার ডেটার মাল্টিভারিয়েট বিতরণ প্রতিসাম্যের কেন্দ্রের চারপাশে প্রতিসাম্যিক (বা সেই বিষয়ে সমমিতির কেন্দ্রটি অনুমান করতে হবে, যেহেতু crossprod(x1)এটি আনুপাতিক cov(x1))। অবশ্যই, cov(x0)আপনি এটি হারাতে ব্যবহার করে lose

আমি আমার মূল উত্তরের সাথে লিঙ্কিত কাগজে এটি ভালভাবে ব্যাখ্যা করা হয়েছে।


1
আমি মনে করি আমরা এখানে দুটি ভিন্ন জিনিস সম্পর্কে কথা বলছি। আমার পদ্ধতিটি মহালানোবিসের দূরত্ব গণনা করে, যা আমি কয়েকটি অন্যান্য সূত্রের বিরুদ্ধে যাচাই করেছি। আমার সূত্রটিও এখন এই থ্রেডে স্বতন্ত্রভাবে যাচাই করা হয়েছে Matteo Fasioloএবং (আমি ধরে নিই) whuber। আপনার আলাদা। আপনি কী গণনা করছেন তা বোঝার জন্য আমি আগ্রহী, তবে সাধারণত নির্ধারিত হিসাবে এটি মহালানোবিসের দূরত্ব থেকে স্পষ্টতই আলাদা।
আহফস

@ অহফস: ১) মহালানোবিস তাদের মেট্রিকের প্রতিসাম্যের বিন্দু থেকে এক্সের দূরত্ব। আপনার ক্ষেত্রে, এক্সটি একটি * (এন -1) / 2 ম্যাট্রিক্সের জুড়িযুক্ত পার্থক্য, তাদের প্রতিসাম্য কেন্দ্রটি ভেক্টর 0_p এবং তাদের মেট্রিকটি আমি আমার কোডে সিওভি (এক্স 1) বলে। 2) নিজেকে জিজ্ঞাসা করুন আপনি কেন প্রথমে একটি ইউ-স্ট্যাটিস্টিক ব্যবহার করেন এবং কাগজটি ব্যাখ্যা করার সাথে আপনি দেখতে পাবেন যে cov (x0) ব্যবহার করে সেই উদ্দেশ্যটি হেরে যায়।
ব্যবহারকারী 60

এক্সএক্সহেপি

cov(x0)এসজিএসτএলপ্রশ্নঃডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.