All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aliasi.matrix.TaxicabDistance Maven / Gradle / Ivy

Go to download

This is the original Lingpipe: http://alias-i.com/lingpipe/web/download.html There were not made any changes to the source code.

There is a newer version: 4.1.2-JL1.0
Show newest version
/*
 * LingPipe v. 4.1.0
 * Copyright (C) 2003-2011 Alias-i
 *
 * This program is licensed under the Alias-i Royalty Free License
 * Version 1 WITHOUT ANY WARRANTY, without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the Alias-i
 * Royalty Free License Version 1 for more details.
 *
 * You should have received a copy of the Alias-i Royalty Free License
 * Version 1 along with this program; if not, visit
 * http://alias-i.com/lingpipe/licenses/lingpipe-license-1.txt or contact
 * Alias-i, Inc. at 181 North 11th Street, Suite 401, Brooklyn, NY 11211,
 * +1 (718) 290-9170.
 */

package com.aliasi.matrix;

import com.aliasi.util.Distance;

import java.io.Serializable;

/**
 * The TaxicabDistance class implements standard taxicab,
 * or Manhattan distance between vectors.  The taxicab distance forms
 * a metric.  The taxicab distance is often called the
 * L1 distance, because it is 1-norm Minkowski
 * distance after the inventor of the general family of vector
 * distance metrics and related geometries.
 *
 * 

The definition of the taxicab distance over vectors * v1 and v2 is: * *

 * distance(v1,v2) = Σi abs(v1[i] - v2[i])
* * with v1[i] standing for the method call * v1.value(i) and i ranging over the * dimensions of the vectors, which must be the same. * *

An understandable explanation of the taxicab distance * and related distances may be found at: * *

* * @author Bob Carpenter * @version 3.8 * @since LingPipe3.1 */ public class TaxicabDistance implements Distance, Serializable { static final long serialVersionUID = -8456511197031445244L; /** * The taxicab distance. All instances of taxicab distance * perform the same function. Because the distance function is * thread safe, this instance may be used wherever taxicab * distance is needed. */ public static final TaxicabDistance DISTANCE = new TaxicabDistance(); /** * Construct a new taxicab distance. */ public TaxicabDistance() { /* empty constructor */ } /** * Returns the taxicab distance between the specified pair * of vectors. See the class definition above for details. * * @param v1 First vector. * @param v2 Second vector. * @return The distance between the vectors. * @throws IllegalArgumentException If the vectors are not of the * same dimensionality. */ public double distance(Vector v1, Vector v2) { if (v1.numDimensions() != v2.numDimensions()) { String msg = "Vectors must have same dimensions." + " v1.numDimensions()=" + v1.numDimensions() + " v2.numDimensions()=" + v2.numDimensions(); throw new IllegalArgumentException(msg); } if (v1 instanceof SparseFloatVector && v2 instanceof SparseFloatVector) return sparseDistance((SparseFloatVector)v1, (SparseFloatVector)v2); double sum = 0.0; for (int i = v1.numDimensions(); --i >= 0; ) { double diff = Math.abs(v1.value(i) - v2.value(i)); sum += diff; } return sum; } static double sparseDistance(SparseFloatVector v1, SparseFloatVector v2) { double sum = 0.0; int index1 = 0; int index2 = 0; int[] keys1 = v1.mKeys; int[] keys2 = v2.mKeys; float[] vals1 = v1.mValues; float[] vals2 = v2.mValues; while (index1 < keys1.length && index2 < keys2.length) { int comp = keys1[index1] - keys2[index2]; double diff = (comp == 0) ? (vals1[index1++] - vals2[index2++]) : ( (comp < 0) ? vals1[index1++] : vals2[index2++] ); sum += Math.abs(diff); } for ( ; index1 < keys1.length; ++index1) sum += Math.abs(vals1[index1]); for ( ; index2 < keys2.length; ++index2) sum += Math.abs(vals2[index2]); return sum; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy