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

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

Introduction

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

Prototype

public abstract void setEntry(int index, double value) throws OutOfRangeException;

Source Link

Document

Set a single element.

Usage

From source file:org.grouplens.samantha.modeler.reinforce.LinearUCB.java

private RealVector extractDenseVector(int dim, LearningInstance instance) {
    Int2DoubleMap features = ((StandardLearningInstance) instance).getFeatures();
    RealVector x = MatrixUtils.createRealVector(new double[dim]);
    for (Int2DoubleMap.Entry entry : features.int2DoubleEntrySet()) {
        x.setEntry(entry.getIntKey(), entry.getDoubleValue());
    }/*from w w w. jav  a2 s . com*/
    return x;
}

From source file:org.grouplens.samantha.modeler.reinforce.LinearUCB.java

private void ensureVectorVarSpace() {
    int dim = features.size();
    int size = variableSpace.getVectorVarSizeByName(LinearUCBKey.A.get());
    if (size < dim) {
        variableSpace.ensureVectorVar(LinearUCBKey.A.get(), dim, dim, 0, false, false);
        for (int i = size; i < dim; i++) {
            RealVector vector = MatrixUtils.createRealVector(new double[dim]);
            vector.setEntry(i, lambda);
            variableSpace.setVectorVarByNameIndex(LinearUCBKey.A.get(), i, vector);
        }/*from  www  .java  2  s.  c  o m*/
    }
}

From source file:org.grouplens.samantha.modeler.solver.RandomInitializer.java

public void randInitVector(RealVector vec, boolean normalize) {
    int len = vec.getDimension();
    double sum = 0.0;
    for (int i = 0; i < len; i++) {
        double val;
        if (normalize) {
            val = rand.nextDouble();
        } else {/*from   ww  w. ja  va 2  s  .  co  m*/
            val = (rand.nextDouble() - subtract) * multi;
        }
        vec.setEntry(i, val);
        if (normalize) {
            sum += val;
        }
    }
    if (normalize) {
        vec.mapDivideToSelf(sum);
    }
}

From source file:org.grouplens.samantha.modeler.tree.RegressionTree.java

/**
 * A regression node: split fea index, split fea value, leftNode, rightNode, mean, sumWeights/numInstances
 *//*  w ww  .ja va2  s.co m*/
public int createNode(int parentNode, boolean left, IntList relevant, List<double[]> respList,
        Feature bestSplit) {
    int node = variableSpace.getVectorVarSizeByName(treeName);
    variableSpace.ensureVectorVar(treeName, node + 1, nodeSize, 0.0, false, false);
    if (parentNode >= 0) {
        RealVector nodeVec = variableSpace.getVectorVarByNameIndex(treeName, parentNode);
        if (left) {
            nodeVec.setEntry(2, node);
        } else {
            nodeVec.setEntry(3, node);
        }
        variableSpace.setVectorVarByNameIndex(treeName, parentNode, nodeVec);
    }
    RealVector nodeVec = variableSpace.getVectorVarByNameIndex(treeName, node);
    double sumValue = 0.0;
    double sumWeight = 0.0;
    for (int i = 0; i < relevant.size(); i++) {
        double[] resp = respList.get(relevant.getInt(i));
        sumValue += (resp[0] * resp[1]);
        sumWeight += resp[1];
    }
    nodeVec.setEntry(0, bestSplit.getIndex());
    nodeVec.setEntry(1, bestSplit.getValue());
    nodeVec.setEntry(2, -1);
    nodeVec.setEntry(3, -1);
    double mean = 0.0;
    if (sumWeight > 0.0) {
        mean = sumValue / sumWeight;
    }
    nodeVec.setEntry(4, mean);
    nodeVec.setEntry(5, sumWeight);
    variableSpace.setVectorVarByNameIndex(treeName, node, nodeVec);
    return node;
}

From source file:org.grouplens.samantha.server.space.RedisVariableSpace.java

public RealVector getScalarVarByName(String name) {
    String varName = "S_" + name;
    JsonNode obj = redisService.getValue(spaceIdentifier, varName);
    String varIdxName = "IDX_S_" + name + "_";
    List<String> keys = redisService.keysWithPrefixPattern(spaceIdentifier, varIdxName);
    int size = obj.get("size").asInt();
    RealVector vars = MatrixUtils.createRealVector(new double[size]);
    initializeVector(vars, obj.get("initial").asDouble(), obj.get("randomize").asBoolean(), false);
    List<JsonNode> values = redisService.bulkGet(keys);
    for (JsonNode one : values) {
        vars.setEntry(one.get(0).asInt(), one.get(1).asDouble());
    }// w ww.  ja  v a 2 s .co m
    return vars;
}

