Pela primeira vez (desculpe imprecisões / erros) , observei os processos gaussianos e, mais especificamente, assisti a este vídeo de Nando de Freitas . As notas estão disponíveis online aqui .
Em algum momento, ele extrai amostras aleatórias de um normal multivariado gerado pela construção de uma matriz de covariância baseada em um núcleo gaussiano (exponencial de distâncias quadradas no eixo ). Essas amostras aleatórias formam os gráficos suaves anteriores que se tornam menos dispersos à medida que os dados se tornam disponíveis. Por fim, o objetivo é prever, modificando a matriz de covariância e obtendo a distribuição Gaussiana condicional nos pontos de interesse.
O código inteiro está disponível em um excelente resumo de Katherine Bailey aqui , que por sua vez credita um repositório de código de Nando de Freitas aqui . Eu publiquei o código Python aqui por conveniência.
Começa com (em vez de 10 acima) funções anteriores e introduz um "parâmetro de ajuste".
Eu traduzi o código para Python e [R] , incluindo os gráficos:
Aqui está o primeiro pedaço de código em [R] e o gráfico resultante de três curvas aleatórias geradas por um kernel Gaussiano com base na proximidade dos valores no conjunto de testes:
O segundo pedaço de código R é mais cabeludo e começa simulando quatro pontos de dados de treinamento, o que eventualmente ajudará a diminuir a propagação entre as possíveis curvas (anteriores) em torno das áreas onde esses pontos de dados de treinamento estão. A simulação do valor para esses pontos de dados é como uma função sin ( ) . Podemos ver o "aperto das curvas em torno dos pontos":
O terceiro pedaço do código R trata da plotagem da curva dos valores médios estimados (o equivalente da curva de regressão), correspondendo aos valores de μ (veja o cálculo abaixo) e seus intervalos de confiança:
PERGUNTA: Quero pedir uma explicação das operações que ocorrem quando se passa do GP anterior para o posterior.
Especificamente, eu gostaria de entender esta parte do código R (no segundo bloco) para obter os meios e o sd:
# Apply the kernel function to our training points (5 points):
K_train = kernel(Xtrain, Xtrain, param) #[5 x 5] matrix
Ch_train = chol(K_train + 0.00005 * diag(length(Xtrain))) #[5 x 5] matrix
# Compute the mean at our test points:
K_trte = kernel(Xtrain, Xtest, param) #[5 x 50] matrix
core = solve(Ch_train) %*% K_trte #[5 x 50] matrix
temp = solve(Ch_train) %*% ytrain #[5 x 1] matrix
mu = t(core) %*% temp #[50 x 1] matrix
K_train
Ch_train
K_trte
# Compute the standard deviation:
tempor = colSums(core^2) #[50 x 1] matrix
# Notice that all.equal(diag(t(core) %*% core), colSums(core^2)) TRUE
s2 = diag(K_test) - tempor #[50 x 1] matrix
stdv = sqrt(s2) #[50 x 1] matrix
Como é que isso funciona?
Ch_post_gener = chol(K_test + 1e-6 * diag(n) - (t(core) %*% core))
m_prime = matrix(rnorm(n * 3), ncol = 3)
sam = Ch_post_gener %*% m_prime
f_post = as.vector(mu) + sam
fonte
Respostas:
Entre na decomposição de Cholesky (que novamente codificarei em laranja como no OP):
dado que
Um raciocínio semelhante seria aplicado à variação, começando com a fórmula da variação condicional em um gaussiano multivariado:
que no nosso caso seria:
e chegando na Eq. (2):
Podemos ver que a Eq. (3) no OP é uma maneira de gerar curvas aleatórias posteriores condicionais aos dados (conjunto de treinamento) e utilizar um formulário de Cholesky para gerar três sorteios aleatórios normais multivariados :
fonte