Minimización de Error en Discretización Binning

Esta implementación se realizó en C# con ayuda de la librería Math.Net Numerics para matrices y vectores.

Los pasos que se siguieron fueron los siguientes:

1. Organización de los datos de menor a mayor
2. Ejecución del algoritmo BIN Equal-Depth
3. Realizar medición del error inicial y realizar todos los posibles movimientos de ítems de izquierda a derecha para ver si se minimiza el error.
4. Realizar todos los posibles movimientos de derecha a izquierda para ver si se minimiza el error.
5. En caso de que el error luego de efectuar los movimientos sea inferior al error inicial se retorna al paso 3. Si ya el error no se minimiza más se finaliza. El error se mide en base a la suma de las desviaciones con respecto al promedio en cada uno de los grupos.
public static DenseVector[] MinimizeER(DenseVector[] vBins)
{
    DenseVector[] vOutput = new DenseVector[vBins.Length];
    int i = 0;
    int j = 0;

    double Error = CalcularTotalError(vBins);
    double ErrorInicial = Error;
    double ErrorFinal = 0;
    //While Global para volver a iterar si el error todavia se puede disminuir
    while (ErrorInicial > ErrorFinal)
    {
        ErrorInicial = Error;
        //Realizar ajustes en movimientos de items de Izquierda a Derecha
        for (j = 0; j < vBins.Length - 1; j++)
        {
            for (i = 0; i < vBins.Length; i++)
            {
                if (i == j)
                {
                    vOutput[i] = (DenseVector)vBins[i].SubVector(0, vBins[i].Count - 1);
                    //al siguiente vector se le agrega el ultimo item del anterior y la totalidad del siguiente
                    //Se convierte en array antes de iniciar
                    var list = new List();
                    list.AddRange(vBins[i].SubVector(vBins[i].Count - 1, 1).ToArray());
                    list.AddRange(vBins[i + 1].ToArray());
                    vOutput[i + 1] = new DenseVector(list.ToArray());
                    i++; //Esta suma es necesaria ya que si en el i+1 se nos iba por el else, se perdia lo realizado.
                }
                else
                {
                    vOutput[i] = vBins[i];
                }
            }
            //Evaluar el error. Si se redujo volver a realizar el proceso con el mismo j
            if (Error > CalcularTotalError(vOutput))
            {
                j = j - 1; //Se devuelve para que ensaye moviendo en el mismo par de bins
                Error = CalcularTotalError(vOutput);
                vBins = (DenseVector[])vOutput.Clone();
            }
        }

        //Realizar ajustes en movimientos de items de Derecha a Izquierda
        for (j = 1; j < vBins.Length; j++)
        {
            for (i = 0; i < vBins.Length; i++)
            {
                if (i == j)
                {
                    vOutput[i] = (DenseVector)vBins[i].SubVector(1, vBins[i].Count - 1);
                    //al siguiente vector se le agrega el ultimo item del anterior y la totalidad del siguiente
                    //Se convierte en array antes de iniciar
                    var list = new List();
                    list.AddRange(vBins[i - 1].ToArray());
                    list.AddRange(vBins[i].SubVector(0, 1).ToArray());
                    vOutput[i - 1] = new DenseVector(list.ToArray());
                }
                else
                {
                    vOutput[i] = vBins[i];
                }
            }
            //Evaluar el error. Si se redujo volver a realizar el proceso con el mismo j
            if (Error > CalcularTotalError(vOutput))
            {
                j = j - 1; //Se devuelve para que ensaye moviendo en el mismo par de bins
                Error = CalcularTotalError(vOutput);
                vBins = (DenseVector[])vOutput.Clone();
            }
        }
        ErrorFinal = Error;
    }
    return vOutput;
}

Iniciando con:
Bin 1: 1,1,2,2,3,3
Bin 2: 3,4,5,5,5
Bin 3: 5,7,8,9,10

Se Obtuvo:
Bin 1: 1,1,2,2,3,3,3,4
Bin 2: 5,5,5,5,7
Bin 3: 8,9,10

Respecto a lo obtenido en este último algoritmo, creo que teniendo en cuenta que se nos da la cantidad de Bins, se puede obtener una de las clasificaciones óptimas, o una aproximación muy cercana, teniendo en cuenta que minimizamos el error total.

Comentarios

Entradas populares de este blog

Instalar programa como servicio Windows

Ejecutar programa como servicio windows server 2008

Habilitar Ping Firewall Windows 2008