@Override public double value(double[] X) { DoubleMatrix1D x = DoubleFactory1D.dense.make(X); DoubleMatrix1D g = ALG.mult(A, x).assign(b, Functions.plus).assign(Functions.exp); return Math.log(g.zSum()); }
double v1 = params.theta.viewColumn(i).viewPart(lcumsum[j], l[j]).copy().assign(Functions.abs).zSum();
private double logsumexp(DoubleMatrix1D x){ DoubleMatrix1D myX = x.copy(); double maxX = StatUtils.max(myX.toArray()); return Math.log(myX.assign(Functions.minus(maxX)).assign(Functions.exp).zSum()) + maxX; }
/** * Convert discrete data (in yDat) to a matrix of dummy variables (stored in dDat) */ private void makeDummy(){ dDat = factory2D.make(n, lsum); for(int i = 0; i < q; i++){ for(int j = 0; j < l[i]; j++){ DoubleMatrix1D curCol = yDat.viewColumn(i).copy().assign(Functions.equals(j+1)); if(curCol.zSum() == 0) throw new IllegalArgumentException("Discrete data is missing a level: variable " + i + " level " + j); dDat.viewColumn(lcumsum[i]+j).assign(curCol); } } }
private static DoubleMatrix1D margSum(DoubleMatrix2D mat, int marg){ int n = 0; DoubleMatrix1D vec = null; DoubleFactory1D fac = DoubleFactory1D.dense; if(marg==1){ n = mat.columns(); vec = fac.make(n); for (int j = 0; j < mat.rows(); j++){ if (Thread.currentThread().isInterrupted()) { break; } for (int i = 0; i < n; i++){ vec.setQuick(i, vec.getQuick(i) + mat.getQuick(j,i)); } } } else if (marg ==2){ n = mat.rows(); vec = fac.make(n); for (int i = 0; i < n; i++) { if (Thread.currentThread().isInterrupted()) { break; } vec.setQuick(i, mat.viewRow(i).zSum()); } } return vec; }
@Override public double error(DenseDoubleMatrix2D p, DenseDoubleMatrix2D q, FastPreferenceData<U, I> data) { // TODO: add regularization return data.getUidxWithPreferences().parallel().mapToDouble(uidx -> { DoubleMatrix1D pu = p.viewRow(uidx); DoubleMatrix1D su = q.zMult(pu, null); double err1 = data.getUidxPreferences(uidx).mapToDouble(iv -> { double rui = iv.v2; double sui = su.getQuick(iv.v1); double cui = confidence.applyAsDouble(rui); return cui * (rui - sui) * (rui - sui) - confidence.applyAsDouble(0) * sui * sui; }).sum(); double err2 = confidence.applyAsDouble(0) * su.assign(x -> x * x).zSum(); return (err1 + err2) / data.numItems(); }).sum() / data.numUsers(); }
@Override public double error(DenseDoubleMatrix2D p, DenseDoubleMatrix2D q, FastPreferenceData<U, I> data) { // TODO: add regularization, unify with HKVFactorizer's error return data.getUidxWithPreferences().parallel().mapToDouble(uidx -> { DoubleMatrix1D pu = p.viewRow(uidx); DoubleMatrix1D su = q.zMult(pu, null); double err1 = data.getUidxPreferences(uidx).mapToDouble(iv -> { double rui = iv.v2; double sui = su.getQuick(iv.v1); double cui = confidence.applyAsDouble(rui); return cui * (rui - sui) * (rui - sui) - confidence.applyAsDouble(0) * sui * sui; }).sum(); double err2 = confidence.applyAsDouble(0) * su.assign(x -> x * x).zSum(); return (err1 + err2) / data.numItems(); }).sum() / data.numUsers(); }
private void calcWeights(){ weights = factory1D.make(p+q); for(int i = 0; i < p; i++){ weights.set(i, StatUtils.sd(xDat.viewColumn(i).toArray())); } for(int j = 0; j < q; j++){ double curWeight = 0; for(int k = 0; k < l[j] ; k++){ double curp = yDat.viewColumn(j).copy().assign(Functions.equals(k+1)).zSum()/(double) n; curWeight += curp*(1-curp); } weights.set(p+j, Math.sqrt(curWeight)); } }
@Override public double[] gradient(double[] X) { DoubleMatrix1D x = DoubleFactory1D.dense.make(X); DoubleMatrix1D g = ALG.mult(A, x).assign(b, Functions.plus).assign(Functions.exp); double den = g.zSum(); double[] R = new double[dim]; for(int i=0; i<dim; i++){ double d = 0d; for(int k=0; k<A.rows(); k++){ d += g.get(k) * A.get(k, i); } R[i] = d/den; } return R; }
private double multiLL(DoubleMatrix2D coeffs, Node dep, List<Node> indep){ DoubleMatrix2D indepData = factory2D.make(internalData.subsetColumns(indep).getDoubleData().toArray()); List<Node> depList = new ArrayList<>(); depList.add(dep); DoubleMatrix2D depData = factory2D.make(internalData.subsetColumns(depList).getDoubleData().toArray()); int N = indepData.rows(); DoubleMatrix2D probs = Algebra.DEFAULT.mult(factory2D.appendColumns(factory2D.make(N, 1, 1.0), indepData), coeffs); probs = factory2D.appendColumns(factory2D.make(indepData.rows(), 1, 1.0), probs).assign(Functions.exp); double ll = 0; for(int i = 0; i < N; i++){ DoubleMatrix1D curRow = probs.viewRow(i); curRow.assign(Functions.div(curRow.zSum())); ll += Math.log(curRow.get((int)depData.get(i,0))); } return ll; }
for (int i=columns; --i >= 0; ) { cols[i] = matrix.viewColumn(i); sums[i] = cols[i].zSum();
for (int i=columns; --i >= 0; ) { cols[i] = matrix.viewColumn(i); sums[i] = cols[i].zSum();
@Override public double[][] hessian(double[] X) { DoubleMatrix1D x = DoubleFactory1D.dense.make(X); DoubleMatrix1D g = ALG.mult(A, x).assign(b, Functions.plus).assign(Functions.exp); double den = g.zSum(); DoubleMatrix1D r = DoubleFactory1D.dense.make(dim); for(int i=0; i<dim; i++){ double d = 0d; for(int k=0; k<A.rows(); k++){ d += g.get(k) * A.get(k, i); } r.set(i, d); } DoubleMatrix2D ret = DoubleFactory2D.dense.make(dim, dim); ret.assign(ALG.multOuter(r, r, null).assign(Mult.mult(-1d/Math.pow(den, 2))), Functions.plus); for(int k=0; k<A.rows(); k++){ ret.assign(ALG.multOuter(A.viewRow(k), A.viewRow(k), null).assign(Mult.mult(g.get(k))).assign(Mult.mult(1d/den)), Functions.plus); } return ret.toArray(); }
double sqloss = -n/2.0*par.betad.copy().assign(Functions.log).zSum() + .5 * Math.pow(alg.normF(alg.mult(tempLoss, factory2D.diagonal(par.betad.copy().assign(Functions.sqrt)))), 2);
double sqloss = -n/2.0*par.betad.copy().assign(Functions.log).zSum() + .5 * Math.pow(alg.normF(alg.mult(tempLoss, factory2D.diagonal(par.betad.copy().assign(Functions.sqrt)))), 2);