//--------------------------------------------------------------------------------//
// COPYRIGHT NOTICE //
//--------------------------------------------------------------------------------//
// Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) //
// //
// 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 IMSE-CNM 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 HOLDERS 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 xfuzzy.xfsp.model.types;
/**
* <p> <b>Descripci�n:</b> clase com�n a todos los m�todos de validaci�n de
* clusters mediante los �ndices de Dunn (1974).
* <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
* @author Jorge Agudo Praena
* @version 1.3
* @see IXfspTypeSimplifier
* @see IXfspValidityMeasure
* @see XfspTypeSimplifierFactory
*
*/
public abstract class XfspDunnValidityMeasure
implements IXfspValidityMeasure {
//conjunto de datos para los que se quiere conocer el n�mero �ptimo de
//clusters en que se pueden agrupar
private double[][] data;
//pesos asignados a los distintos elementos que tiene cada dato
private double[] weights;
/**
* <p> <b>Descripci�n:</b> crea un medidor del �ndice de valoraci�n de
* clusters seg�n el m�todo de Dunn.
* @param data Conjunto de datos que se quieren agrupar en clusters y del que
* se va a calcular el n�mero �ptimo de ellos.
* @param weights Pesos asignados a cada uno de los elementos que compone un
* data de los que se van a estudiar (como hayan sido definidos previamente).
*
*/
public XfspDunnValidityMeasure(double[][] data, double[] weights) {
//indica los datos con los que va a trabajar
this.data = data;
//referencia los pesos que debe tener cada elemento de cada dato
this.weights = weights;
}
/**
* <p> <b>Descripci�n:</b> obtiene el n�mero �ptimo de clusters en que puede
* agruparse el conjunto de datos con que trabaja el objeto medidor de �ndices
* de valoraci�n.
* @return Devuelve el n�mero �ptimo de clusters en que agrupar los datos
* seg�n el m�todo de Dunn.
*
*/
public int getNumClusters() {
//en principio el n�mero de clusters es igual al n�mero de datos con que
//se cuenta de partida (lo que es equivalente a no agrupar en clusters)
int num = data.length;
//crea un objeto que agrupa datos en clusters con tantos como datos hay...
XfspCluster c = new XfspCluster(data, data.length, weights);
//...y evalua dicho objeto
double max = evaluation(c);
//para todos los posibles valores de clusters desde 2 (valor m�nimo) al
//n�mero de datos con que cuenta menos uno (valor m�ximo)...
for (int i = 2; i < data.length - 1; i++) {
//...crea un objetoq que agrupa los datos en clusters con tantos clusters
//como est� considerando en la iteraci�n actual...
c = new XfspCluster(data, i, weights);
//...y eval�a dicha agrupaci�n en clusters
double eval = evaluation(c);
//si el valor de la evaluaci�n es mejor que el que ten�a hasta el
//momento...
if (eval > max) {
//...actualiza el mejor valor encontrado hasta ahora...
max = eval;
//...y el mejor n�mero de clusters en que se pueden agrupar los datos
num = i;
}
}
//devuelve el mejor n�mero de clusters en que se pueden agrupar los datos
//que se haya encontrado
return num;
}
/**
* <p> <b>Descripci�n:</b> devuelve el resultado de la evaluaci�n de las
* asignaciones de los datos a los distintos clusters que se han hecho.
* @param c Cluster que se quiere evaluar.
* @return Valoraci�n de las asignaciones de los datos de partida a los
* distintos clusters.
*
*/
private double evaluation(XfspCluster c) {
//inicializa el valor m�ximo al menor que puede tomar
double max = 0;
//inicializa el valor m�nimo al mayor valor que puede tomar
double min = Double.MAX_VALUE;
//para cada pareja de clusters...
for (int i = 0; i < c.cluster.length; i++) {
//...sin repetir los c�lculos para ninguna pareja...
for (int j = i + 1; j < c.cluster.length; j++) {
//..calcula la distancia m�nima entre dicha pareja de clusters
double dist = getNumerator(c.data, c.assign, weights, i, j);
//si dicha distancia es menor que el valor m�nimo encontrado hasta
//ahora...
if (dist < min) {
//...actualiza dicho valor m�nimo a la �ltima distancia calculada
min = dist;
}
}
}
//para cada uno de los clusters en que se agrupan los datos...
for (int i = 0; i < c.cluster.length; i++) {
//...obtiene el valor del denominador para dicho cluster
double dist = getDenominator(c.data, c.assign, c.cluster, weights, i);
//si dicho valor es mayor que le m�ximo calculado hasta el momento...
if (dist > max) {
//...establece el nuevo m�ximo
max = dist;
}
}
return min / max;
}
/**
* <p> <b>Descripci�n:</b> devuelve el valor del numerador para cualquiera de
* los m�todos de validaci�n derivados de Dunn.
* @param data Conjunto de datos agrupables en <i>clusters</i>.
* @param assign Asignaci�n hecha de los datos a los distintos
* <i>clusters</i>.
* @param weights Pesos asignados a los par�metros de las funciones de
* pertenencia.
* @param c1 N�mero del primer <i>cluster</i>.
* @param c2 N�mero del segundo <i>cluster</i>.
* @return Valoraci�n del numerador de los m�todos de validaci�n derivados de
* Dunn.
*
*/
abstract protected double getNumerator(double[][] data, int[] assign,
double[] weights, int c1, int c2);
/**
* <p> <b>Descripci�n:</b> devuelve el valor del denominador para cualquiera
* de los m�todos de validaci�n derivados de Dunn.
* @param data Conjunto de datos agrupables en <i>clusters</i>.
* @param assign Asignaci�n hecha de los datos a los distintos
* <i>clusters</i>.
* @param weights Pesos asignados a los par�metros de las funciones de
* pertenencia.
* @param c N�mero del <i>cluster</i>.
* @return Valoraci�n del denominador de los m�todos de validaci�n derivados
* de Dunn.
*
*/
abstract protected double getDenominator(double[][] data, int[] assign,
double[][] cluster, double[] weights,
int c);
}