Gram Schmidtによる線形制約

  • 今、ある値のベクトルがあるとする
  • その値のベクトルに、『総和が0でなくてはならない』、という制約が入ったとする
  • 値の平均値をそれぞれの値から引いてやれば、元の値の大小を保ったまま、総和が0という制約を守らせることができる
  • これを、複数の制約に拡張して実現するのが、Gram Schmidtの正規直交化法を用いた制約である
  • 今、『総和が0』という制約を、長さが値ベクトルの長さに等しく、すべての要素の値が1であるようなベクトル f として表現することとする
    • vを元の値ベクトルとすれば、制約は、\sum v_i f_i=0と言うことになる
  • 同様に、その他の制約を、適当なベクトル、g,hなどとして導入すれば、\sum v_i g_i=0,\sum v_i h_i =0となる
  • このようなときに、制約を表しているベクトル f,g,hについて、Gram Schmidt正規直交化規定を出してやり、それが、f',g',h'というなったとすると
  • v - (<< v,f'>> f' + << v,g'>> g' + << v, h'>> h')と変換すると、すべての制約が満たされる
  • Rでやってみよう
library(pracma)

n <- 10
v <- rnorm(n)

f <- rep(1,n)
g <- rnorm(n)
h <- runif(n)

X <- cbind(f,g,h)

gs <- gramSchmidt(X)
Q <- gs$Q
R <- gs$R
Q
t(Q) %*% Q
R

v. <- v - t(v) %*% Q %*% t(Q)

sum(v. * f)
sum(v. * g)
sum(v. * h)
> gs <- gramSchmidt(X)
> Q <- gs$Q
> R <- gs$R
> Q
           [,1]        [,2]        [,3]
 [1,] 0.3162278 -0.23728781 -0.42502111
 [2,] 0.3162278  0.10293991 -0.36546590
 [3,] 0.3162278 -0.06576394  0.09620547
 [4,] 0.3162278  0.06375027  0.45261194
 [5,] 0.3162278  0.75665434  0.17960387
 [6,] 0.3162278 -0.27943967 -0.07925157
 [7,] 0.3162278 -0.31010906  0.45160020
 [8,] 0.3162278 -0.26363928  0.25038526
 [9,] 0.3162278 -0.08517476 -0.34863632
[10,] 0.3162278  0.31807000 -0.21203185
> t(Q) %*% Q
              [,1]         [,2]          [,3]
[1,]  1.000000e+00 2.775558e-17 -2.498002e-16
[2,]  2.775558e-17 1.000000e+00  5.551115e-17
[3,] -2.498002e-16 5.551115e-17  1.000000e+00
> R
         [,1]       [,2]       [,3]
[1,] 3.162278 -0.6599798 1.62301862
[2,] 0.000000  2.4387600 0.08076934
[3,] 0.000000  0.0000000 0.96489191
> 
> v. <- v - t(v) %*% Q %*% t(Q)
> 
> sum(v. * f)
[1] -2.498002e-16
> sum(v. * g)
[1] 8.222589e-16
> sum(v. * h)
[1] -3.885781e-16