From source file:org.grouplens.samantha.server.space.RedisVariableSpace.java

private void setValue(RealVector var, JsonNode one, int dim) {
    for (int i = 0; i < dim; i++) {
        var.setEntry(i, one.get(i + 1).asDouble());
    }//from w  w  w  .  j  a  va  2 s . c o m
}

From source file:org.knime.al.util.noveltydetection.knfst.MatrixFunctions.java

public static RealVector rowMins(final RealMatrix matrix) {
    final RealVector rowMins = MatrixUtils.createRealVector(new double[matrix.getRowDimension()]);

    for (int r = 0; r < matrix.getRowDimension(); r++) {
        rowMins.setEntry(r, matrix.getRowVector(r).getMinValue());
    }/*from   w  ww . j a v  a2s . c  o m*/

    return rowMins;
}

From source file:org.knime.al.util.noveltydetection.knfst.MatrixFunctions.java

public static RealVector sqrt(final RealVector vector) {
    final RealVector result = vector.copy();
    for (int e = 0; e < result.getDimension(); e++) {
        result.setEntry(e, Math.sqrt(result.getEntry(e)));
    }/*w w w.  ja  va 2s  .c o m*/
    return result;
}

From source file:org.lenskit.pf.HPFModelParallelProvider.java

@Override
public HPFModel get() {

    final int userNum = ratings.getUserIndex().size();
    final int itemNum = ratings.getItemIndex().size();
    final int featureCount = hyperParameters.getFeatureCount();
    final double userWeightShpPrior = hyperParameters.getUserWeightShpPrior();
    final double userActivityShpPrior = hyperParameters.getUserActivityShpPrior();
    final double userActivityPriorMean = hyperParameters.getUserActivityPriorMean();
    final double itemWeightShpPrior = hyperParameters.getItemWeightShpPrior();
    final double itemActivityShpPrior = hyperParameters.getItemActivityShpPrior();
    final double itemActivityPriorMean = hyperParameters.getItemActivityPriorMean();

    PMFModel preUserModel = new PMFModel();
    PMFModel preItemModel = new PMFModel();
    Random random = new Random(rndSeed);
    preUserModel.initialize(userWeightShpPrior, userActivityShpPrior, userActivityPriorMean, userNum,
            featureCount, maxOffsetShp, maxOffsetRte, random);
    preItemModel.initialize(itemWeightShpPrior, itemActivityShpPrior, itemActivityPriorMean, itemNum,
            featureCount, maxOffsetShp, maxOffsetRte, random);
    logger.info("initialization finished");

    final List<RatingMatrixEntry> validation = ratings.getValidationRatings();

    Map<Integer, List<RatingMatrixEntry>> groupRatingsByUser = ratings.getTrainRatings().parallelStream()
            .collect(groupingBy(RatingMatrixEntry::getUserIndex));
    Map<Integer, List<RatingMatrixEntry>> groupRatingsByItem = ratings.getTrainRatings().parallelStream()
            .collect(groupingBy(RatingMatrixEntry::getItemIndex));

    //fill out dummy entry in order to allow parallel update to cover all indices
    for (int u = 0; u < userNum; u++) {
        if (!groupRatingsByUser.containsKey(u)) {
            List<RatingMatrixEntry> ratings = new ArrayList<>();

            RatingMatrixEntry entry = new DummyEntry(u);
            ratings.add(entry);// w ww  .j a v a  2 s  .  co m
            groupRatingsByUser.put(u, ratings);
        }
    }

    for (int i = 0; i < itemNum; i++) {
        if (!groupRatingsByItem.containsKey(i)) {
            List<RatingMatrixEntry> ratings = new ArrayList<>();

            RatingMatrixEntry entry = new DummyEntry(i);
            ratings.add(entry);
            groupRatingsByItem.put(i, ratings);
        }
    }

    double avgPLLPre = Double.MAX_VALUE;
    double avgPLLCurr = 0.0;
    double diffPLL = 1.0;
    int iterCount = 1;

    while (iterCount < maxIterCount && diffPLL > threshold) {

        final PMFModel finalPreUserModel = preUserModel;
        final PMFModel finalPreItemModel = preItemModel;

        PMFModel currUserModel = groupRatingsByUser.values().parallelStream()
                .map(e -> PMFModel.computeUserUpdate(e, finalPreUserModel, finalPreItemModel, hyperParameters))
                .collect(new PMFModelCollector());
        logger.info("iteration {} user update finished", iterCount);

        PMFModel currItemModel = groupRatingsByItem.values().parallelStream().map(e -> PMFModel
                .computeItemUpdate(e, finalPreUserModel, finalPreItemModel, currUserModel, hyperParameters))
                .collect(new PMFModelCollector());
        logger.info("iteration {} item update finished", iterCount);

        preUserModel = currUserModel;
        preItemModel = currItemModel;

        if ((iterCount % iterationFrequency) == 0) {
            Iterator<RatingMatrixEntry> valIter = validation.iterator();
            avgPLLCurr = 0.0;

            while (valIter.hasNext()) {
                RatingMatrixEntry ratingEntry = valIter.next();
                int user = ratingEntry.getUserIndex();
                int item = ratingEntry.getItemIndex();
                double rating = ratingEntry.getValue();
                double eThetaBeta = 0.0;
                for (int k = 0; k < featureCount; k++) {
                    double eThetaUK = currUserModel.getWeightShpEntry(user, k)
                            / currUserModel.getWeightRteEntry(user, k);
                    double eBetaIK = currItemModel.getWeightShpEntry(item, k)
                            / currItemModel.getWeightRteEntry(item, k);
                    eThetaBeta += eThetaUK * eBetaIK;
                }
                double pLL = 0.0;
                if (isProbPrediction) {
                    pLL = (rating == 0) ? (-eThetaBeta) : Math.log(1 - Math.exp(-eThetaBeta));
                } else {
                    pLL = rating * Math.log(eThetaBeta) - eThetaBeta - Gamma.logGamma(rating + 1);
                }
                avgPLLCurr += pLL;
            }
            avgPLLCurr = avgPLLCurr / validation.size();
            diffPLL = Math.abs((avgPLLCurr - avgPLLPre) / avgPLLPre);
            avgPLLPre = avgPLLCurr;
            logger.info("iteration {} with current average predictive log likelihood {} and the change is {}",
                    iterCount, avgPLLCurr, diffPLL);
        }
        iterCount++;
    }

    // construct feature matrix used by HPFModel
    RealMatrix eTheta = MatrixUtils.createRealMatrix(userNum, featureCount);
    RealMatrix eBeta = MatrixUtils.createRealMatrix(itemNum, featureCount);
    for (int user = 0; user < userNum; user++) {
        RealVector eThetaU = MatrixUtils.createRealVector(new double[featureCount]);
        for (int k = 0; k < featureCount; k++) {
            double gammaShpUK = preUserModel.getWeightShpEntry(user, k);
            double gammaRteUK = preUserModel.getWeightRteEntry(user, k);
            double value = gammaShpUK / gammaRteUK;
            eThetaU.setEntry(k, value);
        }

        eTheta.setRowVector(user, eThetaU);
        logger.info("Training user {} features finished", user);
    }

    for (int item = 0; item < itemNum; item++) {
        RealVector eBetaI = MatrixUtils.createRealVector(new double[featureCount]);
        for (int k = 0; k < featureCount; k++) {
            double lambdaShpIK = preItemModel.getWeightShpEntry(item, k);
            double lambdaRteIK = preItemModel.getWeightRteEntry(item, k);
            double value = lambdaShpIK / lambdaRteIK;
            eBetaI.setEntry(k, value);
        }
        eBeta.setRowVector(item, eBetaI);
        logger.info("Training item {} features finished", item);
    }

    KeyIndex uidx = ratings.getUserIndex();
    KeyIndex iidx = ratings.getItemIndex();

    return new HPFModel(eTheta, eBeta, uidx, iidx);
}

