blob: 8fc80c70d7d3ea152b32b342bdfc1f08f036782a [file] [log] [blame]
package org.apache.samoa.moa.core;
/*
* #%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 org.apache.samoa.moa.AbstractMOAObject;
/**
* Class for storing an evaluation measurement.
*
* @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
* @version $Revision: 7 $
*/
public class Measurement extends AbstractMOAObject {
private static final long serialVersionUID = 1L;
protected String name;
protected double value;
public Measurement(String name, double value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public double getValue() {
return this.value;
}
public static Measurement getMeasurementNamed(String name,
Measurement[] measurements) {
for (Measurement measurement : measurements) {
if (name.equals(measurement.getName())) {
return measurement;
}
}
return null;
}
public static void getMeasurementsDescription(Measurement[] measurements,
StringBuilder out, int indent) {
if (measurements.length > 0) {
StringUtils.appendIndented(out, indent, measurements[0].toString());
for (int i = 1; i < measurements.length; i++) {
StringUtils.appendNewlineIndented(out, indent, measurements[i].toString());
}
}
}
public static Measurement[] averageMeasurements(Measurement[][] toAverage) {
List<String> measurementNames = new ArrayList<String>();
for (Measurement[] measurements : toAverage) {
for (Measurement measurement : measurements) {
if (measurementNames.indexOf(measurement.getName()) < 0) {
measurementNames.add(measurement.getName());
}
}
}
GaussianEstimator[] estimators = new GaussianEstimator[measurementNames.size()];
for (int i = 0; i < estimators.length; i++) {
estimators[i] = new GaussianEstimator();
}
for (Measurement[] measurements : toAverage) {
for (Measurement measurement : measurements) {
estimators[measurementNames.indexOf(measurement.getName())].addObservation(measurement.getValue(), 1.0);
}
}
List<Measurement> averagedMeasurements = new ArrayList<Measurement>();
for (int i = 0; i < measurementNames.size(); i++) {
String mName = measurementNames.get(i);
GaussianEstimator mEstimator = estimators[i];
if (mEstimator.getTotalWeightObserved() > 1.0) {
averagedMeasurements.add(new Measurement("[avg] " + mName,
mEstimator.getMean()));
averagedMeasurements.add(new Measurement("[err] " + mName,
mEstimator.getStdDev()
/ Math.sqrt(mEstimator.getTotalWeightObserved())));
}
}
return averagedMeasurements.toArray(new Measurement[averagedMeasurements.size()]);
}
@Override
public void getDescription(StringBuilder sb, int indent) {
sb.append(getName());
sb.append(" = ");
sb.append(StringUtils.doubleToString(getValue(), 3));
}
}