এটি কোড সহ আমার প্রবীণ উত্তরটি অন্য থ্রেড থেকে সরানো সহ প্রসারিত ।
লিনিয়ার সমীকরণের সিস্টেমের সমাধান ব্যবহার করে একটি টুপি ম্যাট্রিক্স পদ্ধতির মাধ্যমে এসপিএসএসে জুড়েওয়ালা মহালানোবিস দূরত্বের বর্গাকার প্রতিসাম্য ম্যাট্রিক্সের গণনা করার জন্য আমি দীর্ঘদিন ধরে যাচ্ছি (এটি কোভারিয়েন্স ম্যাট্রিক্সের বিপরীতকরণের চেয়ে দ্রুত)।
আমি আর ব্যবহারকারীর নই তাই আমি এসপিএসএস-এ এই স্পেসিপিটি @ এফফস'কে পুনরুত্পাদন করার চেষ্টা করেছি যেখানে "আমার" রেসিপিটি রয়েছে, 400 টি ভেরিয়েবল দ্বারা 1000 কেসগুলির একটি ডেটাতে এবং আমি আমার পথটি বেশ দ্রুত খুঁজে পেয়েছি।
এইচ
এইচ ( এন - 1 )এক্স ( এক্স'এক্স )- 1এক্স'এক্স
সুতরাং, ডেটা ম্যাট্রিক্সের কেন্দ্রের কলামগুলি, টুপি ম্যাট্রিক্স গণনা করুন, (এন -1) দ্বারা গুণ করুন এবং ডাবল-কেন্দ্রিংয়ের বিপরীতে অপারেশন করুন। আপনি স্কোয়ারড মহালানোবিস দূরত্বের ম্যাট্রিক্স পান।
জজ2জ1জ2কোসাইন্
আমাদের সেটিংসে, "ডাবল-কেন্দ্রের" ম্যাট্রিক্সটি বিশেষত টুপি ম্যাট্রিক্স (এন -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