forum.alglib.net http://forum.alglib.net/ |
|
problem applying RBF example rbf_d_ml_simple example http://forum.alglib.net/viewtopic.php?f=2&t=832 |
Page 1 of 1 |
Author: | coolfarseer [ Thu May 02, 2013 6:53 am ] |
Post subject: | problem applying RBF example rbf_d_ml_simple example |
It maybe silly but I read over the example "rbf_d_ml_simple example" and found me not pro enough at statistics to realize the algorithm of RBF code T_T I intended to write a method which could convert grid data into different intervals for GIS performance with RBF functions. But tested with ecmwf temperature grid data?value of which is between -20 to 40?I got values larger than 100... Were the parameters set wrong especially 'lambda' of rbfsetalgomultilayer? The function is written as below: Code: int interpolationmetod1() { // // This example shows how to build models with RBF-ML algorithm. Below // we assume that you already know basic concepts shown in the example // on RBF-QNN algorithm. // // RBF-ML is a multilayer RBF algorithm, which fits a sequence of models // with decreasing radii. Each model is fitted with fixed number of // iterations of linear solver. First layers give only inexact approximation // of the target function, because RBF problems with large radii are // ill-conditioned. However, as we add more and more layers with smaller // and smaller radii, we get better conditioned systems - and more precise models. // rbfmodel model; rbfreport rep; double v; int lon=361,lat=281; // // We have 2-dimensional space and very simple interpolation problem - all // points are distinct and located at straight line. We want to solve it // with RBF-ML algorithm. This problem is very simple, and RBF-QNN will // solve it too, but we want to evaluate RBF-ML and to start from the simple // problem. // X Y // -2 1 // -1 0 // 0 1 // +1 -1 // +2 1 // rbfcreate(2, 1, model); real_2d_array xy0; xy0.setlength(lat,lon); qDebug()<<"matrix done"; // //read data of diamond4 type // QString str,filename="E:\\13042420.003"; QFile in(filename); if (!in.open(QIODevice::ReadOnly)) { qDebug()<<filename<<" not exists"; return 0; } QTextStream file(&in); QFile out("e:\\interpolation.txt"); out.open(QIODevice::WriteOnly); QTextStream ts(&out); int steplon=0, steplat=0; //qDebug()<<"pos1:"<<sd.toString("yyyyMMdd"); file.readLine(); file.readLine(); file.readLine(); while(!file.atEnd()) { file>>str; xy0(steplat,steplon)=str.toDouble(); //ts<<"("<<steplat<<","<<steplon<<") "<<str<<"="<<xy0(steplat,steplon)<<" the same?"<<endl; if(steplon>=(lon-1)) { steplon=0; steplat++; } else steplon++; if(steplat==281) break; } in.close(); rbfsetpoints(model, xy0); // // First, we try to use R=5.0 with single layer (NLayers=1) and moderate amount // of regularization.... but results are disappointing: Model(x=0,y=0)=-0.02, // and we need 1.0 at (x,y)=(0,0). Why? // // Because first layer gives very smooth and imprecise approximation of the // function. Average distance between points is 1.0, and R=5.0 is too large // to give us flexible model. It can give smoothness, but can't give precision. // So we need more layers with smaller radii. // //rbfsetalgomultilayer(model, 5.0, 1, 1.0e-3); //rbfbuildmodel(model, rep); //printf("%d\n", int(rep.terminationtype)); // EXPECTED: 1 //v = rbfcalc2(model, 0.0, 0.0); //printf("%.2f\n", double(v)); // EXPECTED: -0.021690 // Now we know that single layer is not enough. We still want to start with // R=5.0 because it has good smoothness properties, but we will add more layers, // each with R[i+1]=R[i]/2. We think that 4 layers is enough, because last layer // will have R = 5.0/2^3 = 5/8 ~ 0.63, which is smaller than the average distance // between points. And it works! rbfsetalgomultilayer(model, 5.0, 4, 1.0e-2); rbfbuildmodel(model, rep); printf("%d\n", int(rep.terminationtype)); // EXPECTED: 1 ts<<"now start interpolation"<<endl; for(double stepy=0; stepy<lat;stepy+=0.2) { for(double stepx=0; stepx<lon;stepx+=0.2) { //ts<<xy0(stepy,stepx)<<" "; v = rbfcalc2(model, stepy, stepx); ts <<"("<<stepy<<","<<stepx<<") = "<< v<<" "; if((stepx-floor(stepx)<0.001)&&(stepy-floor(stepy)<0.01)) ts<<xy0(stepy,stepx); ts <<endl; } //ts<<endl; } out.close(); //printf("%.2f\n", double(v)); // EXPECTED: 1.000000 // BTW, if you look at v, you will see that it is equal to 0.9999999997, not to 1. // This small error can be fixed by adding one more layer. return 0; } Hope someone could help me, thanks. |
Page 1 of 1 | All times are UTC |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |