Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Locally Weighted Projection Regression (LWPR) using rdyncall and the LWPR C library
library(rdyncall)
dynbind("lwpr", "
lwpr_init_model(*<LWPR_Model>iiZ)i;
lwpr_duplicate_mode(*<LWPR_Model>*<LWPR_Model>)i;
lwpr_set_init_alpha(*<LWPR_Model>d)i;
lwpr_set_init_D(*<LWPR_Model>*dd)i;
lwpr_set_init_D_diagonal(*<LWPR_Model>*d)i;
lwpr_set_init_D_spherical(*<LWPR_Model>d)i;
lwpr_update(*<LWPR_Model>*d*d*d*d)i;
lwpr_predict(*<LWPR_Model>*dd*d*d*d)v;
lwpr_write_xml(*<LWPR_Model>Z)i;
lwpr_read_xml(*<LWPR_Model>Z*i)i;
")
parseStructInfos("LWPR_Model{iiii*d*d*ciidd*d*d*d*d*ddddddddiipp*d*d*d}nIn nInStore nOut n_data mean_x var_x name diag_only meta meta_rate penalty init_alpha norm_in norm_out init_D init_M w_gen w_prune init_lambda final_lambda tau_lambda init_S2 add_threshold kernel update_D sub ws storage xn yn")
testfunc = function(x) {
10 * sin(7.8*log(1+x)) / (1 + 0.1*x**2)
}
Ntr = 500
Xtr = 10 * runif(Ntr)
Ytr = sapply(Xtr, testfunc) + 0.1 * rnorm(Ntr) * Xtr
model = new.struct(LWPR_Model)
lwpr_init_model(model, 1, 1, "Tutorial")
lwpr_set_init_D(model, 20, 0)
model$update_D = 1
model$diag_only = TRUE
model$penalty = 0.0001
lwpr_set_init_alpha(model, 40)
for (i in 1:20) {
idx = sample(Ntr,Ntr)
for (j in idx) {
yp=0
lwpr_update(model, Xtr[j], Ytr[j], yp, NULL)
}
}
Ntest = 500;
Xtest = seq(0,10,length.out=Ntest)
Ytest = numeric(Ntest)
Conf = numeric(Ntest)
for (k in 1:Ntest) {
yp = 0
conf = 0
lwpr_predict(model, Xtest[k], 0.0, yp, conf, NULL);
Ytest[k] = yp
Conf[k] = conf
}
plot(Ytr ~ Xtr, pch=19, cex=0.5, col='red')
lines(Xtest , Ytest, col="blue")
lines(Xtest , Ytest + Conf, col="cyan")
lines(Xtest , Ytest - Conf, col="cyan")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment