private void do_find_best_parameters(svm_problem svmProblem) { svm_parameter svmParam = getDefaultSvmParameters(); setWeights(svmParam); int maxIter = ((int) Math.ceil(Math.abs((log2cEnd - log2cBegin) / log2cStep)) + 1) * ((int) Math.ceil(Math.abs((log2gEnd - log2gBegin) / log2gStep)) + 1); // Run the grid search in separate CV threads ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); List<CvParams> cvParamsList = new ArrayList<CvParams>(); for (double log2c = log2cBegin; (log2cBegin < log2cEnd && log2c <= log2cEnd) || (log2cBegin >= log2cEnd && log2c >= log2cEnd); log2c += log2cStep) { double c1 = Math.pow(2, log2c); for (double log2g = log2gBegin; (log2gBegin < log2gEnd && log2g <= log2gEnd) || (log2gBegin >= log2gEnd && log2g >= log2gEnd); log2g += log2gStep) { double gamma1 = Math.pow(2, log2g); svm_parameter svmParam1 = (svm_parameter) svmParam.clone(); svmParam1.C = c1; svmParam1.gamma = gamma1; executorService.execute( new RunnableSvmCrossValidator(svmProblem, svmParam1, nrFold, cvParamsList)); } } // now wait for all threads to complete by calling shutdown // note that this will NOT terminate the currently running threads, it just signals the thread // pool to closeWriter // once all work is completed executorService.shutdown(); while (!executorService.isTerminated()) { try { Thread.sleep(1000); } catch (InterruptedException e) { // don't care if we get interrupted } // every second, report statistics logger.debug( String.format("%% complete: %5.2f", cvParamsList.size() / (double) maxIter * 100)); CvParams best = getBestCvParams(cvParamsList); CvParams worst = getWorstcvParams(cvParamsList); if (best != null) { logger.debug("Best accuracy: " + best.accuracy); logger.debug("Best C: " + best.c); logger.debug("Best Gamma: " + best.gamma); } if (worst != null) { logger.debug("Worst accuracy: " + worst.accuracy); } } CvParams best = getBestCvParams(cvParamsList); CvParams worst = getWorstcvParams(cvParamsList); if (best != null) { logger.debug("Best accuracy: " + best.accuracy); logger.debug("Best C: " + best.c); logger.debug("Best Gamma: " + best.gamma); c = best.c; gamma = best.gamma; } else { logger.error("Best CV parameters is null."); } if (worst != null) { logger.debug("Worst accuracy: " + worst.accuracy); } }