delfos.results.evaluationmeasures.EvaluationMeasure.java Source code

Java tutorial

Introduction

Here is the source code for delfos.results.evaluationmeasures.EvaluationMeasure.java

Source

/*
 * Copyright (C) 2016 jcastro
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package delfos.results.evaluationmeasures;

import delfos.common.parameters.ParameterOwnerAdapter;
import delfos.common.parameters.ParameterOwnerType;
import delfos.common.statisticalfuncions.MeanIterative;
import delfos.dataset.basic.rating.Rating;
import delfos.dataset.basic.rating.RatingsDataset;
import delfos.dataset.basic.rating.RelevanceCriteria;
import delfos.results.MeasureResult;
import delfos.results.RecommendationResults;
import delfos.rs.recommendation.SingleUserRecommendations;
import java.util.Collection;
import java.util.Map;
import org.jdom2.Element;

/**
 * Interfaz que define los mtodos de una mtrica de evaluacin de un sistema de
 * recomendacin.
 *
 * @author jcastro-inf ( https://github.com/jcastro-inf )
 *
 * @version 1.0 19/10/2011
 * @version 1.1 08-Mar-2013
 */
public abstract class EvaluationMeasure extends ParameterOwnerAdapter implements Comparable<Object> {

    /**
     * Nombre de la caracterstica en que se almacena el valor de la medida de
     * evaluacin
     */
    public final static String VALUE_ATTRIBUTE_NAME = "value";

    /**
     * Establece el resultado de una ejecucin en base a las recomendaciones
     * hechas y el conjunto de training
     *
     * @param recommendationResults Vector de resultados de la ejecucin en el
     * que cada elemento es el resultado de la ejecucin con una particin del
     * conjunto
     * @param testDataset Dataset de evaluacin que se usan.
     * @param relevanceCriteria Criterio de relevancia que se usa.
     *
     * @return Devuelve un objeto MeasureResult que almacena el valor de la
     * mtrica para cada ejecucin
     */
    public abstract MeasureResult getMeasureResult(RecommendationResults recommendationResults,
            RatingsDataset<? extends Rating> testDataset, RelevanceCriteria relevanceCriteria);

    /**
     * Devuelve true si la interpretacin correcta de los valores de la medida
     * supone que el sistema de recomendacin asigna las preferencias como una
     * prediccin de la valoracin que el usuario dara al producto
     *
     * @return true si necesita que el sistema de recomendacin a evaluar
     * prediga las valoraciones
     */
    public abstract boolean usesRatingPrediction();

    /**
     * Agrega varios resultados, correspondientes ejecuciones distintas, de esta
     * medida de evaluacin. Las clases que hereden de {@link EvaluationMeasure}
     * deben sobreescribir este mtodo si la agregacin de la medida de
     * evaluacin es compleja.
     *
     * NOTA: Este mtodo agrega los resultados haciendo la media aritmtica de
     * los valores devueltos por el mtodo {@link MeasureResult#getValue()}
     *
     * @param results Resultados que se desean agregar
     *
     * @return Devuelve un objeto {@link MeasureResult} que encapsula el
     * resultado agregado de las ejecuciones
     */
    public final MeasureResult agregateResults(Collection<MeasureResult> results) {
        Element aggregatedElement = new Element(this.getName());
        double aggregatedValue;

        MeanIterative mean = new MeanIterative();
        results.stream().forEach((mr) -> {
            mean.addValue(mr.getValue());
        });
        aggregatedValue = (double) mean.getMean();
        aggregatedElement.setAttribute(EvaluationMeasure.VALUE_ATTRIBUTE_NAME, Double.toString(mean.getMean()));

        return new MeasureResult(this, aggregatedValue);
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof EvaluationMeasure) {
            EvaluationMeasure evaluationMeasure = (EvaluationMeasure) o;
            return this.getName().compareTo(evaluationMeasure.getName());
        }
        throw new IllegalStateException("The object compared with is of an unrecognised type.");
    }

    @Override
    public ParameterOwnerType getParameterOwnerType() {
        return ParameterOwnerType.EVALUATION_MESAURE;
    }

    public Object getUserResult(SingleUserRecommendations singleUserRecommendations,
            Map<Integer, ? extends Rating> userRated) {
        throw new UnsupportedOperationException();
    }

}