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