* @param isSparse <code>true</code> if the training set is treated as sparse.
	 * @param groups the groups of variables.
	 * @param maxNumIters the maximum number of iterations.
	 * @param numLambdas the number of lambdas.
	 * @param minLambdaRatio the minimum lambda is minLambdaRatio * max lambda.
	 * @return group-lasso penalized regressors.
	 */
	public List<GLM> buildGaussianRegressors(Instances trainSet, boolean isSparse, List<int[]> groups, int maxNumIters,
			int numLambdas, double minLambdaRatio) {
		if (isSparse) {
			SparseDataset sd = getSparseDataset(trainSet, true);
			SparseDesignMatrix sm = createDesignMatrix(sd, groups);
			double[] cList = sd.cList;
			
			List<GLM> glms = buildGaussianRegressors(sm.group, sm.indices, sm.values, sd.y, maxNumIters, numLambdas, minLambdaRatio);
			
			for (GLM glm : glms) {
				double[] w = glm.coefficients(0);
				for (int j = 0; j < cList.length; j++) {
					int attIndex = sd.attrs[j];
					w[attIndex] *= cList[j];
				}
			}
			
			return glms;
		} else {
			DenseDataset dd = getDenseDataset(trainSet, false);
			DenseDesignMatrix dm = createDesignMatrix(dd, groups);
			double[] stdList = dd.stdList;

			List<GLM> glms = buildGaussianRegressors(dm.groups, dm.x, dd.y, maxNumIters, numLambdas, minLambdaRatio);

			for (GLM glm : glms) {
				double[] w = glm.coefficients(0);
				for (int j = 0; j < stdList.length; j++) {
					int attIndex = dd.attrs[j];
					w[attIndex] *= stdList[j];
				}
			}
			
			return glms;
		}
	}