@Override public Ensemble fit(final VecDataSet learn, final GlobalLoss globalLoss) { final Vec cursor = new ArrayVec(globalLoss.xdim()); final List<Trans> weakModels = new ArrayList<>(iterationsCount); final Trans gradient = globalLoss.gradient(); for (int t = 0; t < iterationsCount; t++) { final Vec gradientValueAtCursor = gradient.trans(cursor); final L2 localLoss = DataTools.newTarget(factory, gradientValueAtCursor, learn); final Trans weakModel = weak.fit(learn, localLoss); weakModels.add(weakModel); invoke(new Ensemble(weakModels, -step)); VecTools.append(cursor, VecTools.scale(weakModel.transAll(learn.data()), -step)); } return new Ensemble(weakModels, -step); }
public CMLMetricOptimization( final VecDataSet ds, final BlockwiseMLLLogit target, final Mx S, final double c, final double step) { this.ds = ds; this.target = target; this.step = step; this.classesIdxs = MCTools.splitClassesIdxs(target.labels()); this.laplacian = VecTools.copy(S); VecTools.scale(laplacian, -1.0); for (int i = 0; i < laplacian.rows(); i++) { final double diagElem = VecTools.sum(S.row(i)); laplacian.adjust(i, i, diagElem); } this.c = c; }
@Override public Vec gradient(final Vec mu) { final Vec grad = new ArrayVec(mu.dim()); for (int k = 0; k < grad.dim(); k++) { final TIntList idxs = classesIdxs.get(k); double val = 0.0; for (final TIntIterator listIter = idxs.iterator(); listIter.hasNext(); ) { final Vec x = ds.data().row(listIter.next()); final double trans = binClassifier.value(x); final double sigmoid = MathTools.sigmoid(trans); val -= (2 * sigmoid - 1) / (mu.get(k) * sigmoid + (1 - mu.get(k)) * (1 - sigmoid)); grad.set(k, val); } } final double norm = VecTools.norm(grad); VecTools.scale(grad, 1 / norm); for (int k = 0; k < grad.dim(); k++) { final double val = VecTools.multiply(laplacian.row(k), mu); grad.adjust(k, val); } return grad; }