From source file:org.lenskit.pf.HPFModelProvider.java

@Override
public HPFModel get() {

    final int userNum = ratings.getUserIndex().size();
    final int itemNum = ratings.getItemIndex().size();
    final int featureCount = hyperParameters.getFeatureCount();
    final double a = hyperParameters.getUserWeightShpPrior();
    final double aPrime = hyperParameters.getUserActivityShpPrior();
    final double bPrime = hyperParameters.getUserActivityPriorMean();
    final double c = hyperParameters.getItemWeightShpPrior();
    final double cPrime = hyperParameters.getItemActivityShpPrior();
    final double dPrime = hyperParameters.getItemActivityPriorMean();
    final double kappaShpU = aPrime + featureCount * a;
    final double tauShpI = cPrime + featureCount * c;

    RealMatrix gammaShp = MatrixUtils.createRealMatrix(userNum, featureCount);
    RealMatrix gammaRte = MatrixUtils.createRealMatrix(userNum, featureCount);
    RealVector kappaShp = MatrixUtils.createRealVector(new double[userNum]);
    RealVector kappaRte = MatrixUtils.createRealVector(new double[userNum]);
    RealMatrix lambdaShp = MatrixUtils.createRealMatrix(itemNum, featureCount);
    RealMatrix lambdaRte = MatrixUtils.createRealMatrix(itemNum, featureCount);
    RealVector tauShp = MatrixUtils.createRealVector(new double[itemNum]);
    RealVector tauRte = MatrixUtils.createRealVector(new double[itemNum]);
    RealMatrix gammaShpNext = MatrixUtils.createRealMatrix(userNum, featureCount);
    RealMatrix lambdaShpNext = MatrixUtils.createRealMatrix(itemNum, featureCount);
    gammaShpNext = gammaShpNext.scalarAdd(a);
    lambdaShpNext = lambdaShpNext.scalarAdd(c);
    RealVector phiUI = MatrixUtils.createRealVector(new double[featureCount]);

    initialize(gammaShp, gammaRte, kappaRte, kappaShp, lambdaShp, lambdaRte, tauRte, tauShp);
    logger.info("initialization finished");

    final List<RatingMatrixEntry> train = ratings.getTrainRatings();
    final List<RatingMatrixEntry> validation = ratings.getValidationRatings();
    double avgPLLPre = Double.MAX_VALUE;
    double avgPLLCurr = 0.0;
    double diffPLL = 1.0;
    int iterCount = 1;

    while (iterCount < maxIterCount && diffPLL > threshold) {

        // update phi
        Iterator<RatingMatrixEntry> allUIPairs = train.iterator();
        while (allUIPairs.hasNext()) {
            RatingMatrixEntry entry = allUIPairs.next();
            int item = entry.getItemIndex();
            int user = entry.getUserIndex();
            double ratingUI = entry.getValue();
            if (ratingUI <= 0) {
                continue;
            }//from  w  w w.j  ava 2s  .  com

            for (int k = 0; k < featureCount; k++) {
                double gammaShpUK = gammaShp.getEntry(user, k);
                double gammaRteUK = gammaRte.getEntry(user, k);
                double lambdaShpIK = lambdaShp.getEntry(item, k);
                double lambdaRteIK = lambdaRte.getEntry(item, k);
                double phiUIK = Gamma.digamma(gammaShpUK) - Math.log(gammaRteUK) + Gamma.digamma(lambdaShpIK)
                        - Math.log(lambdaRteIK);
                phiUI.setEntry(k, phiUIK);
            }
            logNormalize(phiUI);

            if (ratingUI > 1) {
                phiUI.mapMultiplyToSelf(ratingUI);
            }

            for (int k = 0; k < featureCount; k++) {
                double value = phiUI.getEntry(k);
                gammaShpNext.addToEntry(user, k, value);
                lambdaShpNext.addToEntry(item, k, value);
            }

        }
        logger.info("iteration {} first phrase update finished", iterCount);

        RealVector gammaRteSecondTerm = MatrixUtils.createRealVector(new double[featureCount]);
        for (int k = 0; k < featureCount; k++) {
            double gammaRteUK = 0.0;
            for (int item = 0; item < itemNum; item++) {
                gammaRteUK += lambdaShp.getEntry(item, k) / lambdaRte.getEntry(item, k);
            }
            gammaRteSecondTerm.setEntry(k, gammaRteUK);
        }

        // update user parameters
        double kappaRteFirstTerm = aPrime / bPrime;
        for (int user = 0; user < userNum; user++) {

            double gammaRteUKFirstTerm = kappaShp.getEntry(user) / kappaRte.getEntry(user);
            double kappaRteU = 0.0;

            for (int k = 0; k < featureCount; k++) {
                double gammaShpUK = gammaShpNext.getEntry(user, k);
                gammaShp.setEntry(user, k, gammaShpUK);
                gammaShpNext.setEntry(user, k, a);
                double gammaRteUK = gammaRteSecondTerm.getEntry(k);
                gammaRteUK += gammaRteUKFirstTerm;
                gammaRte.setEntry(user, k, gammaRteUK);
                kappaRteU += gammaShpUK / gammaRteUK;
            }
            kappaRteU += kappaRteFirstTerm;
            kappaRte.setEntry(user, kappaRteU);
        }

        logger.info("iteration {} second phrase update finished", iterCount);

        RealVector lambdaRteSecondTerm = MatrixUtils.createRealVector(new double[featureCount]);
        for (int k = 0; k < featureCount; k++) {
            double lambdaRteIK = 0.0;
            for (int user = 0; user < userNum; user++) {
                lambdaRteIK += gammaShp.getEntry(user, k) / gammaRte.getEntry(user, k);
            }
            lambdaRteSecondTerm.setEntry(k, lambdaRteIK);
        }

        // update item parameters
        double tauRteFirstTerm = cPrime / dPrime;
        for (int item = 0; item < itemNum; item++) {

            double lambdaRteFirstTerm = tauShp.getEntry(item) / tauRte.getEntry(item);
            double tauRteI = 0.0;

            for (int k = 0; k < featureCount; k++) {
                double lambdaShpIK = lambdaShpNext.getEntry(item, k);
                lambdaShp.setEntry(item, k, lambdaShpIK);
                lambdaShpNext.setEntry(item, k, c);
                double lambdaRteIK = lambdaRteSecondTerm.getEntry(k);

                // plus first term
                lambdaRteIK += lambdaRteFirstTerm;
                lambdaRte.setEntry(item, k, lambdaRteIK);
                // update tauRteI second term
                tauRteI += lambdaShpIK / lambdaRteIK;
            }
            tauRteI += tauRteFirstTerm;
            tauRte.setEntry(item, tauRteI);
        }

        logger.info("iteration {} third phrase update finished", iterCount);

        // compute average predictive log likelihood of validation data per {@code iterationfrequency} iterations

        if (iterCount == 1) {
            for (int user = 0; user < userNum; user++) {
                kappaShp.setEntry(user, kappaShpU);
            }
            for (int item = 0; item < itemNum; item++) {
                tauShp.setEntry(item, tauShpI);
            }
        }

        if ((iterCount % iterationFrequency) == 0) {
            Iterator<RatingMatrixEntry> valIter = validation.iterator();
            avgPLLCurr = 0.0;

            while (valIter.hasNext()) {
                RatingMatrixEntry ratingEntry = valIter.next();
                int user = ratingEntry.getUserIndex();
                int item = ratingEntry.getItemIndex();
                double rating = ratingEntry.getValue();
                double eThetaBeta = 0.0;
                for (int k = 0; k < featureCount; k++) {
                    double eThetaUK = gammaShp.getEntry(user, k) / gammaRte.getEntry(user, k);
                    double eBetaIK = lambdaShp.getEntry(item, k) / lambdaRte.getEntry(item, k);
                    eThetaBeta += eThetaUK * eBetaIK;
                }
                double pLL = 0.0;
                if (isProbPredition) {
                    pLL = (rating == 0) ? (-eThetaBeta) : Math.log(1 - Math.exp(-eThetaBeta));
                } else {
                    pLL = rating * Math.log(eThetaBeta) - eThetaBeta - Gamma.logGamma(rating + 1);
                }
                avgPLLCurr += pLL;
            }
            avgPLLCurr = avgPLLCurr / validation.size();
            diffPLL = Math.abs((avgPLLCurr - avgPLLPre) / avgPLLPre);
            avgPLLPre = avgPLLCurr;
            logger.info("iteration {} with current average predictive log likelihood {} and the change is {}",
                    iterCount, avgPLLCurr, diffPLL);
        }
        iterCount++;
    }

    // construct feature matrix used by HPFModel
    RealMatrix eTheta = MatrixUtils.createRealMatrix(userNum, featureCount);
    RealMatrix eBeta = MatrixUtils.createRealMatrix(itemNum, featureCount);
    for (int user = 0; user < userNum; user++) {
        RealVector gammaShpU = gammaShp.getRowVector(user);
        RealVector gammaRteU = gammaRte.getRowVector(user);
        RealVector eThetaU = gammaShpU.ebeDivide(gammaRteU);
        eTheta.setRowVector(user, eThetaU);
        logger.info("Training user {} features finished", user);
    }

    for (int item = 0; item < itemNum; item++) {
        RealVector lambdaShpI = lambdaShp.getRowVector(item);
        RealVector lambdaRteI = lambdaRte.getRowVector(item);
        RealVector eBetaI = lambdaShpI.ebeDivide(lambdaRteI);
        eBeta.setRowVector(item, eBetaI);
        logger.info("Training item {} features finished", item);
    }

    KeyIndex uidx = ratings.getUserIndex();
    KeyIndex iidx = ratings.getItemIndex();

    return new HPFModel(eTheta, eBeta, uidx, iidx);
}