最小二乗クロスバリデーション評価関数を最小化のためのコード

これをとりあえず最急降下法で出してみることにする。

y.exp <- function(Xj,Yj){
  y.exp.intern <- function(Xj,Yj){
    return(paste("exp(-1/2 * ((Xi - ",Xj,")/h)^2) * ",Yj,sep=""))
  }
  paste(paste(mapply(function(Xj,Yj){y.exp.intern(Xj,Yj)},Xj,Yj),collapse=" + ")," - Yi")
}

gauusian <- function(Xj){
  gauusian.intern <- function(Xj){
    return(paste("exp(-1/2 * ((Xi - ",Xj,")/h)^2)",sep=""))
  }
  paste(paste(sapply(Xj,function(Xj){gauusian.intern(Xj)}),collapse=" + "),"- 1")
}

cv <- function(Xi,Yi){
  x <- Xi
  y <- Yi
  cv.intern <- function(Xi,Yi){
    y <- gsub("Yi",as.character(Yi),gsub("Xi",as.character(Xi),y.exp(x,y)))
    g <- gsub("Xi",as.character(Xi),gauusian(x))
    return(paste(Yi," - ((",y,")/(",g,"))",sep=""))
  }
  paste("(",paste(mapply(function(Xi,Yi){cv.intern(Xi,Yi)},Xi,Yi),collapse=" + "),")^2")
}

eval(parse(text=paste("D(expression(",gauusian(x),"),\"h\")")))
cv(x,y)
eval(parse(text=paste("D(expression(",cv(x,y),"),\"h\")")))