protected double findMaxLambdaBinomial(int[][][] indices, double[][][] values, double[] y, double[] pTrain,
			double[] rTrain, double[] gradient) {
		if (fitIntercept) {
			OptimUtils.fitIntercept(pTrain, rTrain, y);
		}
		double maxLambda = 0;
		for (int j = 0; j < values.length; j++) {
			int[][] index = indices[j];
			double[][] block = values[j];
			computeGradient(index, block, rTrain, gradient);
			double t = Math.sqrt(StatUtils.sumSq(gradient, 0, block.length)) / Math.sqrt(block.length);
			if (t > maxLambda) {
				maxLambda = t;
			}
		}
		if (fitIntercept) {
			Arrays.fill(pTrain, 0);
			OptimUtils.computePseudoResidual(pTrain, y, rTrain);
		}
		return maxLambda;
	}