001/**
002 * Copyright (c) 2011, The University of Southampton and the individual contributors.
003 * All rights reserved.
004 *
005 * Redistribution and use in source and binary forms, with or without modification,
006 * are permitted provided that the following conditions are met:
007 *
008 *   *  Redistributions of source code must retain the above copyright notice,
009 *      this list of conditions and the following disclaimer.
010 *
011 *   *  Redistributions in binary form must reproduce the above copyright notice,
012 *      this list of conditions and the following disclaimer in the documentation
013 *      and/or other materials provided with the distribution.
014 *
015 *   *  Neither the name of the University of Southampton nor the names of its
016 *      contributors may be used to endorse or promote products derived from this
017 *      software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package org.openimaj.experiment.evaluation.classification;
031
032import java.util.ArrayList;
033import java.util.Collections;
034import java.util.Comparator;
035import java.util.List;
036
037import org.openimaj.util.pair.ObjectDoublePair;
038
039/**
040 * Utility methods for working with {@link ClassificationResult}s
041 *
042 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
043 *
044 */
045public class ClassificationResultUtils {
046
047        private ClassificationResultUtils() {
048        }
049
050        /**
051         * Get the class with the highest confidence
052         *
053         * @param result
054         *            the {@link ClassificationResult} to work with
055         * @return the class with the highest confidence
056         */
057        public static <CLASS> CLASS getHighestConfidenceClass(ClassificationResult<CLASS> result) {
058                CLASS bestClass = null;
059                double bestConfidence = 0;
060                for (final CLASS s : result.getPredictedClasses())
061                {
062                        if (result.getConfidence(s) >= bestConfidence)
063                        {
064                                bestClass = s;
065                                bestConfidence = result.getConfidence(s);
066                        }
067                }
068
069                return bestClass;
070        }
071
072        /**
073         * Get the all classes and confidences, sorted by decreasing confidence
074         *
075         * @param result
076         *            the {@link ClassificationResult} to work with
077         * @return the sorted classes and confidences
078         */
079        public static <CLASS>
080                        List<ObjectDoublePair<CLASS>>
081                        getSortedClassesAndConfidences(ClassificationResult<CLASS> result)
082        {
083                final List<ObjectDoublePair<CLASS>> list = new ArrayList<>();
084
085                for (final CLASS clz : result.getPredictedClasses()) {
086                        list.add(new ObjectDoublePair<>(clz, result.getConfidence(clz)));
087                }
088
089                Collections.sort(list, new Comparator<ObjectDoublePair<CLASS>>() {
090                        @Override
091                        public int compare(ObjectDoublePair<CLASS> o1, ObjectDoublePair<CLASS> o2) {
092                                return -1 * Double.compare(o1.second, o2.second);
093                        }
094                });
095
096                return list;
097        }
098}