접힌 계열 되감기
15014 단어 선형 대수
접힌 계열 되감기
이런 느낌으로 직선(적인 것)이 되풀이되어 있을 때, 되감기를 되감고 싶다.
최종적으로 완전한 직선을 타는 것은 아니므로, 최소 제곱법으로 직선 근사를 한다. 기본적인 생각으로는, 수의 계열 $x_{k}$ 와, 되돌아가 몇 주목인지를 나타내는 계열 $y_{k}$ 를 사용해, 되돌림을 되돌릴 때에 가능한 한 직선에 가까워지도록(듯이) 한다. 도면에서는 연속적으로 점이 있지만, 도중의 점이 빠져도 좋다고 고려한다.
계열 $x_{1},x_{2},\ldots,x_{N}$에 대한 비감소 계열 $y_{1},y_{1},\ldots,y_{N}(y_{k}\leq y_{k + 1},\y_{k}\in Z)$가 있을 때 가중치 $w_{1},\ldots,w_{N}\in\left\{ 0,1\right\}$ 알려진 것으로
$$w_{n}(x_{n} +\alpha y_{n})$$
가능한 한 등차수 열에 가까워지도록 $\alpha$를 결정하고 싶다.
최종 목표가되는 등차 수열
$$a + bn$$
그렇다. 이때의 제곱오차는
$$e^{2} =\sum_{i = 1}^{n}{w_{n}\left( x_{n} +\alpha y_{n} - a - bn\right)}^{2}\quad(1)$$
$$\frac{\partial e^{2}}{\partial\alpha} =\sum_{n = 1}^{N}{2w_{n}y_{n}(x_{n} +\alpha y_{ n} - a - bn)} = 0\quad(2)$$
$$\frac{\partial e^{2}}{\partial a} = -\sum_{n = 1}^{N}{2w_{n}(x_{n} +\alpha y_{n} - a - bn)} = 0\quad(3)$$
$$\frac{\partial e^{2}}{\partial b} = -\sum_{n = 1}^{N}{2nw_{n}(x_{n} +\alpha y_{n} - a - bn)} = 0\quad(4)$$
여기서 다음과 같은 수를 생각한다.
$$\sum_{n=1}^{N}{w_{n}x_{n}} = S_{X}$$
$$\sum_{n=1}^{N}{w_{n}y_{n}} = S_{Y}$$
$$\sum_{n = 1}^{N}{w_{n}x_{n}y_{n}} = S_{\text{XY}}$$
$$\sum_{n = 1}^{N}{w_{n}y_{n}^{2}} = S_{YY}$$
$$\sum_{n = 1}^{N}{w_{n}nx_{n}} = M_{X}$$
$$\sum_{n=1}^{N}{w_{n}ny_{n}} = M_{Y}$$
$$\sum_{n = 1}^{N}w_{n} = W$$
$$\sum_{n = 1}^{N}{w_{n}n} =\Sigma$$
$$\sum_{n = 1}^{N}{w_{n}n^{2}} =\Sigma_{2}$$
(3)에서,
$$S_{X} +\alpha S_{Y} - a W - b\Sigma = 0\quad(5)$$
(2)보다
$$S_{XY} +\alpha S_{YY} - a S_{Y} - b M_{Y} = 0\quad(6)$$
(4)보다
$$M_{X} +\alpha M_{Y} - a\Sigma - b\Sigma_{2} = 0\quad(7)$$
이상보다
$$
\begin{pmatrix}S_{XY}\\S_{X}\\M_{X}\end{pmatrix}+
\begin{pmatrix}
S_{YY} & - S_{Y} & - M_{Y}\\
S_{Y}&-W&-\Sigma\\
M_{Y}&-\Sigma&-\Sigma_{2}
\end{pmatrix}\begin{pmatrix}
\alpha\\
a\\
b
\end{pmatrix} = 0$$
이것을 풀어 $\alpha$를 요구하면 좋다. 프로그램으로 쓰면 이런 느낌.
findlinear <- function(pos,x,y) {
if (max(y) == 0) {
# only one segment
model <- lm(x~pos,data=data.frame(x=x,pos=pos))
return(c(0,model$coefficients))
}
sx <- sum(x)
sy <- sum(y)
sxy <- sum(x*y)
syy <- sum(y^2)
mx <- sum(pos*x)
my <- sum(pos*y)
v <- -c(sxy,sx,mx)
n <- length(pos)
sn <- sum(pos)
sn2 <- sum(pos^2)
m <- matrix(c(syy,-sy,-my,sy,-n,-sn,my,-sn,-sn2),
nrow=3,ncol=3,byrow=TRUE)
solve(m,v)
}
해보면 이런 느낌
> x
[1] 0 3 6 9 12 -14 -11 -8 -5 -2 1 4 7 10 13 -13 -10 -7 -4
[20] -1 2 5 8 11 14 -12 -9 -6 -3 0 3 6 9 12
> y
[1] 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3
> n
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34
> findlinear(n,x,y)
[1] 29 -3 3
> plot(x+29*y)
그 2 다음.
Reference
이 문제에 관하여(접힌 계열 되감기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akinori-ito/items/8bd1dbb8caa6fc35155f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
findlinear <- function(pos,x,y) {
if (max(y) == 0) {
# only one segment
model <- lm(x~pos,data=data.frame(x=x,pos=pos))
return(c(0,model$coefficients))
}
sx <- sum(x)
sy <- sum(y)
sxy <- sum(x*y)
syy <- sum(y^2)
mx <- sum(pos*x)
my <- sum(pos*y)
v <- -c(sxy,sx,mx)
n <- length(pos)
sn <- sum(pos)
sn2 <- sum(pos^2)
m <- matrix(c(syy,-sy,-my,sy,-n,-sn,my,-sn,-sn2),
nrow=3,ncol=3,byrow=TRUE)
solve(m,v)
}
> x
[1] 0 3 6 9 12 -14 -11 -8 -5 -2 1 4 7 10 13 -13 -10 -7 -4
[20] -1 2 5 8 11 14 -12 -9 -6 -3 0 3 6 9 12
> y
[1] 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3
> n
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34
> findlinear(n,x,y)
[1] 29 -3 3
> plot(x+29*y)
Reference
이 문제에 관하여(접힌 계열 되감기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akinori-ito/items/8bd1dbb8caa6fc35155f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)