public PoissonParameters estimatePoissonParameters() {
		double[] x = toDistribution(this.x);
		int[] xmins = new int[ArraysExt.max(this.x)];
		for (int i = 0; i < xmins.length; i++)
			xmins[i] = i;

		double[] lambdas = new double[200];
		for (int i = 0; i < 200; i++)
			lambdas[i] = (i + 1) / 10.0;

		double minDist = Double.MAX_VALUE;
		int minXmin = -1;
		double[] xMinDistribution = null;
		double minLambda = -1;

		for (int xmin : xmins) {
			double[] xMinDistr = Arrays.copyOf(x, xmin);
			double[] xDistr = Arrays.copyOfRange(x, xmin, x.length);
			xDistr = ArraysExt.scaleBy(xDistr, ArraysExt.sum(xDistr));
			for (double lambda : lambdas) {
				double[] poisson = generatePoissonDistribution(0,
						new double[0], lambda, x.length);

				double dist = distributionDistance(0, xDistr, poisson,
						DISTANCE_TYPE.RSS);
				if (dist < minDist) {
					minLambda = lambda;
					minDist = dist;
					minXmin = xmin;
					xMinDistribution = xMinDistr;
				}
			}
		}
		return new PoissonParameters(minLambda, minXmin, xMinDistribution,
				minDist);
	}