- 単調増加の検出と比較の目次
- 2次計画問題は、最適化問題(こちら)のうちの一つで、目的関数が2次式で定義され、制約条件の集合が一次等式と一次不等式とを合わせたものによって定義されているもの
- isotonic programming は前の記事で書いたように
- なるN個の実数集合を見つけることであるから
- 2次計画問題であることがわかる
- ちなみに、半順序ではなく、全順序であるときには、制約がきつくなるので、より速く最適化をする方法が知られており、それ(その一つ)が pool adjacent violators algorithm (PAVA)である。
- 最小化したいのは
- を最小化することに同じ
- これは、二次計画問題の最小化するべき関数の「一般表現になっている
- の制約はどうだろうか?
- はなので
- なる連立不等式が満足されるべきであり、ここで言うはからへのエッジに対してとなるような行列
N<-5
Q<-matrix(0,N-1,N)
for(i in 1:(N-1)){
Q[i,i]<-1
Q[i,i+1]<--1
}
Q
> Q
[,1] [,2] [,3] [,4] [,5]
[1,] 1 -1 0 0 0
[2,] 0 1 -1 0 0
[3,] 0 0 1 -1 0
[4,] 0 0 0 1 -1
- 基準曲線が1つあって、それより下に来る曲線が複数あるときの制約条件行列は
N<-4
M<-3
D<-matrix(0,N,M)
D[,1]<-sort(runif(N),decreasing=TRUE)+1
for(i in 2:M){
k<-0.2
D[1,i]<-D[1,1]*(runif(1)*k+(1-k))
for(j in 2:N){
D[j,i]<-min(D[j-1,i],D[j,1])*(runif(1)*k+(1-k))
}
}
matplot(D,type="b",pch=15)
for(i in 1:N){
for(j in 2:M){
segments(i,D[i,1],i,D[i,j],col=1+j)
}
}
Q<-NULL
for(j in 1:M){
for(i in 1:(N-1)){
st<-(j-1)*N + i
end<-st+1
tmp<-rep(0,N*M)
tmp[st]<--1
tmp[end]<-1
Q<-rbind(Q,tmp)
}
}
for(i in 2:M){
for(j in 1:N){
st<-j
end<-N*(i-1)+j
tmp<-rep(0,N*M)
tmp[st]<--1
tmp[end]<-1
Q<-rbind(Q,tmp)
}
}
Q
> Q
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
tmp -1 1 0 0 0 0 0 0 0 0 0 0
tmp 0 -1 1 0 0 0 0 0 0 0 0 0
tmp 0 0 -1 1 0 0 0 0 0 0 0 0
tmp 0 0 0 0 -1 1 0 0 0 0 0 0
tmp 0 0 0 0 0 -1 1 0 0 0 0 0
tmp 0 0 0 0 0 0 -1 1 0 0 0 0
tmp 0 0 0 0 0 0 0 0 -1 1 0 0
tmp 0 0 0 0 0 0 0 0 0 -1 1 0
tmp 0 0 0 0 0 0 0 0 0 0 -1 1
tmp -1 0 0 0 1 0 0 0 0 0 0 0
tmp 0 -1 0 0 0 1 0 0 0 0 0 0
tmp 0 0 -1 0 0 0 1 0 0 0 0 0
tmp 0 0 0 -1 0 0 0 1 0 0 0 0
tmp -1 0 0 0 0 0 0 0 1 0 0 0
tmp 0 -1 0 0 0 0 0 0 0 1 0 0
tmp 0 0 -1 0 0 0 0 0 0 0 1 0
tmp 0 0 0 -1 0 0 0 0 0 0 0 1