List of usage examples for org.apache.commons.math3.exception NoDataException printStackTrace
public void printStackTrace()
From source file:org.pmad.gmm.MyMND.java
/** * Creates a multivariate normal distribution with the given mean vector and * covariance matrix.//from w w w. ja va 2 s.co m * <br/> * The number of dimensions is equal to the length of the mean vector * and to the number of rows and columns of the covariance matrix. * It is frequently written as "p" in formulae. * * @param rng Random Number Generator. * @param means Vector of means. * @param covariances Covariance matrix. * @throws DimensionMismatchException if the arrays length are * inconsistent. * @throws SingularMatrixException if the eigenvalue decomposition cannot * be performed on the provided covariance matrix. * @throws NonPositiveDefiniteMatrixException if any of the eigenvalues is * negative. */ public MyMND(RandomGenerator rng, final double[] means, final double[][] covariances) throws SingularMatrixException, DimensionMismatchException, NonPositiveDefiniteMatrixException { super(rng, means.length); final int dim = means.length; if (covariances.length != dim) { throw new DimensionMismatchException(covariances.length, dim); } for (int i = 0; i < dim; i++) { if (dim != covariances[i].length) { throw new DimensionMismatchException(covariances[i].length, dim); } } this.means = MathArrays.copyOf(means); double msum = 0; for (int i = 0; i < covariances.length; i++) { for (int j = 0; j < covariances.length; j++) { msum += covariances[i][j]; } } msum /= covariances.length * covariances.length; // System.out.print("in"); MyEDC covMatDec = null; double a = -1; while (true) { try { covarianceMatrix = new Array2DRowRealMatrix(covariances); covMatDec = new MyEDC(covarianceMatrix); // Compute and store the inverse. covarianceMatrixInverse = covMatDec.getSolver().getInverse(); a *= -1; break; } catch (NoDataException e) { e.printStackTrace(); } catch (NullArgumentException e) { e.printStackTrace(); } catch (MathArithmeticException e) { e.printStackTrace(); } catch (SingularMatrixException e) { // System.out.print("S"); for (int i = 0; i < covariances.length; i++) { double add = covariances[i][i] == 0 ? msum : covariances[i][i]; covariances[i][i] += new Random().nextDouble() * add * 0.01; } } // catch (MaxCountExceededException e) { //// e.printStackTrace(); //// System.out.print("M"+msum); // for (int i = 0; i < covariances.length; i++) { // for (int j = i; j < covariances.length; j++) { // double add = covariances[i][j] == 0?msum:covariances[i][j]; // add = new Random().nextDouble()*add*0.1*a; // covariances[i][j] += add; // covariances[j][i] += add; // } // } //// break; // } } // Compute and store the determinant. covarianceMatrixDeterminant = covMatDec.getDeterminant(); // Eigenvalues of the covariance matrix. final double[] covMatEigenvalues = covMatDec.getRealEigenvalues(); for (int i = 0; i < covMatEigenvalues.length; i++) { if (covMatEigenvalues[i] < 0) { throw new NonPositiveDefiniteMatrixException(covMatEigenvalues[i], i, 0); } } // Matrix where each column is an eigenvector of the covariance matrix. final Array2DRowRealMatrix covMatEigenvectors = new Array2DRowRealMatrix(dim, dim); for (int v = 0; v < dim; v++) { final double[] evec = covMatDec.getEigenvector(v).toArray(); covMatEigenvectors.setColumn(v, evec); } final RealMatrix tmpMatrix = covMatEigenvectors.transpose(); // Scale each eigenvector by the square root of its eigenvalue. for (int row = 0; row < dim; row++) { final double factor = FastMath.sqrt(covMatEigenvalues[row]); for (int col = 0; col < dim; col++) { tmpMatrix.multiplyEntry(row, col, factor); } } samplingMatrix = covMatEigenvectors.multiply(tmpMatrix); }