// 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; }