さて、ここで解決策を試みます。
基本的なトリックは次のとおりです。2 つの曲線をラスタライズしてから、タイルごとに曲線を比較できます。これは、少なくとも曲線の重ね合わせを比較するかなり合理的な方法のように思えます。オプティマイザーが曲線に近づくように奨励するために、他の曲線から離れすぎている曲線にペナルティを課す損失も導入します。
これがより複雑な曲線と変換で機能するという保証はありませんが、少なくともアイデアです。
curve2<-data.frame(x=c(4,5,5,6,6,7),
y=c(2,2,1,1,2,3))
fillin <- function(ax, ay, bx, by, scaling= 10, steps= 100) floor(cbind(seq(from = ax, to = bx, len = steps), seq(from = ay, to = by, len = steps)) * scaling)
Bmat <- matrix(0, 100, 100)
for (i in 2:nrow(curve2)){
Bmat[fillin (curve2[i-1,1], curve2[i-1,2], curve2[i,1], curve2[i,2])] =1
}
Bmat.orig = Bmat
Bmat = Bmat.orig
#construct utility function based on
#manhattan distances to closest point?
shift = function(mat, offset){
mat0 = array(0, dim = dim(mat)+2)
mat0[1:nrow(mat) +1+ offset[1] , 1:ncol(mat) + 1+offset[2]] = mat
return(mat0[1:nrow(mat) + 1, 1:ncol(mat) + 1])
}
for (i in 1:100){
Bm = (Bmat != 0)
Btmp1 = shift(Bm, c(1,0))
Btmp2 = shift(Bm, c(-1,0))
Btmp3 = shift(Bm, c(0,1))
Btmp4 = shift(Bm, c(0,-1))
Bmat = Bmat + pmax(Bm ,Btmp1, Btmp2, Btmp3, Btmp4)/i
}
Bmat2 = replace(Bmat, Bmat == max(Bmat), max(Bmat) + 10)
#construct and compare rasterised versions
getcurve = function(trans = c(0,1), curve=data.frame(x=c(1,1,2,2,3) ,
y=c(9,6,6,3,3) ), Bmat = Bmat2){
Amat = array(0, dim = dim(Bmat))
curve[,1] = curve[,1] + trans[1]
curve[,2] = curve[,2] * trans[2]
for (i in 2:nrow(curve)){
fillin (curve[i-1,1], curve[i-1,2], curve[i,1], curve[i,2]) -> ind
if (min(ind) < 1 || max(ind) > nrow(Bmat)) return( array(-1, dim= dim(Bmat)))
Amat[ind] =1
}
Amat = (Amat - mean(Amat))/sd(as.vector(Amat))
Amat
}
compcurve = function(trans = c(0,1), curve=data.frame(x=c(1,1,2,2,3) ,
y=c(9,6,6,3,3) ) , Bmat = Bmat2){
Amat = getcurve(trans, curve, Bmat)
-sum(Amat * Bmat)
}
#SANN seems to work for this, but is slow. Beware of finite differencing
# - criterion is non-smooth!
optim(c(0,1), compcurve, method = "SANN", Bmat = Bmat2) -> output
image(Bmat)
contour(getcurve(output$par), add = T)
結果:
あまりにもみすぼらしくないでしょうか?
他の問題に対処するには、ラスター化の詳細をごまかす必要があるかもしれません。そして、最適化がどのように行われるかを調整したいかもしれません。
「より賢明な」代替案は、最適な解を得るには、おそらく少なくとも 1 対の頂点が一致することに注意することです。これにより、より良い検索戦略が得られます。曲線間の領域と比較したラスター化スキームの利点は、さまざまな変換や非グラフに対してより柔軟である可能性があることです (特に、最初の曲線の垂直線が問題です)。適切な計算ですが、考えるだけで頭が痛くなります。
基準を最大化するため、これは最尤法です。不思議なことに、この問題を法線誤差を使用した最尤問題と表現することは実際には不可能だと思います。法線誤差は L2 ベースの基準を意味するため、正確な重ね合わせが得られないことはよく知られています。