Example usage for org.apache.commons.math3.linear RealVector mapSubtract

List of usage examples for org.apache.commons.math3.linear RealVector mapSubtract

Introduction

In this page you can find the example usage for org.apache.commons.math3.linear RealVector mapSubtract.

Prototype

public RealVector mapSubtract(double d) 

Source Link

Document

Subtract a value from each entry.

Usage

From source file:edu.stanford.cfuller.colocalization3d.fitting.P3DFitter.java

/**
 * Fits the distances between the two channels of a set of objects to a p3d distribution.
 * //from w ww .  j  a  v  a2 s .c  o m
 * @param objects the ImageObjects whose distances will be fit
 * @param diffs a RealVector containing the scalar distances between the channels of the ImageObjects, in the same order.
 * 
 * @return a RealVector containing the parameters for the distribution fit: first the mean parameter, second the standard deviation parameter
 */
public RealVector fit(List<ImageObject> objects, RealVector diffs) {

    P3dObjectiveFunction of = new P3dObjectiveFunction();

    of.setR(diffs);

    final double tol = 1e-12;

    NelderMeadMinimizer nmm = new NelderMeadMinimizer(tol);

    double initialMean = diffs.getL1Norm() / diffs.getDimension();

    double initialWidth = diffs.mapSubtract(initialMean)
            .map(new org.apache.commons.math3.analysis.function.Power(2)).getL1Norm() / diffs.getDimension();

    initialWidth = Math.sqrt(initialWidth);

    RealVector startingPoint = new ArrayRealVector(2, 0.0);

    startingPoint.setEntry(0, initialMean);
    startingPoint.setEntry(1, initialWidth);

    RealVector parametersMin = null;

    if (this.parameters.hasKey(ROBUST_P3D_FIT_PARAM)) {

        double cutoff = this.parameters.getDoubleValueForKey(ROBUST_P3D_FIT_PARAM);

        of.setMinProb(cutoff);

    }

    return nmm.optimize(of, startingPoint);

}

From source file:edu.stanford.cfuller.imageanalysistools.clustering.GaussianLikelihoodObjectiveFunction.java

/**
 * Evaluates the function with the specified parameters.
 *
 * The parameters describe a set of gaussian generators (which are the Clusters).
 *
 * @param parameters    A RealVector containing the values of all the parameters of each Gaussian, ordered so that all the parameters of a single gaussian are together, then the next gaussian, etc.
 * @return              The negative log likelihood of having observed the ClusterObjects at their locations, given the parameters describing the Gaussian clusters.
 *///from  ww  w. ja va  2 s .c  o  m
public double evaluate(RealVector parameters) {

    int nClusters = parameters.getDimension() / nParametersEach;

    //java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("nClusters: " + nClusters + "  abdMatrices_size: " + abdMatrices.size() + "  det_dim: " + det.getDimension());

    if (det.getDimension() != nClusters) {

        clusterProbs = new Array2DRowRealMatrix(this.objects.size(), nClusters);
        det = new ArrayRealVector(nClusters);
        pk = new ArrayRealVector(nClusters);

        if (abdMatrices.size() < nClusters) {
            int originalSize = abdMatrices.size();
            for (int i = 0; i < nClusters - originalSize; i++) {
                abdMatrices.add(new Array2DRowRealMatrix(numDim, numDim));
            }
        } else {
            abdMatrices.setSize(nClusters);
        }

    }

    pk.mapMultiplyToSelf(0.0);

    //java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("nClusters: " + nClusters + "  abdMatrices_size: " + abdMatrices.size() + "  det_dim: " + det.getDimension());

    for (int i = 0; i < nClusters; i++) {
        /*
        double ct = Math.cos(parameters.getEntry(nParametersEach*i+3));
        double st = Math.sin(parameters.getEntry(nParametersEach*i+3));
        double sin2t = Math.sin(2*parameters.getEntry(nParametersEach*i+3));
        double a = (ct*ct/(2*parameters.getEntry(nParametersEach*i+2)) + st*st/(2*parameters.getEntry(nParametersEach*i+4)));
        double b = (sin2t/(4*parameters.getEntry(nParametersEach*i+4)) - sin2t/(4*parameters.getEntry(nParametersEach*i+2)));
        double d = (st*st/(2*parameters.getEntry(nParametersEach*i+2)) + ct*ct/(2*parameters.getEntry(nParametersEach*i+4)));
        */

        double a = parameters.getEntry(nParametersEach * i + 2);
        double d = parameters.getEntry(nParametersEach * i + 4);
        double b = Math.sqrt(a * d) * parameters.getEntry(nParametersEach * i + 3);

        abdMatrices.get(i).setEntry(0, 0, a);
        abdMatrices.get(i).setEntry(1, 0, b);
        abdMatrices.get(i).setEntry(0, 1, b);
        abdMatrices.get(i).setEntry(1, 1, d);

        LUDecomposition abdLU = (new LUDecomposition(abdMatrices.get(i)));

        det.setEntry(i, (abdLU).getDeterminant());
        //det.setEntry(i, a*d-b*b);
        try {
            abdMatrices.set(i, abdLU.getSolver().getInverse());
        } catch (org.apache.commons.math3.linear.SingularMatrixException e) {
            return Double.MAX_VALUE;
        }

    }

    for (int n = 0; n < this.objects.size(); n++) {

        ClusterObject c = this.objects.get(n);

        double max = -1.0 * Double.MAX_VALUE;
        int maxIndex = 0;

        for (int k = 0; k < nClusters; k++) {

            mean.setEntry(0, c.getCentroid().getX() - parameters.getEntry(nParametersEach * k));
            mean.setEntry(1, c.getCentroid().getY() - parameters.getEntry(nParametersEach * k + 1));

            x = abdMatrices.get(k).operate(mean);

            double dot = x.dotProduct(mean);

            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("k, n: " + k + ", " + this.objects.size());
            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("parameters: " + parameters.toString());
            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("abd matrix: " + abdMatrices.get(k).toString());
            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("det: " + det.getEntry(k));
            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("mean: " + mean.toString());
            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("dot: " + dot);

            double logN = negLog2PI - 0.5 * Math.log(det.getEntry(k)) - 0.5 * dot;

            //                java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("logN: " + logN);

            clusterProbs.setEntry(n, k, logN);
            if (logN > max) {
                max = logN;
                maxIndex = k;
            }

            if (Double.isInfinite(logN) || Double.isNaN(logN)) {
                return Double.MAX_VALUE;
            }

        }

        c.setMostProbableCluster(maxIndex);

    }

    for (int k = 0; k < nClusters; k++) {

        double tempMax = -1.0 * Double.MAX_VALUE;

        for (int n = 0; n < this.objects.size(); n++) {
            if (clusterProbs.getEntry(n, k) > tempMax)
                tempMax = clusterProbs.getEntry(n, k);
        }

        pk.setEntry(k,
                tempMax + Math.log(
                        clusterProbs.getColumnVector(k).mapSubtract(tempMax).mapToSelf(new Exp()).getL1Norm())
                        - Math.log(this.objects.size()));

    }

    double pkMax = -1.0 * Double.MAX_VALUE;

    for (int k = 0; k < nClusters; k++) {
        if (pk.getEntry(k) > pkMax)
            pkMax = pk.getEntry(k);
    }

    double logSumPk = pkMax + Math.log(pk.mapSubtract(pkMax).mapToSelf(new Exp()).getL1Norm());

    pk.mapSubtractToSelf(logSumPk);

    //java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("pk: " + pk.toString());

    double L = 0;

    for (int n = 0; n < this.objects.size(); n++) {

        RealVector toSum = clusterProbs.getRowVector(n).add(pk);

        double tempMax = -1.0 * Double.MAX_VALUE;

        for (int k = 0; k < nClusters; k++) {
            if (toSum.getEntry(k) > tempMax)
                tempMax = toSum.getEntry(k);
        }

        double pn = tempMax + Math.log(toSum.mapSubtract(tempMax).mapToSelf(new Exp()).getL1Norm());

        //java.util.logging.Logger.getLogger("edu.stanford.cfuller.imageanalysistools").info("pn: " + pn);

        L += pn;

    }

    return -1.0 * L;
}

