org.openimaj.ml.clustering.spectral.NormalisedSimilarityDoubleClustererWrapper Maven / Gradle / Ivy
/**
* Copyright (c) 2011, The University of Southampton and the individual contributors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of the University of Southampton nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.openimaj.ml.clustering.spectral;
import org.apache.log4j.Logger;
import org.openimaj.feature.DoubleFV;
import org.openimaj.feature.DoubleFVComparison;
import org.openimaj.feature.FeatureExtractor;
import org.openimaj.ml.clustering.SimilarityClusterer;
import ch.akuhn.matrix.SparseMatrix;
/**
* Wraps the functionality of a {@link SimilarityClusterer} around a dataset
*
* @author Sina Samangooei ([email protected])
*
* @param
*/
public class NormalisedSimilarityDoubleClustererWrapper extends DoubleFVSimilarityFunction {
private double eps;
/**
*
* @param extractor
* @param eps
*/
public NormalisedSimilarityDoubleClustererWrapper(FeatureExtractor extractor, double eps) {
super(extractor);
this.eps = eps;
}
Logger logger = Logger.getLogger(NormalisedSimilarityDoubleClustererWrapper.class);
@Override
protected SparseMatrix similarity() {
final SparseMatrix mat = new SparseMatrix(feats.length, feats.length);
final DoubleFVComparison dist = DoubleFVComparison.EUCLIDEAN;
double maxD = 0;
for (int i = 0; i < feats.length; i++) {
for (int j = i; j < feats.length; j++) {
double d = dist.compare(feats[i], feats[j]);
if (d > eps)
d = Double.NaN;
else {
maxD = Math.max(d, maxD);
}
mat.put(i, j, d);
mat.put(j, i, d);
}
}
final SparseMatrix mat_norm = new SparseMatrix(feats.length, feats.length);
for (int i = 0; i < feats.length; i++) {
for (int j = i; j < feats.length; j++) {
double d = mat.get(i, j);
if (Double.isNaN(d)) {
continue;
}
else {
d /= maxD;
}
mat_norm.put(i, j, 1 - d);
mat_norm.put(j, i, 1 - d);
}
}
return mat_norm;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy