Iは、近い番号が近は、コサイン距離を使用して測定することができ、また、ベクトル空間に近いようなベクトル空間の一部の範囲内の実数を表したいです。 -1近いコサイン類似度を有するべきである0-100、9と10の間に例えば番号
は、近く1,9及び100に余弦類似性を有するべきです。このようなマッピングを実現するにはどうすればよい
?私は神経ネットエンコーダを試してみたいと思っていますが、これを実現する他の方法があります。
Iは、近い番号が近は、コサイン距離を使用して測定することができ、また、ベクトル空間に近いようなベクトル空間の一部の範囲内の実数を表したいです。 -1近いコサイン類似度を有するべきである0-100、9と10の間に例えば番号
は、近く1,9及び100に余弦類似性を有するべきです。このようなマッピングを実現するにはどうすればよい
?私は神経ネットエンコーダを試してみたいと思っていますが、これを実現する他の方法があります。
2次元のベクトル空間の特殊なケースで行うのは簡単です。私は範囲[0,100]
を説明しますが、他の間隔に一般化するのは簡単です。原点を中心とするアナログ時計であるとして単位円の
考えます。 x
の[0,100]
を秒針0.3x
秒の秒針の位置にマップします。 x = 0
の場合、秒針は12を指し、対応するベクトルは<0,1>
となります。 x = 50
の場合、秒針は3を指し、x
は<1,0>
にマップされます。 x = 100
の場合、秒針は6になり、x
は<0,-1>
にマップされます。
マッピングするための式は:編集し
from math import sin, cos, radians, sqrt
def to_vector(x,a,b):
m = 180/(b-a)
theta = radians(m*(x-a))
return (sin(theta),cos(theta))
def similarity(v1,v2):
dot = sum(x*y for x,y in zip(v1,v2))
norm1 = sqrt(sum(x**2 for x in v1))
norm2 = sqrt(sum(x**2 for x in v2))
return dot/(norm1*norm2)
例えば、
>>> u = to_vector(9,0,100)
>>> u
(0.2789911060392293, 0.9602936856769431)
>>> v = to_vector(10,0,100)
>>> v
(0.3090169943749474, 0.9510565162951535)
>>> w = to_vector(100,0,100)
>>> w
(1.2246467991473532e-16, -1.0)
>>> similarity(v,u)
0.9995065603657316
>>> similarity(v,w)
-0.9510565162951536
:ここ
f(x) = <sin(1.8*x),cos(1.8*x)> #measured in degrees
は、任意の間隔を処理するために一般Python実装であります:ここではより抽象的なアプローチがあります任意の次元で例を構築するために使用されます。
g: [a,b] \rightarrow R^n
(ここで、R^n
はn次元のユークリッド空間である)の連続1対1マッピングで開始します。それは1対1なのでg(a) != g(b)
です。 m
をg(a)
とg(b)
を結ぶ線分の中点とする。従ってm = (g(a) + g(b))/2
。次のように別の関数を定義します。
f(x) = g(x) - m
をそれを見ることは簡単です:
x
とy
が近接している場合は、f(x)
とf(y)
間のコサイン類似度が1
x
場合a
に近く、y
はb
トンに近いですf(x)
とf(y)
のコサイン類似度は-1
に近い。
g
を適切に選択すると、いくつかの興味深い例を構築できます。g
は、R^3
のらせんの完全なねじれのパラメータ化であり得る。
これは奇妙なことです。コサインの類似性の目的は、実数を比較するようなベクトルを比較することです。実数を比較するのは簡単です - どうしてもっと複雑にしたいのですか?ここでのコンテキストは何ですか?それに加えて、ベクトル空間(通常)は他の集合よりも多くのメンバを持っています。 –