2

R パッケージの関数(デフォルト)のように、行列/データ フレーム ( x) を入力し、距離測定値 (例: ) を指定することで、距離行列を作成する R 関数がいくつかあります。R パッケージには、 を拡張する関数(はい、同じ名前) があります。これには、ユーザーが関数、レジストリ エントリ、または近接測定を参照するニーモニック文字列を渡すことができる引数があります。これは、ユーザーが関数としてプログラムされた独自の距離測定を持っている場合に非常に便利です。例 ( のヘルプ ドキュメントから):Euclideandiststatsproxydiststats:distmethodproxy

## input matrix
x <- matrix(rnorm(16), ncol = 4)
## custom distance function
f <- function(x, y) sum(x * y)
dist(x, f)

結果の距離行列は、(たとえば) の行 1 と行 2 の間の距離xが 2.32 であることを示しており、これは として手動で計算できますsum(x[1,]*x[2,])。この関数は と のf2 つの引数xを取ることに注意してください。これらは基本的に、関数yの入力行列の 2 つの行です。つまり、距離の計算は入力行列のみに完全に依存しますxproxy:distx

ここに私の質問があります:入力行列の距離行列も計算したいですx(つまり、行は観測値であり、の行間のペアごとの距離を取得したいですx)。ただし、距離を計算するために使用する関数は、入力行列だけに依存するのではxなく、実際には から派生したいくつかの行列にx依存します。必要な行列を と呼ばれるリストに保存します。このリストprep_matricesは 3 つの行列で構成されています: A,B,C(再現可能な結果のためにこれらを作成しました):

set.seed(111)
A = matrix(rnorm(9), nr=3)
set.seed(222)
B = matrix(rnorm(9), nr=3)
set.seed(333)
C = matrix(rnorm(9), nr=3)

明らかに、入力行列xは 3行 3 列でありprep_matrices$A, prep_matrices$B, prep_matrices$C、 から導出された行列が得られxます。ここで、 の 2 つの行の間の距離が次のxように計算されるとします (たとえば、行 1 と行 2)。

m1 = diag(A[1, ])
m2 = diag(A[2, ])
b1 = B[1, ]
b2 = B[2, ]
c1 = C[1, ]
c2 = C[2, ]
distance = mean(m1 %*% ( (diag(b1)-diag(b2)) %*% (diag(c1)-diag(c2)) %*% m2))

この例は説明のみを目的としていますが、距離がどのように計算されるかを理解していただければ幸いです。次に、いくつかの R 関数にリスト ( ) を渡して距離を直接取得することは不可能かもしれないことに気付きました。これは、prep_matricesより多くの余分な計算が必要であり、最も重要なことに、距離は入力行列ではなく、多くの行列に基づいているためです。派生行列...

この場合、距離行列を取得するために R で効率的にコーディングする方法はありますか? それとも、既存の R 関数を変更できるでしょうか? どうもありがとう!

4

1 に答える 1

4

距離関数がどれほど複雑かによっては、行番号を取り込んでそれら 2 つの行の距離を計算する関数を忘れてdist書くことができます。i,jしたがって、あなたの例では、次のようになります。

ff<-function(i,j) mean(diag(A[i,]) %*% ( (diag(B[i,])-diag(B[j,])) %*% (diag(C[i,])-diag(C[j,])) %*% diag(A[j,])))

次に、これを適用して距離行列を取得できます。1:nrow(x)この場合は

distMatrix<-outer(1:3,1:3,Vectorize(ff))

ベクトル化された関数Vectorizeが必要なため、が必要です。outer

于 2013-10-02T23:53:19.063 に答える