public void train(RegressionDataSet dataSet, ExecutorService threadPool) { List<Vec> inputs = new ArrayList<Vec>(dataSet.getSampleSize()); for (int i = 0; i < dataSet.getSampleSize(); i++) inputs.add(dataSet.getDataPoint(i).getNumericalValues()); coefficents = new DenseVector(dataSet.getNumNumericalVars() + 1); Vec targetValues = dataSet.getTargetValues(); double minTarget = targetValues.min(); double maxTarget = targetValues.max(); shift = minTarget; scale = maxTarget - minTarget; // Now all values are in the range [0, 1] targetValues.subtract(shift); targetValues.mutableDivide(scale); Optimizer optimizer = new IterativelyReweightedLeastSquares(); coefficents = optimizer.optimize( 1e-5, 100, logitFun, logitFunD, coefficents, inputs, targetValues, threadPool); }