diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier')
14 files changed, 123 insertions, 119 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java index 8a152cff..4bf86f06 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -62,9 +62,9 @@ public class HeDESNormalizationOutlierScaling implements OutlierScalingFunction MeanVariance mv = new MeanVariance(); DoubleMinMax minmax = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); minmax.put(val); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java index 860c77d6..f7cf0df0 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.GammaDistribution; @@ -68,9 +68,9 @@ public class MinusLogGammaScaling extends OutlierGammaScaling { meta = or.getOutlierMeta(); // Determine Minimum and Maximum. DoubleMinMax mm = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double score = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double score = scores.get(id); if(!Double.isNaN(score) && !Double.isInfinite(score)) { mm.put(score); } @@ -79,9 +79,8 @@ public class MinusLogGammaScaling extends OutlierGammaScaling { mlogmax = -Math.log(mm.getMin() / max); // with the prescaling, do Gamma Scaling. MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double score = or.getScores().get(id); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double score = scores.get(id); score = preScale(score); if(!Double.isNaN(score) && !Double.isInfinite(score)) { mv.put(score); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java index 4bc10feb..e34355a1 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java @@ -23,9 +23,10 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.MathUtil; +import de.lmu.ifi.dbs.elki.math.Mean; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.NormalDistribution; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -68,9 +69,9 @@ public class MinusLogStandardDeviationScaling extends StandardDeviationScaling { public void prepare(OutlierResult or) { if(fixedmean == null) { MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = -Math.log(or.getScores().get(id)); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = -Math.log(scores.get(id)); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); } @@ -80,17 +81,15 @@ public class MinusLogStandardDeviationScaling extends StandardDeviationScaling { } else { mean = fixedmean; - double sqsum = 0; - int cnt = 0; - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = -Math.log(or.getScores().get(id)); + Mean sqsum = new Mean(); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = -Math.log(scores.get(id)); if(!Double.isNaN(val) && !Double.isInfinite(val)) { - sqsum += (val - mean) * (val - mean); - cnt += 1; + sqsum.put((val - mean) * (val - mean)); } } - factor = lambda * Math.sqrt(sqsum / cnt) * MathUtil.SQRT2; + factor = lambda * Math.sqrt(sqsum.getMean()) * MathUtil.SQRT2; } } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java index 52a7f449..e026b211 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java @@ -24,9 +24,9 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.math.MeanVariance; @@ -44,7 +44,7 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio /** * The logger for this class. */ - private static final Logging logger = Logging.getLogger(MixtureModelOutlierScalingFunction.class); + private static final Logging LOG = Logging.getLogger(MixtureModelOutlierScalingFunction.class); /** * Parameter mu of the gaussian distribution (outliers) @@ -69,7 +69,7 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio /** * Precomputed static value */ - public final static double ONEBYSQRT2PI = 1.0 / MathUtil.SQRTTWOPI; + public static final double ONEBYSQRT2PI = 1.0 / MathUtil.SQRTTWOPI; /** * Convergence parameter @@ -121,14 +121,14 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio public void prepare(OutlierResult or) { // Initial parameters - are these defaults sounds? MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); } } - double curMu = mv.getMean() * 2; + double curMu = mv.getMean() * 2.; if(curMu == 0) { curMu = Double.MIN_NORMAL; } @@ -159,7 +159,7 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio sqsum += ti * val * val; // (val - curMu) * (val - curMu); } if(tisum <= 0.0 || wsum <= 0.0) { - logger.warning("MixtureModel Outlier Scaling converged to extreme."); + LOG.warning("MixtureModel Outlier Scaling converged to extreme."); break; } double newMu = wsum / tisum; @@ -186,7 +186,7 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio } } if(newSigma <= 0.0 || newAlpha <= 0.0) { - logger.warning("MixtureModel Outlier Scaling converged to extreme."); + LOG.warning("MixtureModel Outlier Scaling converged to extreme."); break; } // logger.debugFine("iter #"+iter+" mu = " + newMu + " sigma = " + @@ -198,7 +198,7 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio iter++; if(iter > 100) { - logger.warning("Max iterations met in mixture model fitting."); + LOG.warning("Max iterations met in mixture model fitting."); break; } } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java index 1ebf24bb..298a5853 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; @@ -79,9 +79,9 @@ public class MultiplicativeInverseScaling implements OutlierScalingFunction { */ private static double getScaleValue(OutlierResult or) { double max = Double.MIN_VALUE; - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); double inv = Math.abs(1.0 / val); if(!Double.isInfinite(inv) && !Double.isNaN(inv)) { max = Math.max(max, inv); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java index 9facaa11..07e58679 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.GammaDistribution; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -50,7 +50,7 @@ public class OutlierGammaScaling implements OutlierScalingFunction { * -gammascale.normalize * </pre> */ - public static final OptionID NORMALIZE_ID = OptionID.getOrCreateOptionID("gammascale.normalize", "Regularize scores before using Gamma scaling."); + public static final OptionID NORMALIZE_ID = new OptionID("gammascale.normalize", "Regularize scores before using Gamma scaling."); /** * Gamma parameter k @@ -101,9 +101,9 @@ public class OutlierGammaScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { meta = or.getOutlierMeta(); MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double score = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double score = scores.get(id); score = preScale(score); if(!Double.isNaN(score) && !Double.isInfinite(score)) { mv.put(score); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java index e7222b96..8f008176 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java @@ -25,8 +25,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import java.util.ArrayList; -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -54,7 +54,7 @@ public class OutlierLinearScaling implements OutlierScalingFunction { * Key: {@code -linearscale.min} * </p> */ - public static final OptionID MIN_ID = OptionID.getOrCreateOptionID("linearscale.min", "Fixed minimum to use in linear scaling."); + public static final OptionID MIN_ID = new OptionID("linearscale.min", "Fixed minimum to use in linear scaling."); /** * Parameter to specify the maximum value. @@ -62,7 +62,7 @@ public class OutlierLinearScaling implements OutlierScalingFunction { * Key: {@code -linearscale.max} * </p> */ - public static final OptionID MAX_ID = OptionID.getOrCreateOptionID("linearscale.max", "Fixed maximum to use in linear scaling."); + public static final OptionID MAX_ID = new OptionID("linearscale.max", "Fixed maximum to use in linear scaling."); /** * Flag to use the mean as minimum for scaling. @@ -71,7 +71,7 @@ public class OutlierLinearScaling implements OutlierScalingFunction { * Key: {@code -linearscale.usemean} * </p> */ - public static final OptionID MEAN_ID = OptionID.getOrCreateOptionID("linearscale.usemean", "Use the mean as minimum for scaling."); + public static final OptionID MEAN_ID = new OptionID("linearscale.usemean", "Use the mean as minimum for scaling."); /** * Flag to use ignore zeros when computing the min and max. @@ -80,7 +80,7 @@ public class OutlierLinearScaling implements OutlierScalingFunction { * Key: {@code -linearscale.ignorezero} * </p> */ - public static final OptionID NOZEROS_ID = OptionID.getOrCreateOptionID("linearscale.ignorezero", "Ignore zero entries when computing the minimum and maximum."); + public static final OptionID NOZEROS_ID = new OptionID("linearscale.ignorezero", "Ignore zero entries when computing the minimum and maximum."); /** * Field storing the Minimum to use @@ -148,9 +148,9 @@ public class OutlierLinearScaling implements OutlierScalingFunction { MeanVariance mv = new MeanVariance(); DoubleMinMax mm = (max == null) ? new DoubleMinMax() : null; boolean skippedzeros = false; - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(nozeros && val == 0.0) { skippedzeros = true; continue; @@ -175,9 +175,9 @@ public class OutlierLinearScaling implements OutlierScalingFunction { if(min == null || max == null) { boolean skippedzeros = false; DoubleMinMax mm = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(nozeros && val == 0.0) { skippedzeros = true; continue; @@ -239,12 +239,14 @@ public class OutlierLinearScaling implements OutlierScalingFunction { @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - DoubleParameter minP = new DoubleParameter(MIN_ID, true); + DoubleParameter minP = new DoubleParameter(MIN_ID); + minP.setOptional(true); if(config.grab(minP)) { min = minP.getValue(); } - DoubleParameter maxP = new DoubleParameter(MAX_ID, true); + DoubleParameter maxP = new DoubleParameter(MAX_ID); + maxP.setOptional(true); if(config.grab(maxP)) { max = maxP.getValue(); } @@ -260,7 +262,7 @@ public class OutlierLinearScaling implements OutlierScalingFunction { } // Use-Mean and Minimum value must not be set at the same time! - ArrayList<Parameter<?, ?>> minmean = new ArrayList<Parameter<?, ?>>(); + ArrayList<Parameter<?>> minmean = new ArrayList<Parameter<?>>(); minmean.add(minP); minmean.add(meanF); GlobalParameterConstraint gpc = new OnlyOneIsAllowedToBeSetGlobalConstraint(minmean); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java index 09d84eb4..45c6928b 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; @@ -78,9 +78,9 @@ public class OutlierMinusLogScaling implements OutlierScalingFunction { @Override public void prepare(OutlierResult or) { DoubleMinMax mm = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java index 3f564fd1..41a4d721 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -48,7 +48,7 @@ public class OutlierSqrtScaling implements OutlierScalingFunction { * Key: {@code -sqrtscale.min} * </p> */ - public static final OptionID MIN_ID = OptionID.getOrCreateOptionID("sqrtscale.min", "Fixed minimum to use in sqrt scaling."); + public static final OptionID MIN_ID = new OptionID("sqrtscale.min", "Fixed minimum to use in sqrt scaling."); /** * Parameter to specify the fixed maximum to use. @@ -56,7 +56,7 @@ public class OutlierSqrtScaling implements OutlierScalingFunction { * Key: {@code -sqrtscale.max} * </p> */ - public static final OptionID MAX_ID = OptionID.getOrCreateOptionID("sqrtscale.max", "Fixed maximum to use in sqrt scaling."); + public static final OptionID MAX_ID = new OptionID("sqrtscale.max", "Fixed maximum to use in sqrt scaling."); /** * Field storing the minimum value @@ -98,9 +98,9 @@ public class OutlierSqrtScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(min == null || max == null) { DoubleMinMax mm = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); } @@ -140,11 +140,13 @@ public class OutlierSqrtScaling implements OutlierScalingFunction { @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - DoubleParameter minP = new DoubleParameter(MIN_ID, true); + DoubleParameter minP = new DoubleParameter(MIN_ID); + minP.setOptional(true); if(config.grab(minP)) { min = minP.getValue(); } - DoubleParameter maxP = new DoubleParameter(MAX_ID, true); + DoubleParameter maxP = new DoubleParameter(MAX_ID); + maxP.setOptional(true); if(config.grab(maxP)) { max = maxP.getValue(); } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java index be7bf766..91f66587 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java @@ -25,8 +25,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import java.util.Arrays; -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.result.outlier.InvertedOutlierScoreMeta; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; @@ -52,17 +52,17 @@ public class RankingPseudoOutlierScaling implements OutlierScalingFunction { @Override public void prepare(OutlierResult or) { // collect all outlier scores - scores = new double[or.getScores().size()]; + Relation<Double> oscores = or.getScores(); + scores = new double[oscores.size()]; int pos = 0; if(or.getOutlierMeta() instanceof InvertedOutlierScoreMeta) { inverted = true; } - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - scores[pos] = or.getScores().get(id); + for(DBIDIter iditer = oscores.iterDBIDs(); iditer.valid(); iditer.advance()) { + scores[pos] = oscores.get(iditer); pos++; } - if(pos != or.getScores().size()) { + if(pos != oscores.size()) { throw new AbortException("Database size is incorrect!"); } // sort them diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java index 468079a3..16115e92 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java @@ -26,7 +26,6 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import java.util.BitSet; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.relation.Relation; @@ -46,7 +45,7 @@ public class SigmoidOutlierScalingFunction implements OutlierScalingFunction { /** * The logger for this class. */ - private static final Logging logger = Logging.getLogger(SigmoidOutlierScalingFunction.class); + private static final Logging LOG = Logging.getLogger(SigmoidOutlierScalingFunction.class); /** * Sigmoid parameter @@ -62,9 +61,9 @@ public class SigmoidOutlierScalingFunction implements OutlierScalingFunction { public void prepare(OutlierResult or) { // Initial parameters - are these defaults sounds? MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); mv.put(val); } double a = 1.0; @@ -109,13 +108,13 @@ public class SigmoidOutlierScalingFunction implements OutlierScalingFunction { iter++; if(iter > 100) { - logger.warning("Max iterations met in sigmoid fitting."); + LOG.warning("Max iterations met in sigmoid fitting."); break; } } Afinal = a; Bfinal = b; - logger.debugFine("A = "+Afinal+" B = "+Bfinal); + LOG.debugFine("A = "+Afinal+" B = "+Bfinal); } /** @@ -226,12 +225,12 @@ public class SigmoidOutlierScalingFunction implements OutlierScalingFunction { stepsize /= 2.0; } if(stepsize < minstep) { - logger.debug("Minstep hit."); + LOG.debug("Minstep hit."); break; } } if(it + 1 >= maxiter) { - logger.debug("Maximum iterations hit."); + LOG.debug("Maximum iterations hit."); break; } } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java index d3048b1d..6c38c781 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java @@ -23,8 +23,8 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.math.MeanVariance; @@ -58,7 +58,7 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { * Key: {@code -sqrtstddevscale.min} * </p> */ - public static final OptionID MIN_ID = OptionID.getOrCreateOptionID("sqrtstddevscale.min", "Fixed minimum to use in sqrt scaling."); + public static final OptionID MIN_ID = new OptionID("sqrtstddevscale.min", "Fixed minimum to use in sqrt scaling."); /** * Parameter to specify a fixed mean to use. @@ -66,7 +66,7 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { * Key: {@code -sqrtstddevscale.mean} * </p> */ - public static final OptionID MEAN_ID = OptionID.getOrCreateOptionID("sqrtstddevscale.mean", "Fixed mean to use in standard deviation scaling."); + public static final OptionID MEAN_ID = new OptionID("sqrtstddevscale.mean", "Fixed mean to use in standard deviation scaling."); /** * Parameter to specify the lambda value @@ -74,7 +74,7 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { * Key: {@code -sqrtstddevscale.lambda} * </p> */ - public static final OptionID LAMBDA_ID = OptionID.getOrCreateOptionID("sqrtstddevscale.lambda", "Significance level to use for error function."); + public static final OptionID LAMBDA_ID = new OptionID("sqrtstddevscale.lambda", "Significance level to use for error function."); /** * Field storing the lambda value @@ -127,9 +127,9 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(min == null) { DoubleMinMax mm = new DoubleMinMax(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); } @@ -138,9 +138,9 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { } if(mean == null) { MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); val = (val <= min) ? 0 : Math.sqrt(val - min); mv.put(val); } @@ -150,9 +150,9 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { else { double sqsum = 0; int cnt = 0; - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); val = (val <= min) ? 0 : Math.sqrt(val - min); sqsum += (val - mean) * (val - mean); cnt += 1; @@ -188,12 +188,14 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - DoubleParameter minP = new DoubleParameter(MIN_ID, true); + DoubleParameter minP = new DoubleParameter(MIN_ID); + minP.setOptional(true); if(config.grab(minP)) { min = minP.getValue(); } - DoubleParameter meanP = new DoubleParameter(MEAN_ID, true); + DoubleParameter meanP = new DoubleParameter(MEAN_ID); + meanP.setOptional(true); if(config.grab(meanP)) { mean = meanP.getValue(); } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java index 7d76a69f..c8ec0905 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java @@ -23,9 +23,10 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.math.MathUtil; +import de.lmu.ifi.dbs.elki.math.Mean; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.NormalDistribution; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -54,7 +55,7 @@ public class StandardDeviationScaling implements OutlierScalingFunction { * Key: {@code -stddevscale.mean} * </p> */ - public static final OptionID MEAN_ID = OptionID.getOrCreateOptionID("stddevscale.mean", "Fixed mean to use in standard deviation scaling."); + public static final OptionID MEAN_ID = new OptionID("stddevscale.mean", "Fixed mean to use in standard deviation scaling."); /** * Parameter to specify the lambda value @@ -62,7 +63,7 @@ public class StandardDeviationScaling implements OutlierScalingFunction { * Key: {@code -stddevscale.lambda} * </p> */ - public static final OptionID LAMBDA_ID = OptionID.getOrCreateOptionID("stddevscale.lambda", "Significance level to use for error function."); + public static final OptionID LAMBDA_ID = new OptionID("stddevscale.lambda", "Significance level to use for error function."); /** * Field storing the fixed mean to use @@ -116,9 +117,9 @@ public class StandardDeviationScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(fixedmean == null) { MeanVariance mv = new MeanVariance(); - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); } @@ -131,17 +132,15 @@ public class StandardDeviationScaling implements OutlierScalingFunction { } else { mean = fixedmean; - double sqsum = 0; - int cnt = 0; - for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { - DBID id = iditer.getDBID(); - double val = or.getScores().get(id); + Mean sqsum = new Mean(); + Relation<Double> scores = or.getScores(); + for(DBIDIter id = scores.iterDBIDs(); id.valid(); id.advance()) { + double val = scores.get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { - sqsum += (val - mean) * (val - mean); - cnt += 1; + sqsum.put((val - mean) * (val - mean)); } } - factor = lambda * Math.sqrt(sqsum / cnt) * MathUtil.SQRT2; + factor = lambda * Math.sqrt(sqsum.getMean()) * MathUtil.SQRT2; if (factor == 0.0) { factor = Double.MIN_NORMAL; } @@ -173,7 +172,8 @@ public class StandardDeviationScaling implements OutlierScalingFunction { @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - DoubleParameter meanP = new DoubleParameter(MEAN_ID, true); + DoubleParameter meanP = new DoubleParameter(MEAN_ID); + meanP.setOptional(true); if(config.grab(meanP)) { fixedmean = meanP.getValue(); } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java index c922ab34..f8609f3b 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java @@ -45,7 +45,7 @@ public class TopKOutlierScaling implements OutlierScalingFunction { * Key: {@code -topk.k} * </p> */ - public static final OptionID K_ID = OptionID.getOrCreateOptionID("topk.k", "Number of outliers to keep."); + public static final OptionID K_ID = new OptionID("topk.k", "Number of outliers to keep."); /** * Parameter to specify the lambda value @@ -53,7 +53,7 @@ public class TopKOutlierScaling implements OutlierScalingFunction { * Key: {@code -topk.binary} * </p> */ - public static final OptionID BINARY_ID = OptionID.getOrCreateOptionID("topk.binary", "Make the top k a binary scaling."); + public static final OptionID BINARY_ID = new OptionID("topk.binary", "Make the top k a binary scaling."); /** * Number of outliers to keep. @@ -99,7 +99,7 @@ public class TopKOutlierScaling implements OutlierScalingFunction { } DBIDIter order = or.getOrdering().iter(or.getOrdering().getDBIDs()).iter(); for(int i = 0; i < k && order.valid(); i++, order.advance()) { - cutoff = or.getScores().get(order.getDBID()); + cutoff = or.getScores().get(order); } max = or.getOutlierMeta().getActualMaximum(); ground = or.getOutlierMeta().getTheoreticalBaseline(); @@ -165,14 +165,15 @@ public class TopKOutlierScaling implements OutlierScalingFunction { @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - IntParameter kP = new IntParameter(K_ID, new GreaterConstraint(1)); + IntParameter kP = new IntParameter(K_ID); + kP.addConstraint(new GreaterConstraint(1)); if(config.grab(kP)) { - k = kP.getValue(); + k = kP.intValue(); } Flag binaryF = new Flag(BINARY_ID); if(config.grab(binaryF)) { - binary = binaryF.getValue(); + binary = binaryF.isTrue(); } } |