プログラミング言語Rで2つのベクトル間の角度を計算する最も効率的な方法は?
9 に答える
この PDFの 5 ページによると、はベクトルとsum(a*b)
の内積を求めるR コマンドであり、はベクトル のノルムを求めるR コマンドであり、アークコサインの R コマンドです。2 つのベクトル間の角度を計算する R コードは次のようになります。a
b
sqrt(sum(a * a))
a
acos(x)
theta <- acos( sum(a*b) / ( sqrt(sum(a * a)) * sqrt(sum(b * b)) ) )
私の答えは 2 つの部分から成ります。パート 1 は数学です。スレッドのすべての読者に明確さを提供し、それに続く R コードを理解できるようにすることです。パート 2 は R プログラミングです。
パート 1 - 数学
2 つのベクトルxとyの内積は、次のように定義できます。
|| どこで || × || ベクトルxのユークリッド ノルム (L 2ノルムとも呼ばれます) です。
内積の定義を操作すると、次のものが得られます。
ここで、theta はベクトルxとyの間の角度で、ラジアンで表されます。theta は、0 から pi までの閉区間にある値を取ることができることに注意してください。
シータ自体を解くと、次のようになります。
パート 2 - R コード
数学を R コードに変換するには、2 つの行列 (ベクトル) 計算を実行する方法を知る必要があります。内積とユークリッド ノルム (L 2ノルムとして知られる特定のタイプのノルム)。また、逆余弦関数 cos -1に相当する R を知る必要があります。
上から始めます。を参照する?"%*%"
と、内積 (内積とも呼ばれます) は、%*%
演算子を使用して計算できます。を参照する?norm
と、norm()
関数 (基本パッケージ) はベクトルのノルムを返します。ここで対象となるノルムは、L 2ノルム、または R ヘルプ ドキュメントの用語では、「スペクトル」または「2」ノルムです。これはtype
、関数の引数を にnorm()
等しく設定する必要があることを意味し"2"
ます。最後に、R の逆余弦関数は関数で表されacos()
ます。
解決
以下に示すように、数学と関連する R 関数の両方を備えたプロトタイプ関数 (つまり、製品標準ではない関数) を、Base パッケージ関数を使用してまとめることができます。上記の情報が理にかなっている場合、angle()
次の関数はこれ以上コメントしなくても明らかです。
angle <- function(x,y){
dot.prod <- x%*%y
norm.x <- norm(x,type="2")
norm.y <- norm(y,type="2")
theta <- acos(dot.prod / (norm.x * norm.y))
as.numeric(theta)
}
関数をテストする
機能が動作することを確認するためのテスト。x = (2,1) およびy = (1,2)とします。xとyの間の内積は 4 です。xのユークリッド ノルムは sqrt(5) です。yのユークリッド ノルムも sqrt(5) です。cos シータ = 4/5。シータは約 0.643 ラジアンです。
x <- as.matrix(c(2,1))
y <- as.matrix(c(1,2))
angle(t(x),y) # Use of transpose to make vectors (matrices) conformable.
[1] 0.6435011
これが役立つことを願っています!
内積を使用する必要があります。V ₁ = ( x ₁, y ₁, z ₁) とV ₂ = ( x ₂, y ₂, z ₂) があるとします。それから内積をV ₁·<em>V₂ で表します。として計算されます
V ₁·<em>V₂ = x ₁·<em>x₂ + y ₁·<em>y₂ + z ₁·<em>z₂ = | V₁ | · | V ₂| ・cos( θ );
これが意味することは、左側に示されている合計は、ベクトルの絶対値にベクトル間の角度の余弦を掛けた積に等しいということです。ベクトルV ₁ とV ₂ の絶対値は次のように計算されます。
| | V₁ | = √( x ₁² + y ₁² + z ₁²)、および
| V ₂| = √( x ₂² + y ₂² + z ₂²),
したがって、上記の最初の式を並べ替えると、
cos( θ ) = ( x ₁·<em>x₂ + y ₁·<em>y₂ + z ₁·<em>z₂) ÷ (| V ₁|·| V ₂|),
角度を取得するには、 cos( θ ) に適用される arccos 関数 (または逆余弦) が必要です。
arccos 関数に応じて、角度は度またはラジアンになります。
(2 次元ベクトルの場合は、 z座標を忘れて同じ計算を行います。)
幸運を、
ジョン・ドナー
必要なのは内積だと思います。2つのベクトルv,u
(R^n
または他の内積空間内)の場合<v,u>/|v||u|= cos(alpha)
。(alpha
ベクトル間の角度でした)
詳細については、以下を参照してください。