これらの行に沿った方法が機能する可能性があります。
両方のシーケンスについて:
シーケンスを通して曲線を当てはめます。[0,1] からこの曲線上の点まで、1 対 1 の関数が連続していることを確認してください。つまり、0 と 1 の間の各 (実数) 数値に対して、この関数はそれに属する曲線上の点を返します。0 から 1 までのすべての数値について関数をトレースすると、曲線全体が得られます。
曲線を当てはめる 1 つの方法は、連続する点の各ペア間に直線を引くことです (これは鋭い曲がりがあるため、適切な曲線ではありませんが、目的には適している可能性があります)。その場合、関数はすべての線分 (ピタゴラス) の合計の長さを計算することによって取得できます。数値 Y (0 から 1 の間) に対応する曲線上の点は、シーケンスの最初の点からの距離 Y * (すべての線分の合計の長さ) を持つ曲線上の点に対応します。線分 (!!)。
ここで、最初のシーケンスの関数 F(double) と 2 番目のシーケンスの G(double) を取得した後、次のように類似度を計算できます。
double epsilon = 0.01;
double curveDistanceSquared = 0.0;
for(double d=0.0;d<1.0;d=d+epsilon)
{
Point pointOnCurve1 = F(d);
Point pointOnCurve2 = G(d);
//alternatively, use G(1.0-d) to check whether the second sequence is reversed
double distanceOfPoints = pointOnCurve1.EuclideanDistance(pointOnCurve2);
curveDistanceSquared = curveDistanceSquared + distanceOfPoints * distanceOfPoints;
}
similarity = 1.0/ curveDistanceSquared;
考えられる改善:
- カーブに合わせるための改善された方法を見つけます。上記の方法が機能するには、曲線をトレースする関数がまだ必要であることに注意してください。
-距離を計算するときは、距離が最小になるように関数 G を再パラメータ化することを検討してください。(これは、R(0)= 0およびR(1)= 1のような増加関数Rがあることを意味しますが、それ以外は一般的です。使用する距離を計算するとき
Point pointOnCurve1 = F(d);
Point pointOnCurve2 = G(R(d));
次に、距離が最小になるように R を選択しようとします。(何が起こるかを確認するには、G(R(d)) も曲線をトレースすることに注意してください))。