/** * Select or deselect a column. * * @param cnum Column to select * @param set Value to set */ protected void selectColumn(int cnum, boolean set) { if (set) { BitsUtil.setI(cols, cnum); colcard++; } else { BitsUtil.clearI(cols, cnum); colcard--; } }
/** * Select or deselect a row. * * @param rnum Row to select * @param set Value to set */ protected void selectRow(int rnum, boolean set) { if (set) { BitsUtil.setI(rows, rnum); rowcard++; } else { BitsUtil.clearI(rows, rnum); rowcard--; } }
/** * Main loop of OUTRES. Run for each object * * @param s start dimension * @param subspace Current subspace * @param id Current object ID * @param kernel Kernel * @return Score */ public double outresScore( final int s, long[] subspace, DBIDRef id, KernelDensityEstimator kernel) { double score = 1.0; // Initial score is 1.0 final SubspaceEuclideanDistanceFunction df = new SubspaceEuclideanDistanceFunction(subspace); MeanVariance meanv = new MeanVariance(); for (int i = s; i < kernel.dim; i++) { if (BitsUtil.get(subspace, i)) { // TODO: needed? Or should we always start // with i=0? continue; } BitsUtil.setI(subspace, i); df.setSelectedDimensions(subspace); final double adjustedEps = kernel.adjustedEps(kernel.dim); // Query with a larger window, to also get neighbors of neighbors // Subspace euclidean is metric! final double range = adjustedEps * 2.; RangeQuery<V> rq = QueryUtil.getRangeQuery(kernel.relation, df, range); DoubleDBIDList neighc = rq.getRangeForDBID(id, range); DoubleDBIDList neigh = refineRange(neighc, adjustedEps); if (neigh.size() > 2) { // Relevance test if (relevantSubspace(subspace, neigh, kernel)) { final double density = kernel.subspaceDensity(subspace, neigh); // Compute mean and standard deviation for densities of neighbors. meanv.reset(); for (DoubleDBIDListIter neighbor = neigh.iter(); neighbor.valid(); neighbor.advance()) { DoubleDBIDList n2 = subsetNeighborhoodQuery(neighc, neighbor, df, adjustedEps, kernel); meanv.put(kernel.subspaceDensity(subspace, n2)); } final double deviation = (meanv.getMean() - density) / (2. * meanv.getSampleStddev()); // High deviation: if (deviation >= 1) { score *= (density / deviation); } // Recursion score *= outresScore(i + 1, subspace, id, kernel); } } BitsUtil.clearI(subspace, i); } return score; }