You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@samoa.apache.org by gd...@apache.org on 2015/06/18 13:26:13 UTC
[32/41] incubator-samoa git commit: SAMOA-9: Change namespace to
apache.org. Fix #26
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/conditionaltests/NumericAttributeBinaryRulePredicate.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/conditionaltests/NumericAttributeBinaryRulePredicate.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/conditionaltests/NumericAttributeBinaryRulePredicate.java
deleted file mode 100644
index c761808..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/conditionaltests/NumericAttributeBinaryRulePredicate.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-/*
- * NumericAttributeBinaryRulePredicate.java
- * Copyright (C) 2013 University of Porto, Portugal
- * @author E. Almeida, A. Carvalho, J. Gama
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.conditionaltests;
-
-import com.yahoo.labs.samoa.instances.Instance;
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.classifiers.core.conditionaltests.InstanceConditionalBinaryTest;
-import com.yahoo.labs.samoa.moa.classifiers.rules.core.Predicate;
-
-/**
- * Numeric binary conditional test for instances to use to split nodes in AMRules.
- *
- * @version $Revision: 1 $
- */
-public class NumericAttributeBinaryRulePredicate extends InstanceConditionalBinaryTest implements Predicate {
-
- private static final long serialVersionUID = 1L;
-
- protected int attIndex;
-
- protected double attValue;
-
- protected int operator; // 0 =, 1<=, 2>
-
- public NumericAttributeBinaryRulePredicate() {
- this(0, 0, 0);
- }
-
- public NumericAttributeBinaryRulePredicate(int attIndex, double attValue,
- int operator) {
- this.attIndex = attIndex;
- this.attValue = attValue;
- this.operator = operator;
- }
-
- public NumericAttributeBinaryRulePredicate(NumericAttributeBinaryRulePredicate oldTest) {
- this(oldTest.attIndex, oldTest.attValue, oldTest.operator);
- }
-
- @Override
- public int branchForInstance(Instance inst) {
- int instAttIndex = this.attIndex < inst.classIndex() ? this.attIndex
- : this.attIndex + 1;
- if (inst.isMissing(instAttIndex)) {
- return -1;
- }
- double v = inst.value(instAttIndex);
- int ret = 0;
- switch (this.operator) {
- case 0:
- ret = (v == this.attValue) ? 0 : 1;
- break;
- case 1:
- ret = (v <= this.attValue) ? 0 : 1;
- break;
- case 2:
- ret = (v > this.attValue) ? 0 : 1;
- }
- return ret;
- }
-
- /**
- *
- */
- @Override
- public String describeConditionForBranch(int branch, InstancesHeader context) {
- if ((branch >= 0) && (branch <= 2)) {
- String compareChar = (branch == 0) ? "=" : (branch == 1) ? "<=" : ">";
- return InstancesHeader.getAttributeNameString(context,
- this.attIndex)
- + ' '
- + compareChar
- + InstancesHeader.getNumericValueString(context,
- this.attIndex, this.attValue);
- }
- throw new IndexOutOfBoundsException();
- }
-
- /**
- *
- */
- @Override
- public void getDescription(StringBuilder sb, int indent) {
- // TODO Auto-generated method stub
- }
-
- @Override
- public int[] getAttsTestDependsOn() {
- return new int[] { this.attIndex };
- }
-
- public double getSplitValue() {
- return this.attValue;
- }
-
- @Override
- public boolean evaluate(Instance inst) {
- return (branchForInstance(inst) == 0);
- }
-
- @Override
- public String toString() {
- if ((operator >= 0) && (operator <= 2)) {
- String compareChar = (operator == 0) ? "=" : (operator == 1) ? "<=" : ">";
- // int equalsBranch = this.equalsPassesTest ? 0 : 1;
- return "x" + this.attIndex
- + ' '
- + compareChar
- + ' '
- + this.attValue;
- }
- throw new IndexOutOfBoundsException();
- }
-
- public boolean isEqual(NumericAttributeBinaryRulePredicate predicate) {
- return (this.attIndex == predicate.attIndex
- && this.attValue == predicate.attValue
- && this.operator == predicate.operator);
- }
-
- public boolean isUsingSameAttribute(NumericAttributeBinaryRulePredicate predicate) {
- return (this.attIndex == predicate.attIndex
- && this.operator == predicate.operator);
- }
-
- public boolean isIncludedInRuleNode(
- NumericAttributeBinaryRulePredicate predicate) {
- boolean ret;
- if (this.operator == 1) { // <=
- ret = (predicate.attValue <= this.attValue);
- } else { // >
- ret = (predicate.attValue > this.attValue);
- }
-
- return ret;
- }
-
- public void setAttributeValue(
- NumericAttributeBinaryRulePredicate ruleSplitNodeTest) {
- this.attValue = ruleSplitNodeTest.attValue;
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/splitcriteria/SDRSplitCriterionAMRules.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/splitcriteria/SDRSplitCriterionAMRules.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/splitcriteria/SDRSplitCriterionAMRules.java
deleted file mode 100644
index 6feec6a..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/splitcriteria/SDRSplitCriterionAMRules.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.splitcriteria;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-/*
- * SDRSplitCriterionAMRules.java
- * Copyright (C) 2014 University of Porto, Portugal
- * @author A. Bifet, J. Duarte, J. Gama
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- */
-
-import com.yahoo.labs.samoa.moa.classifiers.core.splitcriteria.SDRSplitCriterion;
-import com.yahoo.labs.samoa.moa.classifiers.core.splitcriteria.SplitCriterion;
-
-public class SDRSplitCriterionAMRules extends SDRSplitCriterion implements SplitCriterion {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public double getMeritOfSplit(double[] preSplitDist, double[][] postSplitDists) {
- double SDR = 0.0;
- double N = preSplitDist[0];
- int count = 0;
-
- for (int i = 0; i < postSplitDists.length; i++)
- {
- double Ni = postSplitDists[i][0];
- if (Ni >= 0.05 * preSplitDist[0]) {
- count = count + 1;
- }
- }
- if (count == postSplitDists.length) {
- SDR = computeSD(preSplitDist);
-
- for (int i = 0; i < postSplitDists.length; i++)
- {
- double Ni = postSplitDists[i][0];
- SDR -= (Ni / N) * computeSD(postSplitDists[i]);
-
- }
- }
- return SDR;
- }
-
- @Override
- public double getRangeOfMerit(double[] preSplitDist) {
- return 1;
- }
-
- public static double[] computeBranchSplitMerits(double[][] postSplitDists) {
- double[] SDR = new double[postSplitDists.length];
- double N = 0;
-
- for (int i = 0; i < postSplitDists.length; i++)
- {
- double Ni = postSplitDists[i][0];
- N += Ni;
- }
- for (int i = 0; i < postSplitDists.length; i++)
- {
- double Ni = postSplitDists[i][0];
- SDR[i] = (Ni / N) * computeSD(postSplitDists[i]);
- }
- return SDR;
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/AbstractErrorWeightedVote.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/AbstractErrorWeightedVote.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/AbstractErrorWeightedVote.java
deleted file mode 100644
index a8bfafc..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/AbstractErrorWeightedVote.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.voting;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.yahoo.labs.samoa.moa.AbstractMOAObject;
-
-/**
- * AbstractErrorWeightedVote class for weighted votes based on estimates of errors.
- *
- * @author Joao Duarte (jmduarte@inescporto.pt)
- * @version $Revision: 1 $
- */
-public abstract class AbstractErrorWeightedVote extends AbstractMOAObject implements ErrorWeightedVote {
- /**
- *
- */
- private static final long serialVersionUID = -7340491298217227675L;
- protected List<double[]> votes;
- protected List<Double> errors;
- protected double[] weights;
-
- public AbstractErrorWeightedVote() {
- super();
- votes = new ArrayList<double[]>();
- errors = new ArrayList<Double>();
- }
-
- public AbstractErrorWeightedVote(AbstractErrorWeightedVote aewv) {
- super();
- votes = new ArrayList<double[]>();
- for (double[] vote : aewv.votes) {
- double[] v = new double[vote.length];
- for (int i = 0; i < vote.length; i++)
- v[i] = vote[i];
- votes.add(v);
- }
- errors = new ArrayList<Double>();
- for (Double db : aewv.errors) {
- errors.add(db.doubleValue());
- }
- if (aewv.weights != null) {
- weights = new double[aewv.weights.length];
- for (int i = 0; i < aewv.weights.length; i++)
- weights[i] = aewv.weights[i];
- }
- }
-
- @Override
- public void addVote(double[] vote, double error) {
- votes.add(vote);
- errors.add(error);
- }
-
- @Override
- abstract public double[] computeWeightedVote();
-
- @Override
- public double getWeightedError()
- {
- double weightedError = 0;
- if (weights != null && weights.length == errors.size())
- {
- for (int i = 0; i < weights.length; ++i)
- weightedError += errors.get(i) * weights[i];
- }
- else
- weightedError = -1;
- return weightedError;
- }
-
- @Override
- public double[] getWeights() {
- return weights;
- }
-
- @Override
- public int getNumberVotes() {
- return votes.size();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/ErrorWeightedVote.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/ErrorWeightedVote.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/ErrorWeightedVote.java
deleted file mode 100644
index c905d65..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/ErrorWeightedVote.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.voting;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.moa.MOAObject;
-
-/**
- * ErrorWeightedVote interface for weighted votes based on estimates of errors.
- *
- * @author Joao Duarte (jmduarte@inescporto.pt)
- * @version $Revision: 1 $
- */
-public interface ErrorWeightedVote {
-
- /**
- * Adds a vote and the corresponding error for the computation of the weighted vote and respective weighted error.
- *
- * @param vote
- * a vote returned by a classifier
- * @param error
- * the error associated to the vote
- */
- public void addVote(double[] vote, double error);
-
- /**
- * Computes the weighted vote. Also updates the weights of the votes.
- *
- * @return the weighted vote
- */
- public double[] computeWeightedVote();
-
- /**
- * Returns the weighted error.
- *
- * @pre computeWeightedVote()
- * @return the weighted error
- */
- public double getWeightedError();
-
- /**
- * Return the weights error.
- *
- * @pre computeWeightedVote()
- * @return the weights
- */
- public double[] getWeights();
-
- /**
- * The number of votes added so far.
- *
- * @return the number of votes
- */
- public int getNumberVotes();
-
- /**
- * Creates a copy of the object
- *
- * @return copy of the object
- */
- public MOAObject copy();
-
- public ErrorWeightedVote getACopy();
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/InverseErrorWeightedVote.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/InverseErrorWeightedVote.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/InverseErrorWeightedVote.java
deleted file mode 100644
index 8f9c3b0..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/InverseErrorWeightedVote.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.voting;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-/**
- * InverseErrorWeightedVote class for weighted votes based on estimates of errors.
- *
- * @author Joao Duarte (jmduarte@inescporto.pt)
- * @version $Revision: 1 $
- */
-public class InverseErrorWeightedVote extends AbstractErrorWeightedVote {
-
- /**
- *
- */
- private static final double EPS = 0.000000001; // just to prevent divide by 0 in 1/X -> 1/(x+EPS)
- private static final long serialVersionUID = 6359349250620616482L;
-
- public InverseErrorWeightedVote() {
- super();
- }
-
- public InverseErrorWeightedVote(AbstractErrorWeightedVote aewv) {
- super(aewv);
- }
-
- @Override
- public double[] computeWeightedVote() {
- int n = votes.size();
- weights = new double[n];
- double[] weightedVote = null;
- if (n > 0) {
- int d = votes.get(0).length;
- weightedVote = new double[d];
- double sumError = 0;
- // weights are 1/(error+eps)
- for (int i = 0; i < n; ++i) {
- if (errors.get(i) < Double.MAX_VALUE) {
- weights[i] = 1.0 / (errors.get(i) + EPS);
- sumError += weights[i];
- }
- else
- weights[i] = 0;
-
- }
-
- if (sumError > 0)
- for (int i = 0; i < n; ++i)
- {
- // normalize so that weights sum 1
- weights[i] /= sumError;
- // compute weighted vote
- for (int j = 0; j < d; j++)
- weightedVote[j] += votes.get(i)[j] * weights[i];
- }
- // Only occurs if all errors=Double.MAX_VALUE
- else
- {
- // compute arithmetic vote
- for (int i = 0; i < n; ++i)
- {
- for (int j = 0; j < d; j++)
- weightedVote[j] += votes.get(i)[j] / n;
- }
- }
- }
- return weightedVote;
- }
-
- @Override
- public void getDescription(StringBuilder sb, int indent) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public InverseErrorWeightedVote getACopy() {
- return new InverseErrorWeightedVote(this);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/UniformWeightedVote.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/UniformWeightedVote.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/UniformWeightedVote.java
deleted file mode 100644
index a1cb0c2..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/core/voting/UniformWeightedVote.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.core.voting;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-/**
- * UniformWeightedVote class for weighted votes based on estimates of errors.
- *
- * @author Joao Duarte (jmduarte@inescporto.pt)
- * @version $Revision: 1 $
- */
-public class UniformWeightedVote extends AbstractErrorWeightedVote {
-
- private static final long serialVersionUID = 6359349250620616482L;
-
- public UniformWeightedVote() {
- super();
- }
-
- public UniformWeightedVote(AbstractErrorWeightedVote aewv) {
- super(aewv);
- }
-
- @Override
- public double[] computeWeightedVote() {
- int n = votes.size();
- weights = new double[n];
- double[] weightedVote = null;
- if (n > 0) {
- int d = votes.get(0).length;
- weightedVote = new double[d];
- for (int i = 0; i < n; i++)
- {
- weights[i] = 1.0 / n;
- for (int j = 0; j < d; j++)
- weightedVote[j] += (votes.get(i)[j] * weights[i]);
- }
-
- }
- return weightedVote;
- }
-
- @Override
- public void getDescription(StringBuilder sb, int indent) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public UniformWeightedVote getACopy() {
- return new UniformWeightedVote(this);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyFading.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyFading.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyFading.java
deleted file mode 100644
index ab9b498..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyFading.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.driftdetection;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-/**
- * Page-Hinkley Test with more weight for recent instances.
- *
- */
-
-public class PageHinkleyFading extends PageHinkleyTest {
- /**
- *
- */
- private static final long serialVersionUID = 7110953184708812339L;
- private double fadingFactor = 0.99;
-
- public PageHinkleyFading() {
- super();
- }
-
- public PageHinkleyFading(double threshold, double alpha) {
- super(threshold, alpha);
- }
-
- protected double instancesSeen;
-
- @Override
- public void reset() {
-
- super.reset();
- this.instancesSeen = 0;
-
- }
-
- @Override
- public boolean update(double error) {
- this.instancesSeen = 1 + fadingFactor * this.instancesSeen;
- double absolutError = Math.abs(error);
-
- this.sumAbsolutError = fadingFactor * this.sumAbsolutError + absolutError;
- if (this.instancesSeen > 30) {
- double mT = absolutError - (this.sumAbsolutError / this.instancesSeen) - this.alpha;
- this.cumulativeSum = this.cumulativeSum + mT; // Update the cumulative mT sum
- if (this.cumulativeSum < this.minimumValue) { // Update the minimum mT value if the new mT is smaller than the current minimum
- this.minimumValue = this.cumulativeSum;
- }
- return (((this.cumulativeSum - this.minimumValue) > this.threshold));
- }
- return false;
- }
-
- @Override
- public PageHinkleyTest getACopy() {
- PageHinkleyFading newTest = new PageHinkleyFading(this.threshold, this.alpha);
- this.copyFields(newTest);
- return newTest;
- }
-
- @Override
- protected void copyFields(PageHinkleyTest newTest) {
- super.copyFields(newTest);
- PageHinkleyFading newFading = (PageHinkleyFading) newTest;
- newFading.fadingFactor = this.fadingFactor;
- newFading.instancesSeen = this.instancesSeen;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyTest.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyTest.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyTest.java
deleted file mode 100644
index 8037c94..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/classifiers/rules/driftdetection/PageHinkleyTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.yahoo.labs.samoa.moa.classifiers.rules.driftdetection;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.io.Serializable;
-
-/**
- * Page-Hinkley Test with equal weights for all instances.
- *
- */
-public class PageHinkleyTest implements Serializable {
-
- private static final long serialVersionUID = 1L;
- protected double cumulativeSum;
-
- public double getCumulativeSum() {
- return cumulativeSum;
- }
-
- public double getMinimumValue() {
- return minimumValue;
- }
-
- protected double minimumValue;
- protected double sumAbsolutError;
- protected long phinstancesSeen;
- protected double threshold;
- protected double alpha;
-
- public PageHinkleyTest() {
- this(0, 0);
- }
-
- public PageHinkleyTest(double threshold, double alpha) {
- this.threshold = threshold;
- this.alpha = alpha;
- this.reset();
- }
-
- public void reset() {
- this.cumulativeSum = 0.0;
- this.minimumValue = Double.MAX_VALUE;
- this.sumAbsolutError = 0.0;
- this.phinstancesSeen = 0;
- }
-
- // Compute Page-Hinkley test
- public boolean update(double error) {
-
- this.phinstancesSeen++;
- double absolutError = Math.abs(error);
- this.sumAbsolutError = this.sumAbsolutError + absolutError;
- if (this.phinstancesSeen > 30) {
- double mT = absolutError - (this.sumAbsolutError / this.phinstancesSeen) - this.alpha;
- this.cumulativeSum = this.cumulativeSum + mT; // Update the cumulative mT sum
- if (this.cumulativeSum < this.minimumValue) { // Update the minimum mT value if the new mT is smaller than the current minimum
- this.minimumValue = this.cumulativeSum;
- }
- return (((this.cumulativeSum - this.minimumValue) > this.threshold));
- }
- return false;
- }
-
- public PageHinkleyTest getACopy() {
- PageHinkleyTest newTest = new PageHinkleyTest(this.threshold, this.alpha);
- this.copyFields(newTest);
- return newTest;
- }
-
- protected void copyFields(PageHinkleyTest newTest) {
- newTest.cumulativeSum = this.cumulativeSum;
- newTest.minimumValue = this.minimumValue;
- newTest.sumAbsolutError = this.sumAbsolutError;
- newTest.phinstancesSeen = this.phinstancesSeen;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/CFCluster.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/CFCluster.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/CFCluster.java
deleted file mode 100644
index bf7cdd6..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/CFCluster.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.yahoo.labs.samoa.moa.cluster;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-import java.util.Arrays;
-import com.yahoo.labs.samoa.instances.Instance;
-
-/* micro cluster, as defined by Aggarwal et al, On Clustering Massive Data Streams: A Summarization Praradigm
- * in the book Data streams : models and algorithms, by Charu C Aggarwal
- * @article{
- title = {Data Streams: Models and Algorithms},
- author = {Aggarwal, Charu C.},
- year = {2007},
- publisher = {Springer Science+Business Media, LLC},
- url = {http://ebooks.ulb.tu-darmstadt.de/11157/},
- institution = {eBooks [http://ebooks.ulb.tu-darmstadt.de/perl/oai2] (Germany)},
- }
-
- DEFINITION A micro-clusterfor a set of d-dimensionalpoints Xi,. .Xi,
- with t i m e s t a m p s ~. . .T,, is the (2-d+3)tuple (CF2", CFlX CF2t, CFlt, n),
- wherein CF2" and CFlX each correspond to a vector of d entries. The definition of each of these entries is as follows:
-
- o For each dimension, the sum of the squares of the data values is maintained
- in CF2". Thus, CF2" contains d values. The p-th entry of CF2" is equal to
- \sum_j=1^n(x_i_j)^2
-
- o For each dimension, the sum of the data values is maintained in C F l X .
- Thus, CFIX contains d values. The p-th entry of CFIX is equal to
- \sum_j=1^n x_i_j
-
- o The sum of the squares of the time stamps Ti,. .Tin maintained in CF2t
-
- o The sum of the time stamps Ti, . . .Tin maintained in CFlt.
-
- o The number of data points is maintained in n.
-
- */
-public abstract class CFCluster extends SphereCluster {
-
- private static final long serialVersionUID = 1L;
-
- protected double radiusFactor = 1.8;
-
- /**
- * Number of points in the cluster.
- */
- protected double N;
- /**
- * Linear sum of all the points added to the cluster.
- */
- public double[] LS;
- /**
- * Squared sum of all the points added to the cluster.
- */
- public double[] SS;
-
- /**
- * Instantiates an empty kernel with the given dimensionality.
- *
- * @param dimensions
- * The number of dimensions of the points that can be in this kernel.
- */
- public CFCluster(Instance instance, int dimensions) {
- this(instance.toDoubleArray(), dimensions);
- }
-
- protected CFCluster(int dimensions) {
- this.N = 0;
- this.LS = new double[dimensions];
- this.SS = new double[dimensions];
- Arrays.fill(this.LS, 0.0);
- Arrays.fill(this.SS, 0.0);
- }
-
- public CFCluster(double[] center, int dimensions) {
- this.N = 1;
- this.LS = center;
- this.SS = new double[dimensions];
- for (int i = 0; i < SS.length; i++) {
- SS[i] = Math.pow(center[i], 2);
- }
- }
-
- public CFCluster(CFCluster cluster) {
- this.N = cluster.N;
- this.LS = Arrays.copyOf(cluster.LS, cluster.LS.length);
- this.SS = Arrays.copyOf(cluster.SS, cluster.SS.length);
- }
-
- public void add(CFCluster cluster) {
- this.N += cluster.N;
- addVectors(this.LS, cluster.LS);
- addVectors(this.SS, cluster.SS);
- }
-
- public abstract CFCluster getCF();
-
- /**
- * @return this kernels' center
- */
- @Override
- public double[] getCenter() {
- assert (this.N > 0);
- double res[] = new double[this.LS.length];
- for (int i = 0; i < res.length; i++) {
- res[i] = this.LS[i] / N;
- }
- return res;
- }
-
- @Override
- public abstract double getInclusionProbability(Instance instance);
-
- /**
- * See interface <code>Cluster</code>
- *
- * @return The radius of the cluster.
- */
- @Override
- public abstract double getRadius();
-
- /**
- * See interface <code>Cluster</code>
- *
- * @return The weight.
- * @see Cluster#getWeight()
- */
- @Override
- public double getWeight() {
- return N;
- }
-
- public void setN(double N) {
- this.N = N;
- }
-
- public double getN() {
- return N;
- }
-
- /**
- * Adds the second array to the first array element by element. The arrays must have the same length.
- *
- * @param a1
- * Vector to which the second vector is added.
- * @param a2
- * Vector to be added. This vector does not change.
- */
- public static void addVectors(double[] a1, double[] a2) {
- assert (a1 != null);
- assert (a2 != null);
- assert (a1.length == a2.length) : "Adding two arrays of different "
- + "length";
-
- for (int i = 0; i < a1.length; i++) {
- a1[i] += a2[i];
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Cluster.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Cluster.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Cluster.java
deleted file mode 100644
index 9f77c42..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Cluster.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package com.yahoo.labs.samoa.moa.cluster;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import com.yahoo.labs.samoa.instances.Instance;
-import com.yahoo.labs.samoa.moa.AbstractMOAObject;
-
-public abstract class Cluster extends AbstractMOAObject {
-
- private static final long serialVersionUID = 1L;
-
- private double id = -1;
- private double gtLabel = -1;
-
- private Map<String, String> measure_values;
-
- public Cluster() {
- this.measure_values = new HashMap<>();
- }
-
- /**
- * @return the center of the cluster
- */
- public abstract double[] getCenter();
-
- /**
- * Returns the weight of this cluster, not neccessarily normalized. It could, for instance, simply return the number
- * of points contined in this cluster.
- *
- * @return the weight
- */
- public abstract double getWeight();
-
- /**
- * Returns the probability of the given point belonging to this cluster.
- *
- * @param instance
- * @return a value between 0 and 1
- */
- public abstract double getInclusionProbability(Instance instance);
-
- // TODO: for non sphere cluster sample points, find out MIN MAX neighbours
- // within cluster
- // and return the relative distance
- // public abstract double getRelativeHullDistance(Instance instance);
-
- @Override
- public void getDescription(StringBuilder sb, int i) {
- sb.append("Cluster Object");
- }
-
- public void setId(double id) {
- this.id = id;
- }
-
- public double getId() {
- return id;
- }
-
- public boolean isGroundTruth() {
- return gtLabel != -1;
- }
-
- public void setGroundTruth(double truth) {
- gtLabel = truth;
- }
-
- public double getGroundTruth() {
- return gtLabel;
- }
-
- /**
- * Samples this cluster by returning a point from inside it.
- *
- * @param random
- * a random number source
- * @return an Instance that lies inside this cluster
- */
- public abstract Instance sample(Random random);
-
- public void setMeasureValue(String measureKey, String value) {
- measure_values.put(measureKey, value);
- }
-
- public void setMeasureValue(String measureKey, double value) {
- measure_values.put(measureKey, Double.toString(value));
- }
-
- public String getMeasureValue(String measureKey) {
- if (measure_values.containsKey(measureKey))
- return measure_values.get(measureKey);
- else
- return "";
- }
-
- protected void getClusterSpecificInfo(List<String> infoTitle, List<String> infoValue) {
- infoTitle.add("ClusterID");
- infoValue.add(Integer.toString((int) getId()));
-
- infoTitle.add("Type");
- infoValue.add(getClass().getSimpleName());
-
- double c[] = getCenter();
- if (c != null)
- for (int i = 0; i < c.length; i++) {
- infoTitle.add("Dim" + i);
- infoValue.add(Double.toString(c[i]));
- }
-
- infoTitle.add("Weight");
- infoValue.add(Double.toString(getWeight()));
-
- }
-
- public String getInfo() {
- List<String> infoTitle = new ArrayList<>();
- List<String> infoValue = new ArrayList<>();
- getClusterSpecificInfo(infoTitle, infoValue);
-
- StringBuilder sb = new StringBuilder();
-
- // Cluster properties
- sb.append("<html>");
- sb.append("<table>");
- int i = 0;
- while (i < infoTitle.size() && i < infoValue.size()) {
- sb.append("<tr><td>" + infoTitle.get(i) + "</td><td>" + infoValue.get(i) + "</td></tr>");
- i++;
- }
- sb.append("</table>");
-
- // Evaluation info
- sb.append("<br>");
- sb.append("<b>Evaluation</b><br>");
- sb.append("<table>");
- for (Object o : measure_values.entrySet()) {
- Map.Entry e = (Map.Entry) o;
- sb.append("<tr><td>" + e.getKey() + "</td><td>" + e.getValue() + "</td></tr>");
- }
- sb.append("</table>");
- sb.append("</html>");
- return sb.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Clustering.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Clustering.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Clustering.java
deleted file mode 100644
index 70a5e79..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Clustering.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package com.yahoo.labs.samoa.moa.cluster;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-
-import com.yahoo.labs.samoa.moa.AbstractMOAObject;
-import com.yahoo.labs.samoa.moa.core.AutoExpandVector;
-import com.yahoo.labs.samoa.moa.core.DataPoint;
-import com.yahoo.labs.samoa.instances.Attribute;
-import com.yahoo.labs.samoa.instances.Instance;
-
-public class Clustering extends AbstractMOAObject {
-
- private AutoExpandVector<Cluster> clusters;
-
- public Clustering() {
- this.clusters = new AutoExpandVector<>();
- }
-
- public Clustering(Cluster[] clusters) {
- this.clusters = new AutoExpandVector<>();
- Collections.addAll(this.clusters, clusters);
- }
-
- public Clustering(List<? extends Instance> points) {
- HashMap<Integer, Integer> labelMap = classValues(points);
- int dim = points.get(0).dataset().numAttributes() - 1;
-
- int numClasses = labelMap.size();
- int noiseLabel;
-
- Attribute classLabel = points.get(0).dataset().classAttribute();
- int lastLabelIndex = classLabel.numValues() - 1;
- if ("noise".equalsIgnoreCase(classLabel.value(lastLabelIndex))) {
- noiseLabel = lastLabelIndex;
- } else {
- noiseLabel = -1;
- }
-
- ArrayList<Instance>[] sorted_points = (ArrayList<Instance>[]) new ArrayList[numClasses];
- for (int i = 0; i < numClasses; i++) {
- sorted_points[i] = new ArrayList<>();
- }
-
- for (Instance point : points) {
- int clusterId = (int) point.classValue();
- if (clusterId != noiseLabel) {
- sorted_points[labelMap.get(clusterId)].add(point);
- }
- }
-
- this.clusters = new AutoExpandVector<>();
- for (int i = 0; i < numClasses; i++) {
- if (sorted_points[i].size() > 0) {
- SphereCluster s = new SphereCluster(sorted_points[i], dim);
- s.setId(sorted_points[i].get(0).classValue());
- s.setGroundTruth(sorted_points[i].get(0).classValue());
- clusters.add(s);
- }
- }
- }
-
- public Clustering(ArrayList<DataPoint> points, double overlapThreshold, int initMinPoints) {
- HashMap<Integer, Integer> labelMap = Clustering.classValues(points);
- int dim = points.get(0).dataset().numAttributes() - 1;
-
- int numClasses = labelMap.size();
-
- ArrayList<DataPoint>[] sorted_points = (ArrayList<DataPoint>[]) new ArrayList[numClasses];
- for (int i = 0; i < numClasses; i++) {
- sorted_points[i] = new ArrayList<>();
- }
-
- for (DataPoint point : points) {
- int clusterId = (int) point.classValue();
- if (clusterId != -1) {
- sorted_points[labelMap.get(clusterId)].add(point);
- }
- }
-
- clusters = new AutoExpandVector<>();
- for (int i = 0; i < numClasses; i++) {
- ArrayList<SphereCluster> microByClass = new ArrayList<>();
- ArrayList<DataPoint> pointInCluster = new ArrayList<>();
- ArrayList<ArrayList<Instance>> pointInMicroClusters = new ArrayList<>();
-
- pointInCluster.addAll(sorted_points[i]);
- while (pointInCluster.size() > 0) {
- ArrayList<Instance> micro_points = new ArrayList<>();
- for (int j = 0; j < initMinPoints && !pointInCluster.isEmpty(); j++) {
- micro_points.add(pointInCluster.get(0));
- pointInCluster.remove(0);
- }
- if (micro_points.size() > 0) {
- SphereCluster s = new SphereCluster(micro_points, dim);
- for (int c = 0; c < microByClass.size(); c++) {
- if ((microByClass.get(c)).overlapRadiusDegree(s) > overlapThreshold) {
- micro_points.addAll(pointInMicroClusters.get(c));
- s = new SphereCluster(micro_points, dim);
- pointInMicroClusters.remove(c);
- microByClass.remove(c);
- }
- }
-
- for (int j = 0; j < pointInCluster.size(); j++) {
- Instance instance = pointInCluster.get(j);
- if (s.getInclusionProbability(instance) > 0.8) {
- pointInCluster.remove(j);
- micro_points.add(instance);
- }
- }
- s.setWeight(micro_points.size());
- microByClass.add(s);
- pointInMicroClusters.add(micro_points);
- }
- }
- //
- boolean changed = true;
- while (changed) {
- changed = false;
- for (int c = 0; c < microByClass.size(); c++) {
- for (int c1 = c + 1; c1 < microByClass.size(); c1++) {
- double overlap = microByClass.get(c).overlapRadiusDegree(microByClass.get(c1));
- if (overlap > overlapThreshold) {
- pointInMicroClusters.get(c).addAll(pointInMicroClusters.get(c1));
- SphereCluster s = new SphereCluster(pointInMicroClusters.get(c), dim);
- microByClass.set(c, s);
- pointInMicroClusters.remove(c1);
- microByClass.remove(c1);
- changed = true;
- break;
- }
- }
- }
- }
-
- for (SphereCluster microByClas : microByClass) {
- microByClas.setGroundTruth(sorted_points[i].get(0).classValue());
- clusters.add(microByClas);
- }
- }
-
- for (int j = 0; j < clusters.size(); j++) {
- clusters.get(j).setId(j);
- }
-
- }
-
- /**
- * @param points - points to be clustered
- * @return an array with the min and max class label value
- */
- public static HashMap<Integer, Integer> classValues(List<? extends Instance> points) {
- HashMap<Integer, Integer> classes = new HashMap<>();
- int workCluster = 0;
- boolean hasNoise = false;
- for (Instance point : points) {
- int label = (int) point.classValue();
- if (label == -1) {
- hasNoise = true;
- } else {
- if (!classes.containsKey(label)) {
- classes.put(label, workCluster);
- workCluster++;
- }
- }
- }
-
- if (hasNoise) {
- classes.put(-1, workCluster);
- }
- return classes;
- }
-
- public Clustering(AutoExpandVector<Cluster> clusters) {
- this.clusters = clusters;
- }
-
- /**
- * add a cluster to the clustering
- */
- public void add(Cluster cluster) {
- clusters.add(cluster);
- }
-
- /**
- * remove a cluster from the clustering
- */
- public void remove(int index) {
- if (index < clusters.size()) {
- clusters.remove(index);
- }
- }
-
- /**
- * remove a cluster from the clustering
- */
- public Cluster get(int index) {
- if (index < clusters.size()) {
- return clusters.get(index);
- }
- return null;
- }
-
- /**
- * @return the <code>Clustering</code> as an AutoExpandVector
- */
- public AutoExpandVector<Cluster> getClustering() {
- return clusters;
- }
-
- /**
- * @return A deepcopy of the <code>Clustering</code> as an AutoExpandVector
- */
- public AutoExpandVector<Cluster> getClusteringCopy() {
- return (AutoExpandVector<Cluster>) clusters.copy();
- }
-
- /**
- * @return the number of clusters
- */
- public int size() {
- return clusters.size();
- }
-
- /**
- * @return the number of dimensions of this clustering
- */
- public int dimension() {
- assert (clusters.size() != 0);
- return clusters.get(0).getCenter().length;
- }
-
- @Override
- public void getDescription(StringBuilder sb, int i) {
- sb.append("Clustering Object");
- }
-
- public double getMaxInclusionProbability(Instance point) {
- double maxInclusion = 0.0;
- for (Cluster cluster : clusters) {
- maxInclusion = Math.max(cluster.getInclusionProbability(point), maxInclusion);
- }
- return maxInclusion;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Miniball.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Miniball.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Miniball.java
deleted file mode 100644
index 1cfcf52..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/Miniball.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.yahoo.labs.samoa.moa.cluster;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.dreizak.miniball.model.ArrayPointSet;
-import com.dreizak.miniball.model.PointSet;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Miniball {
-
- private int dimension;
- private com.dreizak.miniball.highdim.Miniball mb;
- private PointStorage pointSet;
-
- public Miniball(int dimension) {
- this.dimension = dimension;
- }
-
- void clear() {
- this.pointSet = new PointStorage(this.dimension);
- }
-
- void check_in(double[] array) {
- this.pointSet.add(array);
- }
-
- double[] center() {
- return this.mb.center();
- }
-
- double radius() {
- return this.mb.radius();
- }
-
- void build() {
- this.mb = new com.dreizak.miniball.highdim.Miniball(this.pointSet);
- }
-
- public class PointStorage implements PointSet {
-
- protected int dimension;
- protected List<double[]> L;
-
- public PointStorage(int dimension) {
- this.dimension = dimension;
- this.L = new ArrayList<double[]>();
- }
-
- public void add(double[] array) {
- this.L.add(array);
- }
-
- public int size() {
- return L.size();
- }
-
- public int dimension() {
- return dimension;
- }
-
- public double coord(int point, int coordinate) {
- return L.get(point)[coordinate];
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/SphereCluster.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/SphereCluster.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/SphereCluster.java
deleted file mode 100644
index 55c8fdd..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/cluster/SphereCluster.java
+++ /dev/null
@@ -1,363 +0,0 @@
-package com.yahoo.labs.samoa.moa.cluster;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.instances.DenseInstance;
-import com.yahoo.labs.samoa.instances.Instance;
-import java.util.List;
-import java.util.Random;
-
-/**
- * A simple implementation of the <code>Cluster</code> interface representing spherical clusters. The inclusion
- * probability is one inside the sphere and zero everywhere else.
- *
- */
-public class SphereCluster extends Cluster {
-
- private static final long serialVersionUID = 1L;
-
- private double[] center;
- private double radius;
- private double weight;
-
- public SphereCluster(double[] center, double radius) {
- this(center, radius, 1.0);
- }
-
- public SphereCluster() {
- }
-
- public SphereCluster(double[] center, double radius, double weightedSize) {
- this();
- this.center = center;
- this.radius = radius;
- this.weight = weightedSize;
- }
-
- public SphereCluster(int dimensions, double radius, Random random) {
- this();
- this.center = new double[dimensions];
- this.radius = radius;
-
- // Position randomly but keep hypersphere inside the boundaries
- double interval = 1.0 - 2 * radius;
- for (int i = 0; i < center.length; i++) {
- this.center[i] = (random.nextDouble() * interval) + radius;
- }
- this.weight = 0.0;
- }
-
- public SphereCluster(List<? extends Instance> instances, int dimension) {
- this();
- if (instances == null || instances.size() <= 0)
- return;
-
- weight = instances.size();
-
- Miniball mb = new Miniball(dimension);
- mb.clear();
-
- for (Instance instance : instances) {
- mb.check_in(instance.toDoubleArray());
- }
-
- mb.build();
- center = mb.center();
- radius = mb.radius();
- mb.clear();
- }
-
- /**
- * Checks whether two <code>SphereCluster</code> overlap based on radius NOTE: overlapRadiusDegree only calculates the
- * overlap based on the centers and the radi, so not the real overlap
- *
- * TODO: should we do this by MC to get the real overlap???
- *
- * @param other
- * @return
- */
-
- public double overlapRadiusDegree(SphereCluster other) {
-
- double[] center0 = getCenter();
- double radius0 = getRadius();
-
- double[] center1 = other.getCenter();
- double radius1 = other.getRadius();
-
- double radiusBig;
- double radiusSmall;
- if (radius0 < radius1) {
- radiusBig = radius1;
- radiusSmall = radius0;
- }
- else {
- radiusBig = radius0;
- radiusSmall = radius1;
- }
-
- double dist = 0;
- for (int i = 0; i < center0.length; i++) {
- double delta = center0[i] - center1[i];
- dist += delta * delta;
- }
- dist = Math.sqrt(dist);
-
- if (dist > radiusSmall + radiusBig)
- return 0;
- if (dist + radiusSmall <= radiusBig) {
- // one lies within the other
- return 1;
- }
- else {
- return (radiusSmall + radiusBig - dist) / (2 * radiusSmall);
- }
- }
-
- public void combine(SphereCluster cluster) {
- double[] center = getCenter();
- double[] newcenter = new double[center.length];
- double[] other_center = cluster.getCenter();
- double other_weight = cluster.getWeight();
- double other_radius = cluster.getRadius();
-
- for (int i = 0; i < center.length; i++) {
- newcenter[i] = (center[i] * getWeight() + other_center[i] * other_weight) / (getWeight() + other_weight);
- }
-
- center = newcenter;
- double r_0 = getRadius() + Math.abs(distance(center, newcenter));
- double r_1 = other_radius + Math.abs(distance(other_center, newcenter));
- radius = Math.max(r_0, r_1);
- weight += other_weight;
- }
-
- public void merge(SphereCluster cluster) {
- double[] c0 = getCenter();
- double w0 = getWeight();
- double r0 = getRadius();
-
- double[] c1 = cluster.getCenter();
- double w1 = cluster.getWeight();
- double r1 = cluster.getRadius();
-
- // vector
- double[] v = new double[c0.length];
- // center distance
- double d = 0;
-
- for (int i = 0; i < c0.length; i++) {
- v[i] = c0[i] - c1[i];
- d += v[i] * v[i];
- }
- d = Math.sqrt(d);
-
- double r;
- double[] c = new double[c0.length];
-
- // one lays within the others
- if (d + r0 <= r1 || d + r1 <= r0) {
- if (d + r0 <= r1) {
- r = r1;
- c = c1;
- }
- else {
- r = r0;
- c = c0;
- }
- }
- else {
- r = (r0 + r1 + d) / 2.0;
- for (int i = 0; i < c.length; i++) {
- c[i] = c1[i] - v[i] / d * (r1 - r);
- }
- }
-
- setCenter(c);
- setRadius(r);
- setWeight(w0 + w1);
-
- }
-
- @Override
- public double[] getCenter() {
- double[] copy = new double[center.length];
- System.arraycopy(center, 0, copy, 0, center.length);
- return copy;
- }
-
- public void setCenter(double[] center) {
- this.center = center;
- }
-
- public double getRadius() {
- return radius;
- }
-
- public void setRadius(double radius) {
- this.radius = radius;
- }
-
- @Override
- public double getWeight() {
- return weight;
- }
-
- public void setWeight(double weight) {
- this.weight = weight;
- }
-
- @Override
- public double getInclusionProbability(Instance instance) {
- if (getCenterDistance(instance) <= getRadius()) {
- return 1.0;
- }
- return 0.0;
- }
-
- public double getCenterDistance(Instance instance) {
- double distance = 0.0;
- // get the center through getCenter so subclass have a chance
- double[] center = getCenter();
- for (int i = 0; i < center.length; i++) {
- double d = center[i] - instance.value(i);
- distance += d * d;
- }
- return Math.sqrt(distance);
- }
-
- public double getCenterDistance(SphereCluster other) {
- return distance(getCenter(), other.getCenter());
- }
-
- /*
- * the minimal distance between the surface of two clusters. is negative if
- * the two clusters overlap
- */
- public double getHullDistance(SphereCluster other) {
- double distance;
- // get the center through getCenter so subclass have a chance
- double[] center0 = getCenter();
- double[] center1 = other.getCenter();
- distance = distance(center0, center1);
-
- distance = distance - getRadius() - other.getRadius();
- return distance;
- }
-
- /*
- */
- /**
- * When a clusters looses points the new minimal bounding sphere can be partly outside of the originating cluster. If
- * a another cluster is right next to the original cluster (without overlapping), the new cluster can be overlapping
- * with this second cluster. OverlapSave will tell you if the current cluster can degenerate so much that it overlaps
- * with cluster 'other'
- *
- * @param other
- * the potentially overlapping cluster
- * @return true if cluster can potentially overlap
- */
- public boolean overlapSave(SphereCluster other) {
- // use basic geometry to figure out the maximal degenerated cluster
- // comes down to Max(radius *(sin alpha + cos alpha)) which is
- double minDist = Math.sqrt(2) * (getRadius() + other.getRadius());
- double diff = getCenterDistance(other) - minDist;
-
- return diff > 0;
- }
-
- private double distance(double[] v1, double[] v2) {
- double distance = 0.0;
- double[] center = getCenter();
- for (int i = 0; i < center.length; i++) {
- double d = v1[i] - v2[i];
- distance += d * d;
- }
- return Math.sqrt(distance);
- }
-
- public double[] getDistanceVector(Instance instance) {
- return distanceVector(getCenter(), instance.toDoubleArray());
- }
-
- public double[] getDistanceVector(SphereCluster other) {
- return distanceVector(getCenter(), other.getCenter());
- }
-
- private double[] distanceVector(double[] v1, double[] v2) {
- double[] v = new double[v1.length];
- for (int i = 0; i < v1.length; i++) {
- v[i] = v2[i] - v1[i];
- }
- return v;
- }
-
- /**
- * Samples this cluster by returning a point from inside it.
- *
- * @param random
- * a random number source
- * @return a point that lies inside this cluster
- */
- public Instance sample(Random random) {
- // Create sample in hypersphere coordinates
- // get the center through getCenter so subclass have a chance
- double[] center = getCenter();
-
- final int dimensions = center.length;
-
- final double sin[] = new double[dimensions - 1];
- final double cos[] = new double[dimensions - 1];
- final double length = random.nextDouble() * getRadius();
-
- double lastValue = 1.0;
- for (int i = 0; i < dimensions - 1; i++) {
- double angle = random.nextDouble() * 2 * Math.PI;
- sin[i] = lastValue * Math.sin(angle); // Store cumulative values
- cos[i] = Math.cos(angle);
- lastValue = sin[i];
- }
-
- // Calculate cartesian coordinates
- double res[] = new double[dimensions];
-
- // First value uses only cosines
- res[0] = center[0] + length * cos[0];
-
- // Loop through 'middle' coordinates which use cosines and sines
- for (int i = 1; i < dimensions - 1; i++) {
- res[i] = center[i] + length * sin[i - 1] * cos[i];
- }
-
- // Last value uses only sines
- res[dimensions - 1] = center[dimensions - 1] + length * sin[dimensions - 2];
-
- return new DenseInstance(1.0, res);
- }
-
- @Override
- protected void getClusterSpecificInfo(List<String> infoTitle, List<String> infoValue) {
- super.getClusterSpecificInfo(infoTitle, infoValue);
- infoTitle.add("Radius");
- infoValue.add(Double.toString(getRadius()));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/AbstractClusterer.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/AbstractClusterer.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/AbstractClusterer.java
deleted file mode 100644
index 8fb386b..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/AbstractClusterer.java
+++ /dev/null
@@ -1,298 +0,0 @@
-package com.yahoo.labs.samoa.moa.clusterers;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-import com.yahoo.labs.samoa.moa.cluster.Clustering;
-
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.core.Measurement;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.core.StringUtils;
-import com.yahoo.labs.samoa.moa.options.AbstractOptionHandler;
-import com.github.javacliparser.FlagOption;
-import com.github.javacliparser.IntOption;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-import com.yahoo.labs.samoa.instances.Instance;
-import com.yahoo.labs.samoa.instances.Instances;
-
-public abstract class AbstractClusterer extends AbstractOptionHandler
- implements Clusterer {
-
- @Override
- public String getPurposeString() {
- return "MOA Clusterer: " + getClass().getCanonicalName();
- }
-
- protected InstancesHeader modelContext;
-
- protected double trainingWeightSeenByModel = 0.0;
-
- protected int randomSeed = 1;
-
- protected IntOption randomSeedOption;
-
- public FlagOption evaluateMicroClusteringOption;
-
- protected Random clustererRandom;
-
- protected Clustering clustering;
-
- public AbstractClusterer() {
- if (isRandomizable()) {
- this.randomSeedOption = new IntOption("randomSeed", 'r',
- "Seed for random behaviour of the Clusterer.", 1);
- }
-
- if (implementsMicroClusterer()) {
- this.evaluateMicroClusteringOption =
- new FlagOption("evaluateMicroClustering", 'M',
- "Evaluate the underlying microclustering instead of the macro clustering");
- }
- }
-
- @Override
- public void prepareForUseImpl(TaskMonitor monitor,
- ObjectRepository repository) {
- if (this.randomSeedOption != null) {
- this.randomSeed = this.randomSeedOption.getValue();
- }
- if (!trainingHasStarted()) {
- resetLearning();
- }
- clustering = new Clustering();
- }
-
- public void setModelContext(InstancesHeader ih) {
- if ((ih != null) && (ih.classIndex() < 0)) {
- throw new IllegalArgumentException(
- "Context for a Clusterer must include a class to learn");
- }
- if (trainingHasStarted()
- && (this.modelContext != null)
- && ((ih == null) || !contextIsCompatible(this.modelContext, ih))) {
- throw new IllegalArgumentException(
- "New context is not compatible with existing model");
- }
- this.modelContext = ih;
- }
-
- public InstancesHeader getModelContext() {
- return this.modelContext;
- }
-
- public void setRandomSeed(int s) {
- this.randomSeed = s;
- if (this.randomSeedOption != null) {
- // keep option consistent
- this.randomSeedOption.setValue(s);
- }
- }
-
- public boolean trainingHasStarted() {
- return this.trainingWeightSeenByModel > 0.0;
- }
-
- public double trainingWeightSeenByModel() {
- return this.trainingWeightSeenByModel;
- }
-
- public void resetLearning() {
- this.trainingWeightSeenByModel = 0.0;
- if (isRandomizable()) {
- this.clustererRandom = new Random(this.randomSeed);
- }
- resetLearningImpl();
- }
-
- public void trainOnInstance(Instance inst) {
- if (inst.weight() > 0.0) {
- this.trainingWeightSeenByModel += inst.weight();
- trainOnInstanceImpl(inst);
- }
- }
-
- public Measurement[] getModelMeasurements() {
- List<Measurement> measurementList = new LinkedList<Measurement>();
- measurementList.add(new Measurement("model training instances",
- trainingWeightSeenByModel()));
- measurementList.add(new Measurement("model serialized size (bytes)",
- measureByteSize()));
- Measurement[] modelMeasurements = getModelMeasurementsImpl();
- if (modelMeasurements != null) {
- for (Measurement measurement : modelMeasurements) {
- measurementList.add(measurement);
- }
- }
- // add average of sub-model measurements
- Clusterer[] subModels = getSubClusterers();
- if ((subModels != null) && (subModels.length > 0)) {
- List<Measurement[]> subMeasurements = new LinkedList<Measurement[]>();
- for (Clusterer subModel : subModels) {
- if (subModel != null) {
- subMeasurements.add(subModel.getModelMeasurements());
- }
- }
- Measurement[] avgMeasurements = Measurement
- .averageMeasurements(subMeasurements
- .toArray(new Measurement[subMeasurements.size()][]));
- for (Measurement measurement : avgMeasurements) {
- measurementList.add(measurement);
- }
- }
- return measurementList.toArray(new Measurement[measurementList.size()]);
- }
-
- public void getDescription(StringBuilder out, int indent) {
- StringUtils.appendIndented(out, indent, "Model type: ");
- out.append(this.getClass().getName());
- StringUtils.appendNewline(out);
- Measurement.getMeasurementsDescription(getModelMeasurements(), out,
- indent);
- StringUtils.appendNewlineIndented(out, indent, "Model description:");
- StringUtils.appendNewline(out);
- if (trainingHasStarted()) {
- getModelDescription(out, indent);
- } else {
- StringUtils.appendIndented(out, indent,
- "Model has not been trained.");
- }
- }
-
- public Clusterer[] getSubClusterers() {
- return null;
- }
-
- @Override
- public Clusterer copy() {
- return (Clusterer) super.copy();
- }
-
- // public boolean correctlyClassifies(Instance inst) {
- // return Utils.maxIndex(getVotesForInstance(inst)) == (int) inst
- // .classValue();
- // }
-
- public String getClassNameString() {
- return InstancesHeader.getClassNameString(this.modelContext);
- }
-
- public String getClassLabelString(int classLabelIndex) {
- return InstancesHeader.getClassLabelString(this.modelContext,
- classLabelIndex);
- }
-
- public String getAttributeNameString(int attIndex) {
- return InstancesHeader.getAttributeNameString(this.modelContext,
- attIndex);
- }
-
- public String getNominalValueString(int attIndex, int valIndex) {
- return InstancesHeader.getNominalValueString(this.modelContext,
- attIndex, valIndex);
- }
-
- // originalContext notnull
- // newContext notnull
- public static boolean contextIsCompatible(InstancesHeader originalContext,
- InstancesHeader newContext) {
- // rule 1: num classes can increase but never decrease
- // rule 2: num attributes can increase but never decrease
- // rule 3: num nominal attribute values can increase but never decrease
- // rule 4: attribute types must stay in the same order (although class
- // can
- // move; is always skipped over)
- // attribute names are free to change, but should always still represent
- // the original attributes
- if (newContext.numClasses() < originalContext.numClasses()) {
- return false; // rule 1
- }
- if (newContext.numAttributes() < originalContext.numAttributes()) {
- return false; // rule 2
- }
- int oPos = 0;
- int nPos = 0;
- while (oPos < originalContext.numAttributes()) {
- if (oPos == originalContext.classIndex()) {
- oPos++;
- if (!(oPos < originalContext.numAttributes())) {
- break;
- }
- }
- if (nPos == newContext.classIndex()) {
- nPos++;
- }
- if (originalContext.attribute(oPos).isNominal()) {
- if (!newContext.attribute(nPos).isNominal()) {
- return false; // rule 4
- }
- if (newContext.attribute(nPos).numValues() < originalContext
- .attribute(oPos).numValues()) {
- return false; // rule 3
- }
- } else {
- assert (originalContext.attribute(oPos).isNumeric());
- if (!newContext.attribute(nPos).isNumeric()) {
- return false; // rule 4
- }
- }
- oPos++;
- nPos++;
- }
- return true; // all checks clear
- }
-
- // reason for ...Impl methods:
- // ease programmer burden by not requiring them to remember calls to super
- // in overridden methods & will produce compiler errors if not overridden
-
- public abstract void resetLearningImpl();
-
- public abstract void trainOnInstanceImpl(Instance inst);
-
- protected abstract Measurement[] getModelMeasurementsImpl();
-
- public abstract void getModelDescription(StringBuilder out, int indent);
-
- protected static int modelAttIndexToInstanceAttIndex(int index,
- Instance inst) {
- return inst.classIndex() > index ? index : index + 1;
- }
-
- protected static int modelAttIndexToInstanceAttIndex(int index,
- Instances insts) {
- return insts.classIndex() > index ? index : index + 1;
- }
-
- public boolean implementsMicroClusterer() {
- return false;
- }
-
- public boolean keepClassLabel() {
- return false;
- }
-
- public Clustering getMicroClusteringResult() {
- return null;
- };
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/ClusterGenerator.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/ClusterGenerator.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/ClusterGenerator.java
deleted file mode 100644
index 2ddb770..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/ClusterGenerator.java
+++ /dev/null
@@ -1,356 +0,0 @@
-package com.yahoo.labs.samoa.moa.clusterers;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Random;
-import com.github.javacliparser.FloatOption;
-import com.github.javacliparser.IntOption;
-import com.yahoo.labs.samoa.moa.cluster.Clustering;
-import com.yahoo.labs.samoa.moa.cluster.SphereCluster;
-import com.yahoo.labs.samoa.moa.core.Measurement;
-import com.yahoo.labs.samoa.moa.core.DataPoint;
-import com.yahoo.labs.samoa.instances.Instance;
-
-public class ClusterGenerator extends AbstractClusterer {
-
- private static final long serialVersionUID = 1L;
-
- public IntOption timeWindowOption = new IntOption("timeWindow",
- 't', "Rang of the window.", 1000);
-
- public FloatOption radiusDecreaseOption = new FloatOption("radiusDecrease", 'r',
- "The average radii of the centroids in the model.", 0, 0, 1);
-
- public FloatOption radiusIncreaseOption = new FloatOption("radiusIncrease", 'R',
- "The average radii of the centroids in the model.", 0, 0, 1);
-
- public FloatOption positionOffsetOption = new FloatOption("positionOffset", 'p',
- "The average radii of the centroids in the model.", 0, 0, 1);
-
- public FloatOption clusterRemoveOption = new FloatOption("clusterRemove", 'D',
- "Deletes complete clusters from the clustering.", 0, 0, 1);
-
- public FloatOption joinClustersOption = new FloatOption("joinClusters", 'j',
- "Join two clusters if their hull distance is less minRadius times this factor.", 0, 0, 1);
-
- public FloatOption clusterAddOption = new FloatOption("clusterAdd", 'A',
- "Adds additional clusters.", 0, 0, 1);
-
- private static double err_intervall_width = 0.0;
- private ArrayList<DataPoint> points;
- private int instanceCounter;
- private int windowCounter;
- private Random random;
- private Clustering sourceClustering = null;
-
- @Override
- public void resetLearningImpl() {
- points = new ArrayList<DataPoint>();
- instanceCounter = 0;
- windowCounter = 0;
- random = new Random(227);
-
- // joinClustersOption.set();
- // evaluateMicroClusteringOption.set();
- }
-
- @Override
- public void trainOnInstanceImpl(Instance inst) {
- if (windowCounter >= timeWindowOption.getValue()) {
- points.clear();
- windowCounter = 0;
- }
- windowCounter++;
- instanceCounter++;
- points.add(new DataPoint(inst, instanceCounter));
- }
-
- @Override
- public boolean implementsMicroClusterer() {
- return true;
- }
-
- public void setSourceClustering(Clustering source) {
- sourceClustering = source;
- }
-
- @Override
- public Clustering getMicroClusteringResult() {
- // System.out.println("Numcluster:"+clustering.size()+" / "+num);
- // Clustering source_clustering = new Clustering(points, overlapThreshold,
- // microInitMinPoints);
- if (sourceClustering == null) {
-
- System.out.println("You need to set a source clustering for the ClusterGenerator to work");
- return null;
- }
- return alterClustering(sourceClustering);
- }
-
- public Clustering getClusteringResult() {
- sourceClustering = new Clustering(points);
- // if(sourceClustering == null){
- // System.out.println("You need to set a source clustering for the ClusterGenerator to work");
- // return null;
- // }
- return alterClustering(sourceClustering);
- }
-
- private Clustering alterClustering(Clustering scclustering) {
- // percentage of the radius that will be cut off
- // 0: no changes to radius
- // 1: radius of 0
- double errLevelRadiusDecrease = radiusDecreaseOption.getValue();
-
- // 0: no changes to radius
- // 1: radius 100% bigger
- double errLevelRadiusIncrease = radiusIncreaseOption.getValue();
-
- // 0: no changes
- // 1: distance between centers is 2 * original radius
- double errLevelPosition = positionOffsetOption.getValue();
-
- int numRemoveCluster = (int) (clusterRemoveOption.getValue() * scclustering.size());
-
- int numAddCluster = (int) (clusterAddOption.getValue() * scclustering.size());
-
- for (int c = 0; c < numRemoveCluster; c++) {
- int delId = random.nextInt(scclustering.size());
- scclustering.remove(delId);
- }
-
- int numCluster = scclustering.size();
- double[] err_seeds = new double[numCluster];
- double err_seed_sum = 0.0;
- double tmp_seed;
- for (int i = 0; i < numCluster; i++) {
- tmp_seed = random.nextDouble();
- err_seeds[i] = err_seed_sum + tmp_seed;
- err_seed_sum += tmp_seed;
- }
-
- double sumWeight = 0;
- for (int i = 0; i < numCluster; i++) {
- sumWeight += scclustering.get(i).getWeight();
- }
-
- Clustering clustering = new Clustering();
-
- for (int i = 0; i < numCluster; i++) {
- if (!(scclustering.get(i) instanceof SphereCluster)) {
- System.out.println("Not a Sphere Cluster");
- continue;
- }
- SphereCluster sourceCluster = (SphereCluster) scclustering.get(i);
- double[] center = Arrays.copyOf(sourceCluster.getCenter(), sourceCluster.getCenter().length);
- double weight = sourceCluster.getWeight();
- double radius = sourceCluster.getRadius();
-
- // move cluster center
- if (errLevelPosition > 0) {
- double errOffset = random.nextDouble() * err_intervall_width / 2.0;
- double errOffsetDirection = ((random.nextBoolean()) ? 1 : -1);
- double level = errLevelPosition + errOffsetDirection * errOffset;
- double[] vector = new double[center.length];
- double vectorLength = 0;
- for (int d = 0; d < center.length; d++) {
- vector[d] = (random.nextBoolean() ? 1 : -1) * random.nextDouble();
- vectorLength += Math.pow(vector[d], 2);
- }
- vectorLength = Math.sqrt(vectorLength);
-
- // max is when clusters are next to each other
- double length = 2 * radius * level;
-
- for (int d = 0; d < center.length; d++) {
- // normalize length and then strecht to reach error position
- vector[d] = vector[d] / vectorLength * length;
- }
- // System.out.println("Center "+Arrays.toString(center));
- // System.out.println("Vector "+Arrays.toString(vector));
- // check if error position is within bounds
- double[] newCenter = new double[center.length];
- for (int d = 0; d < center.length; d++) {
- // check bounds, otherwise flip vector
- if (center[d] + vector[d] >= 0 && center[d] + vector[d] <= 1) {
- newCenter[d] = center[d] + vector[d];
- }
- else {
- newCenter[d] = center[d] + (-1) * vector[d];
- }
- }
- center = newCenter;
- for (int d = 0; d < center.length; d++) {
- if (newCenter[d] >= 0 && newCenter[d] <= 1) {
- }
- else {
- System.out
- .println("This shouldnt have happend, Cluster center out of bounds:" + Arrays.toString(newCenter));
- }
- }
- // System.out.println("new Center "+Arrays.toString(newCenter));
-
- }
-
- // alter radius
- if (errLevelRadiusDecrease > 0 || errLevelRadiusIncrease > 0) {
- double errOffset = random.nextDouble() * err_intervall_width / 2.0;
- int errOffsetDirection = ((random.nextBoolean()) ? 1 : -1);
-
- if (errLevelRadiusDecrease > 0 && (errLevelRadiusIncrease == 0 || random.nextBoolean())) {
- double level = (errLevelRadiusDecrease + errOffsetDirection * errOffset);// *sourceCluster.getWeight()/sumWeight;
- level = (level < 0) ? 0 : level;
- level = (level > 1) ? 1 : level;
- radius *= (1 - level);
- }
- else {
- double level = errLevelRadiusIncrease + errOffsetDirection * errOffset;
- level = (level < 0) ? 0 : level;
- level = (level > 1) ? 1 : level;
- radius += radius * level;
- }
- }
-
- SphereCluster newCluster = new SphereCluster(center, radius, weight);
- newCluster.setMeasureValue("Source Cluster", "C" + sourceCluster.getId());
-
- clustering.add(newCluster);
- }
-
- if (joinClustersOption.getValue() > 0) {
- clustering = joinClusters(clustering);
- }
-
- // add new clusters by copying clusters and set a random center
- for (int c = 0; c < numAddCluster; c++) {
- int copyId = random.nextInt(clustering.size());
- SphereCluster scorg = (SphereCluster) clustering.get(copyId);
- int dim = scorg.getCenter().length;
- double[] center = new double[dim];
- double radius = scorg.getRadius();
-
- boolean outofbounds = true;
- int tryCounter = 0;
- while (outofbounds && tryCounter < 20) {
- tryCounter++;
- outofbounds = false;
- for (int j = 0; j < center.length; j++) {
- center[j] = random.nextDouble();
- if (center[j] - radius < 0 || center[j] + radius > 1) {
- outofbounds = true;
- break;
- }
- }
- }
- if (outofbounds) {
- System.out.println("Coludn't place additional cluster");
- }
- else {
- SphereCluster scnew = new SphereCluster(center, radius, scorg.getWeight() / 2);
- scorg.setWeight(scorg.getWeight() - scnew.getWeight());
- clustering.add(scnew);
- }
- }
-
- return clustering;
-
- }
-
- private Clustering joinClusters(Clustering clustering) {
-
- double radiusFactor = joinClustersOption.getValue();
- boolean[] merged = new boolean[clustering.size()];
-
- Clustering mclustering = new Clustering();
-
- if (radiusFactor > 0) {
- for (int c1 = 0; c1 < clustering.size(); c1++) {
- SphereCluster sc1 = (SphereCluster) clustering.get(c1);
- double minDist = Double.MAX_VALUE;
- double minOver = 1;
- int maxindexCon = -1;
- int maxindexOver = -1;
- for (int c2 = 0; c2 < clustering.size(); c2++) {
- SphereCluster sc2 = (SphereCluster) clustering.get(c2);
- // double over = sc1.overlapRadiusDegree(sc2);
- // if(over > 0 && over < minOver){
- // minOver = over;
- // maxindexOver = c2;
- // }
- double dist = sc1.getHullDistance(sc2);
- double threshold = Math.min(sc1.getRadius(), sc2.getRadius()) * radiusFactor;
- if (dist > 0 && dist < minDist && dist < threshold) {
- minDist = dist;
- maxindexCon = c2;
- }
- }
- int maxindex = -1;
- if (maxindexOver != -1)
- maxindex = maxindexOver;
- else
- maxindex = maxindexCon;
-
- if (maxindex != -1 && !merged[c1]) {
- merged[c1] = true;
- merged[maxindex] = true;
- SphereCluster scnew = new SphereCluster(sc1.getCenter(), sc1.getRadius(), sc1.getWeight());
- SphereCluster sc2 = (SphereCluster) clustering.get(maxindex);
- scnew.merge(sc2);
- mclustering.add(scnew);
- }
- }
- }
-
- for (int i = 0; i < merged.length; i++) {
- if (!merged[i])
- mclustering.add(clustering.get(i));
- }
-
- return mclustering;
-
- }
-
- @Override
- protected Measurement[] getModelMeasurementsImpl() {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- public void getModelDescription(StringBuilder out, int indent) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- public boolean isRandomizable() {
- return false;
- }
-
- @Override
- public boolean keepClassLabel() {
- return true;
- }
-
- public double[] getVotesForInstance(Instance inst) {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/Clusterer.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/Clusterer.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/Clusterer.java
deleted file mode 100644
index 80c243d..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/clusterers/Clusterer.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.yahoo.labs.samoa.moa.clusterers;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.moa.MOAObject;
-import com.yahoo.labs.samoa.moa.cluster.Clustering;
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.core.Measurement;
-import com.yahoo.labs.samoa.moa.options.OptionHandler;
-import com.yahoo.labs.samoa.instances.Instance;
-
-public interface Clusterer extends MOAObject, OptionHandler {
-
- public void setModelContext(InstancesHeader ih);
-
- public InstancesHeader getModelContext();
-
- public boolean isRandomizable();
-
- public void setRandomSeed(int s);
-
- public boolean trainingHasStarted();
-
- public double trainingWeightSeenByModel();
-
- public void resetLearning();
-
- public void trainOnInstance(Instance inst);
-
- public double[] getVotesForInstance(Instance inst);
-
- public Measurement[] getModelMeasurements();
-
- public Clusterer[] getSubClusterers();
-
- public Clusterer copy();
-
- public Clustering getClusteringResult();
-
- public boolean implementsMicroClusterer();
-
- public Clustering getMicroClusteringResult();
-
- public boolean keepClassLabel();
-
-}