From source file:edu.stanford.cfuller.imageanalysistools.fitting.BisquareLinearFit.java

/**
* Calculates the standardized adjusted residuals (according to the same definition used by MATLAB) of the data points for fitting.
* 
* @param indVarValues The values of the independent variable used for the fitting.
* @param depVarValues The values of the dependent variable used for the fitting.
* @param leverages the leverages of the independent variables, as compted by {@link #calculateLeverages(RealVector)}
* @param fitParams the results of a (possibly weighted) least squares fit to the data, containing one or two components: a slope and an optional y-intercept.
* @return a RealVector containing an adjusted residual value for each data point
*/// www .ja va  2  s. c  om
protected RealVector calculateStandardizedAdjustedResiduals(RealVector indVarValues, RealVector depVarValues,
        RealVector leverages, RealVector fitParams) {

    RealVector predictedValues = indVarValues.mapMultiply(fitParams.getEntry(0));

    RealVector denom = leverages.mapMultiply(-1.0).mapAddToSelf(1 + this.CLOSE_TO_ZERO)
            .mapToSelf(new org.apache.commons.math3.analysis.function.Sqrt());

    if (!this.noIntercept) {
        predictedValues = predictedValues.mapAdd(fitParams.getEntry(1));
    }

    double stddev = 0;
    double mean = 0;

    for (int i = 0; i < depVarValues.getDimension(); i++) {
        mean += depVarValues.getEntry(i);
    }

    mean /= depVarValues.getDimension();

    stddev = depVarValues.mapSubtract(mean).getNorm()
            * (depVarValues.getDimension() * 1.0 / (depVarValues.getDimension() - 1));

    RealVector residuals = depVarValues.subtract(predictedValues).ebeDivide(denom);

    RealVector absDev = residuals.map(new org.apache.commons.math3.analysis.function.Abs());

    int smallerDim = 2;

    if (this.noIntercept) {
        smallerDim = 1;
    }

    double[] resArray = residuals.map(new org.apache.commons.math3.analysis.function.Abs()).toArray();

    java.util.Arrays.sort(resArray);

    RealVector partialRes = new ArrayRealVector(absDev.getDimension() - smallerDim + 1, 0.0);

    for (int i = smallerDim - 1; i < resArray.length; i++) {
        partialRes.setEntry(i - smallerDim + 1, resArray[i]);
    }

    double resMAD = 0;

    if (partialRes.getDimension() % 2 == 0) {
        resMAD = LocalBackgroundEstimationFilter.quickFindKth(partialRes.getDimension() / 2, partialRes)
                + LocalBackgroundEstimationFilter.quickFindKth(partialRes.getDimension() / 2 - 1, partialRes);
        resMAD /= 2.0;
    } else {
        resMAD = LocalBackgroundEstimationFilter.quickFindKth((partialRes.getDimension() - 1) / 2, partialRes);
    }

    resMAD /= 0.6745;

    if (resMAD < stddev * CLOSE_TO_ZERO) {
        resMAD = stddev * CLOSE_TO_ZERO;
    }

    return residuals.mapDivide(DEFAULT_TUNING_CONST * resMAD);

}