Example #1
0
// X es la matriz de datos ([m casos] X [n features + BIAS])
// X ya se supone normalizada, y con la columna de BIAS agregada.
// Y es la matriz de respuestas ([m casos] X [c categorias posibles])
fmat SGD(const fmat& X, const fmat& Y, double alpha) {

    int m = X.n_rows; // Filas = casos
    int n = X.n_cols; // Columnas = features + BIAS
    int c = Y.n_cols; // Categorias posibles
    double lambda = 4.0;

    fmat Theta(n, c);
    fmat reg(n, c);
    fmat gradient(n, c);
    Theta.fill(0.0);

    int its = m/SGD_N;
    fmat subX, subY;
    double loss;

    for (int i = 0; i < GD_IT; i++) {
        // SGD. Debería modularizar un poco esto. Quizás con un define.
        // cout << "iterancion " << i << endl;
        for (int j = 0; j < its; j++) {
            subX = X.rows(SGD_N*j, SGD_N*(j+1)-1);
            subY = Y.rows(SGD_N*j, SGD_N*(j+1)-1);
            Theta = gdStep(Theta, subX, subY, alpha, lambda);
        }
        // Tomo las filas que faltan.

        subX = X.rows(its*SGD_N, m - 1);
        subY = Y.rows(its*SGD_N, m - 1);
        Theta = gdStep(Theta, subX, subY, alpha, lambda);

        cout << "terminada la iteración: %d" << i;
#ifndef NDEBUG
        if (i % 10 == 0) {
            loss = logloss(predict(X, Theta), Y);
            cout << " logloss %G" << loss;
        }
#endif
        cout << endl;
    }
    loss = logloss(predict(X, Theta), Y);
    cout << "Logloss final: " << loss << endl;

    return Theta;
}