List of usage examples for org.apache.commons.math3.linear RealVector setEntry
public abstract void setEntry(int index, double value) throws OutOfRangeException;
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); }