Rで平滑化スプライン
データ x,z
lambda: 平滑化パラメータ
罰則付き最小二乗法
#c1<-seq(0.1,100,length.out=1000) c1<-exp(seq(log(0.1),log(1000),length.out=1000)) n<-rnorm(length(c1),mean=1,sd=0.015) z<-rpois(length(c1),lambda=n*c1) x<-1:length(z) #x<-seq(1,10,length.out=100) x1<-x yy<-z #yy<-3*(x-5)^2+rnorm(length(x),mean=0,sd=10) #y1<-y #plot(x1,yy) knot<-150 f12<-function(ytmp){ #y<-3*x^2+rnorm(length(x),mean=0,sd=10) # plot(x,y) h<-diff(x_knots) len<-length(h) v<-6*(diff(ytmp)[2:len]/h[2:len]-diff(ytmp)[1:(len-1)]/h[1:(len-1)]) m<-matrix(nrow=len-1,ncol=len-1) for(i in 1:(len-1)){ if(i==1){ m[i,]<-c(rep(0,i-1),2*(h[i]+h[i+1]),h[i+2],rep(0,len-3-i+2-1)) } if(i>1 & i<len-1){ m[i,]<-c(rep(0,i-2),h[i],2*(h[i]+h[i+1]),h[i+2],rep(0,len-3-1-(i-2))) } if(i==(len-1)){ m[i,]<-c(rep(0,i-2),h[i],2*(h[i]+h[i+1])) } } u<-solve((m),v) b<-c(0,u,0)/2 a<-diff(c(0,u,0))/6/diff(x_knots) d<-ytmp c<-diff(ytmp)/diff(x_knots)-1.0/6.0*diff(x_knots)*(2*c(0,u,0)[1:(length(c(0,u,0))-1)]+c(0,u,0)[2:length(c(0,u,0))]) f<-function(z){ sum<-0 for(i in 1:(length(x_knots)-1)){ sum<-sum+dunif(z,min=x_knots[i],max=x_knots[i+1])*(x_knots[i+1]-x_knots[i])*(a[i]*(z-x_knots[i])^3+b[i]*(z-x_knots[i])^2+c[i]*(z-x_knots[i])+d[i]) if(length(which(z==x_knots[i]))>=1 & i!=1){ sum[which(z==x_knots[i])]<-sum[which(z==x_knots[i])]-d[i] } } sum } ff<-function(z){ sum<-0 for(i in 1:(length(x_knots)-1)){ sum<-sum+dunif(z,min=x_knots[i],max=x_knots[i+1])*(x_knots[i+1]-x_knots[i])*(6*a[i]*(z-x_knots[i])^1+2*b[i]) if(length(which(z==x_knots[i]))>=1 & i!=1){ sum[which(z==x_knots[i])]<-sum[which(z==x_knots[i])]-6*a[i]*(z[z==x_knots[i]]-x_knots[i])^1-2*b[i] } } sum } par(mfcol=c(2,1)) #plot(x1,yy) plot(x_knots,ytmp) curve(f(x),add=T,col=2) #xxx<-seq(1,10,length.out=100) xxx<-x_knots+0.00 points(xxx,f(xxx),col=4) #xxx<-seq(1,10,length.out=100) points(xxx,f(xxx),col=3) points(x1,yy,col=4) xxx<-x1 curve(ff(x),xlim=c(1,10)) points(xxx+0.000,ff(xxx+0.000),col=3) #xxx<-x1 #points(xxx,f(xxx),col=4) #lambda<-0.1 lambda<-0.0 qq1<-sum((yy-f(x1))^2) qq2<-sum(ff(x1)^2) #qq1<-sum(rnorm()) qq<-qq1+lambda*qq2 #lambda<-1 #beta<a-0.5 #beta*sum((yy-f(x1))^2)+ cat(qq1,qq2,qq,"\n") #lambda*sum(ff(x1+0.00)^2) #f(xxx) qq } #f12(rep(1,length(yy))) #f12(yy) x_knots<-seq(1,max(x1),length.out=15) #y_knots<-predict(smooth.spline(x1,yy),x_knots)$y y_knots<-rep(1,length(x_knots)) #x1<- #yyy<- #yy_sp<-smooth.spline(x_knots,y_knots) #z2<-optim(yy,f12,method="BFGS") #z2<-optim(yy_sp$y,f12,method="BFGS") ###z2<-optim(y_knots,f12,method="BFGS") z2<-optim(y_knots,f12,method="CG") #z2<-optim(yy_sp$y,f12,method="CG") #"CG" #z2<-optim(yy_sp$y,f12) #z2<-optim(rep(1,length(yy)),f12,method="BFGS") #optim(rep(1,length(yy)),f12) #optim(yy,f12) #f12(rep(1,length(y1))) #curve(f(x),col=2,add=T)
罰則付き最尤法
c1<-seq(0.1,0.5,length.out=1000)^1 #c1<-seq(0.0,100,length.out=1000)^2 n<-rnorm(length(c1),mean=1,sd=0.015) z<-rpois(length(c1),lambda=n*c1) x<-1:length(z) #x<-seq(1,10,length.out=100) x1<-x yy<-z #yy<-3*(x-5)^2+rnorm(length(x),mean=0,sd=10) #y1<-y #plot(x1,yy) knot<-150 f12<-function(ytmp){ #y<-3*x^2+rnorm(length(x),mean=0,sd=10) # plot(x,y) h<-diff(x_knots) len<-length(h) v<-6*(diff(ytmp)[2:len]/h[2:len]-diff(ytmp)[1:(len-1)]/h[1:(len-1)]) m<-matrix(nrow=len-1,ncol=len-1) for(i in 1:(len-1)){ if(i==1){ m[i,]<-c(rep(0,i-1),2*(h[i]+h[i+1]),h[i+2],rep(0,len-3-i+2-1)) } if(i>1 & i<len-1){ m[i,]<-c(rep(0,i-2),h[i],2*(h[i]+h[i+1]),h[i+2],rep(0,len-3-1-(i-2))) } if(i==(len-1)){ m[i,]<-c(rep(0,i-2),h[i],2*(h[i]+h[i+1])) } } u<-solve((m),v) b<-c(0,u,0)/2 a<-diff(c(0,u,0))/6/diff(x_knots) d<-ytmp c<-diff(ytmp)/diff(x_knots)-1.0/6.0*diff(x_knots)*(2*c(0,u,0)[1:(length(c(0,u,0))-1)]+c(0,u,0)[2:length(c(0,u,0))]) f<-function(z){ sum<-0 for(i in 1:(length(x_knots)-1)){ sum<-sum+dunif(z,min=x_knots[i],max=x_knots[i+1])*(x_knots[i+1]-x_knots[i])*(a[i]*(z-x_knots[i])^3+b[i]*(z-x_knots[i])^2+c[i]*(z-x_knots[i])+d[i]) if(length(which(z==x_knots[i]))>=1 & i!=1){ sum[which(z==x_knots[i])]<-sum[which(z==x_knots[i])]-d[i] } } sum } ff<-function(z){ sum<-0 for(i in 1:(length(x_knots)-1)){ sum<-sum+dunif(z,min=x_knots[i],max=x_knots[i+1])*(x_knots[i+1]-x_knots[i])*(6*a[i]*(z-x_knots[i])^1+2*b[i]) if(length(which(z==x_knots[i]))>=1 & i!=1){ sum[which(z==x_knots[i])]<-sum[which(z==x_knots[i])]-6*a[i]*(z[z==x_knots[i]]-x_knots[i])^1-2*b[i] } } sum } par(mfcol=c(2,1)) #plot(x1,yy) plot(x_knots,ytmp) curve(f(x),add=T,col=2) #xxx<-seq(1,10,length.out=100) xxx<-x_knots+0.00 points(xxx,f(xxx),col=4) #xxx<-seq(1,10,length.out=100) points(xxx,f(xxx),col=3) points(x1,yy,col=4) xxx<-x1 curve(ff(x),xlim=c(1,10)) points(xxx+0.000,ff(xxx+0.000),col=3) #xxx<-x1 #points(xxx,f(xxx),col=4) #lambda<-0.1 lambda<-0.5 yyb<-predict(smooth.spline(x_knots,ytmp),x1)$y #qq1<-sum((yy-f(x1))^2) mm1<-f(x1[which(yyb<=16)]) mm1[mm1<=0]<-0 lm1<--log(dpois(yy[which(yyb<=16)],lambda=mm1)) lm1[lm1==Inf]<-735 qq1<-sum(lm1) cat("A1",qq1,sum(mm1),"\n") mm1<-f(x1[which(yyb>16)]) mm1[mm1<=0]<-0 sd1<-sqrt(mm1+0.015^2*mm1^2) lm2<--log(dnorm(yy[which(yyb>16)],mean=mm1,sd=sd1)) lm2[lm2==Inf]<-735 qq1<-qq1+sum(lm2) cat("B1",qq1,sum(mm1),"\n") qq2<-sum(ff(x1)^2) #qq1<-sum(rnorm()) if(any(ytmp<0)){ qq3<-1*exp(10*mean(ytmp[ytmp<0])) }else{ qq3<-0 } lambda2<-1 qq<-qq1+lambda*qq2+lambda2*qq3 #lambda<-1 #beta<a-0.5 #beta*sum((yy-f(x1))^2)+ cat(qq1,qq2,qq,"\n") #lambda*sum(ff(x1+0.00)^2) #f(xxx) qq } #f12(rep(1,length(yy))) #f12(yy) x_knots<-seq(1,max(x1),length.out=15) y_knots<-predict(smooth.spline(x1,yy),x_knots)$y y_knots[y_knots<=0]<-0 #y_knots<-rep(1,length(x_knots)) #x1<- #yyy<- yy_sp<-smooth.spline(x_knots,y_knots) #z2<-optim(yy,f12,method="BFGS") z2<-optim(yy_sp$y,f12,method="BFGS") #z2<-optim(yy_sp$y,f12) ####z2<-optim(y_knots,f12) #z2<-optim(rep(1,length(y_knots)),f12,method="SANN") #z2<-optim(rep(1,length(y_knots)),f12) # #z2<-optim(rep(1,length(y_knots)),f12,method="CG") #z2<-optim(rep(1,length(y_knots)),f12,method="BFGS") #z2<-optim(y_knots,f12,method="BFGS") #z2<-optim(y_knots,f12,method="CG") #z2<-optim(yy_sp$y,f12,method="CG") #"CG" #z2<-optim(yy_sp$y,f12) #z2<-optim(rep(1,length(yy)),f12,method="SANN") #optim(rep(1,length(yy)),f12) #optim(yy,f12) #f12(rep(1,length(y1))) #curve(f(x),col=2,add=T) plot(yy,ylim=c(0,max(yy))) points(x_knots,y_knots,col=0) #points(yy,col=2) points(x_knots,y_knots,col=3) points(x_knots,z2$par,col=4) qq_sp1<-smooth.spline(c1) qq_sp1<-predict(qq_sp1,x_knots)$y points(x_knots,qq_sp1,col=5) mean((qq_sp1-y_knots)^2) mean((qq_sp1-z2$par)^2)