/** * Subtract matrices A-B * * @param A * @param B * @return A-B */ public static Matrix minus(Matrix A, Matrix B) { final Matrix ret = copy(A); minusInplace(ret, B); return ret; }
@Override public SparseMatrix laplacian(SparseMatrix adj, DiagonalMatrix degree) { SparseMatrix ret = MatlibMatrixUtils.plusInplace( DiagonalMatrix.ones(degree.rowCount()), MatlibMatrixUtils.minusInplace( degree, adj ) ); return ret; } }
@Override public double eval(Matrix W) { Matrix resid = null; if(W == null){ resid = X; } else { resid = MatlibMatrixUtils.dotProduct(X,W); } Matrix vnobias = MatlibMatrixUtils.copy(X); if(this.bias!=null) { MatlibMatrixUtils.plusInplace(resid, bias); } Matrix v = MatlibMatrixUtils.copy(resid); MatlibMatrixUtils.minusInplace(resid,Y); double retval = 0; for (int t = 0; t < resid.columnCount(); t++) { double loss = resid.get(t, t); retval += loss * loss; logger.debug( String.format( "yr=%d,y=%3.2f,v=%3.2f,v(no bias)=%2.5f,error=%2.5f,serror=%2.5f", t, Y.get(t, t), v.get(t, t), vnobias.get(t,t), loss, loss*loss ) ); } return retval; } @Override
@Override public Matrix gradient(Matrix W) { Matrix ret = W.newInstance(); Matrix resid = MatlibMatrixUtils.dotProduct(X, W); if(this.bias!=null) { MatlibMatrixUtils.plusInplace(resid, this.bias); } MatlibMatrixUtils.minusInplace(resid, Y); for (int t = 0; t < resid.columnCount(); t++) { Vector row = this.X.row(t); row.times(resid.get(t, t)); MatlibMatrixUtils.setSubMatrixCol(ret, 0, t, row); } return ret; } @Override
@Override public double value(double[] x) throws FunctionEvaluationException { ObjectDoublePair<double[]> ind = indicator(vec,x[0]); double sumd = MatlibMatrixUtils.sum(D); double k = ind.second / sumd; double b = k / (1-k); double[][] y = new double[1][vec.length]; for (int i = 0; i < vec.length; i++) { y[0][i] = ind.first[i] + 1 - b * (1 - ind.first[i]); } SparseMatrix dmw = MatlibMatrixUtils.minusInplace(D, W); Vector yv = Vector.wrap(y[0]); double nom = new DenseMatrix(y).mult(dmw.transposeMultiply(yv)).get(0); // y' * ( (D-W) * y) double denom = new DenseMatrix(y).mult(D.transposeMultiply(yv)).get(0); return nom/denom; }
@Override public double value(double[] x) throws FunctionEvaluationException { ObjectDoublePair<double[]> ind = indicator(vec,x[0]); double sumd = MatlibMatrixUtils.sum(D); double k = ind.second / sumd; double b = k / (1-k); double[][] y = new double[1][vec.length]; for (int i = 0; i < vec.length; i++) { y[0][i] = ind.first[i] + 1 - b * (1 - ind.first[i]); } SparseMatrix dmw = MatlibMatrixUtils.minusInplace(D, W); Vector yv = Vector.wrap(y[0]); double nom = new DenseMatrix(y).mult(dmw.transposeMultiply(yv)).get(0); // y' * ( (D-W) * y) double denom = new DenseMatrix(y).mult(D.transposeMultiply(yv)).get(0); return nom/denom; }
MatlibMatrixUtils.minusInplace(g, Kbi.mult(beta)); // g = y_I - K_BI . itB MatlibMatrixUtils.minusInplace(beta, Pinv.mult(g)); return Icols;