Overfitting (4 lettori)

Cren

Forumer storico
Che pregate....

Cren, io per le consulenze prendo 170€ l'ora + Iva. Regolati.....
Vedi il mio post precedente. :D
Paolo, è offensivo dare soldi a e accettare soldi da gli amici :D

Però hai tutto il mio affetto e prometto che non lascerò avanzi nel piatto quando mi inviterai a pranzo da te :lol:

Con l'ingegner pprllo di salvatorebagniana memoria non sono così in confidenza da proporre un qualcosa del genere (anche se il suo leggendario «'sti cazzi» orma è entrato negli annali), ma tutto sommato non mi ha chiesto nulla in cambio e ho deciso che il prossimo passo sarà farmi illustrare un algoritmo che mi insegni ad esclamare «'sti cazzi» con la sua nonchalance :cool:
 

Cren

Forumer storico
Funziona! :up:

Adesso cominciamo a complicare un po' le cose...
pprllo, tu che sei (dovresti essere) sui libri, mi trovi le condizioni iniziali per questo?

Codice:
           [,1]        [,2]        [,3]        [,4]        [,5]        [,6]        [,7]       [,8]        [,9]       [,10]
 [1,]  1.00000000  1.00000000  1.00000000  1.00000000  1.00000000  1.00000000  1.00000000  1.0000000  1.00000000  1.00000000
 [2,]  1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [3,]  0.00000000  1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [4,]  0.00000000  0.00000000  1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [5,]  0.00000000  0.00000000  0.00000000  1.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [6,]  0.00000000  0.00000000  0.00000000  0.00000000  1.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [7,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  1.00000000  0.00000000  0.0000000  0.00000000  0.00000000
 [8,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  1.00000000  0.0000000  0.00000000  0.00000000
 [9,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  1.0000000  0.00000000  0.00000000
[10,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  1.00000000  0.00000000
[11,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  1.00000000
[12,] -1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[13,]  0.00000000 -1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[14,]  0.00000000  0.00000000 -1.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[15,]  0.00000000  0.00000000  0.00000000 -1.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[16,]  0.00000000  0.00000000  0.00000000  0.00000000 -1.00000000  0.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[17,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000 -1.00000000  0.00000000  0.0000000  0.00000000  0.00000000
[18,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000 -1.00000000  0.0000000  0.00000000  0.00000000
[19,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000 -1.0000000  0.00000000  0.00000000
[20,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000 -1.00000000  0.00000000
[21,]  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  0.0000000  0.00000000 -1.00000000
[22,] -1.00000000 -1.00000000 -1.00000000 -1.00000000 -1.00000000 -1.00000000 -1.00000000 -1.0000000 -1.00000000 -1.00000000
[23,]  0.01627813  0.02666463  0.01283752  0.05161583  0.03666832  0.03200336  0.01160796  0.0180156  0.02580591  0.02835363

Vincoli:

Codice:
     [,1]
 [1,]  0.99000000
 [2,]  0.00000000
 [3,]  0.00000000
 [4,]  0.00000000
 [5,]  0.00000000
 [6,]  0.00000000
 [7,]  0.00000000
 [8,]  0.00000000
 [9,]  0.00000000
[10,]  0.00000000
[11,]  0.00000000
[12,] -1.00000000
[13,] -1.00000000
[14,] -1.00000000
[15,] -1.00000000
[16,] -1.00000000
[17,] -1.00000000
[18,] -1.00000000
[19,] -1.00000000
[20,] -1.00000000
[21,] -1.00000000
[22,] -1.01000000
[23,]  0.03161189
Se lo fai e mi fai vedere, te vojo bene :D
 

pprllo

Nuovo forumer
Cren, ma allora fai finta di leggermi ! :D

Prendo il listato di prima, lo modifico leggermente
Codice:
#include <cstdlib>
#include <iostream>

using namespace std;

double scalar(double *a, double *b, int i)
{
       double sum = 0;
       for(i--;i >= 0; i--)
              sum += a[i] * b[i];
       return sum;
}

void vsum(double *a, double *b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] += b[i];
}

void vprod(double *a, double b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] *= b;
}

void vcopy(double *a, double *b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] = b[i];
}

double vmod(double *a, int i)
{
       double sum = 0;
       for(i--;i >= 0; i--)
              sum += a[i] * a[i];
       return sum;
}
     
int main(int argc, char *argv[])
{   
    double vect[10] = {0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0};
    
    double a[23][10] = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
                             {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                             {-1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, -1, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, -1, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, -1, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, -1, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, -1, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, -1, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, -1, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, -1, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 0, -1},
                             {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
                             {0.01627813, 0.02666463, 0.01283752, 0.05161583, 0.03666832, 0.03200336, 0.01160796, 0.0180156, 0.02580591, 0.02835363}};
    
    double b[23] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.03161189};
    
    bool NotOk = true;
    while (NotOk)
    {
          NotOk = false;
          for (int i = 0; i < 23; i++)
          {
              //cout << i;
              double d = scalar(vect, a[i], 10) - b[i];
              if (d < 0)
              {
                    NotOk = true;
                    double temp[10];
                    vcopy(temp, a[i], 10);
                    d = (- d + 0.0000000) / vmod(temp, 10);
                    vprod(temp, d, 10);
                    vsum(vect, temp, 10);
              }
          }
    }
    
    for (int i = 0; i < 10; i ++)
        cout << vect[i] << " ";
    cout << endl << endl;

               
    system("PAUSE");
    return EXIT_SUCCESS;
}
output:
Codice:
0.059562 0.102831 0.0452288 0.206775 0.144505 0.125071 0.0401066 0.0668001 0.0992536 0.109867
Se hai bisogno di chiarimenti sul codice spara pure. :D

Comunque da fine sessione a inizio Aprile e' cazzeggio. :D
 
Ultima modifica:

pprllo

Nuovo forumer
Ma quale listato?! :eek:

Me lo sono perso, faccio il mea culpa!

Uso questo e ti ringrazio :D

Quando ho scritto:

Vedi il mio post precedente. :D

Intendevo questo post qui ! :D
Mah, purche' usi un rilassamento semplice e non un sovrarilassamento (cioe' purche' non usi la epsilon) dovrebbe andare. Se usi un sovrarilassamento si inceppa sicuro. :D

PS: Facendo girare l'algoritmo senza epsilon partendo da (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) mi restituisce la soluzione "banale" (0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1), partendo da (0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0) mi restituisce (0.05, 0.05, 0.55, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05), in generale converge in pochi millisecondi da dovunque parto.

Se ti intendi vagamente di C e/o linguaggi procedurali, questo e' il codice (si lo so che e' fetentissimo, l'ho scritto in 10 minuti secchi):
Codice:
#include <cstdlib>
#include <iostream>

using namespace std;

double scalar(double *a, double *b, int i)
{
       double sum = 0;
       for(i--;i >= 0; i--)
              sum += a[i] * b[i];
       return sum;
}

void vsum(double *a, double *b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] += b[i];
}

void vprod(double *a, double b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] *= b;
}

void vcopy(double *a, double *b, int i)
{
       for(i--;i >= 0; i--)
                 a[i] = b[i];
}

double vmod(double *a, int i)
{
       double sum = 0;
       for(i--;i >= 0; i--)
              sum += a[i] * a[i];
       return sum;
}
     
int main(int argc, char *argv[])
{   
    double vect[10] = {0, 0.4, 0.5, 0, 0.2, 0.5, 2, 0, 0, 0};
    
    double a[22][10] = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
                             {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
                             {-1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, -1, 0, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, -1, 0, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, -1, 0, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, -1, 0, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, -1, 0, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, -1, 0, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, -1, 0, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, -1, 0},
                             {0, 0, 0, 0, 0, 0, 0, 0, 0, -1},
                             {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}};
    
    double b[22] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
    
    bool NotOk = true;
    while (NotOk)
    {
          NotOk = false;
          for (int i = 0; i < 22; i++)
          {
              double d = scalar(vect, a[i], 10) - b[i];
              if (d < 0)
              {
                    NotOk = true;
                    double temp[10];
                    vcopy(temp, a[i], 10);
                    d = - d / vmod(temp, 10);
                    vprod(temp, d, 10);
                    vsum(vect, temp, 10);
              }
          }
    }
    
    for (int i = 0; i < 10; i ++)
        cout << vect[i] << " ";
    cout << endl << endl;

               
    system("PAUSE");
    return EXIT_SUCCESS;
}
Comunque il codice e' orribile e poco leggibile, se servono chiarimenti sono a disposizione. :D
 
Ultima modifica:

Cren

Forumer storico
Intendevo questo post qui ! :D
Oops, mi sembrava un VBA alla prima occhiata ma mi è bastato leggere qualche riga per capire che non lo era :(

Ho studiato qualcosa di C++, ma non ho un cavolo con cui eseguirlo qui, non saprei nemmeno da dove partire :sad:

...lo fai girare con la nuova matrice e il nuovo vettore? :piazzista:
 
Ultima modifica:

pprllo

Nuovo forumer
Oops, mi sembrava un VBA alla prima occhiata ma mi è bastato leggere qualche riga per capire che non lo era :(

Ho studiato qualcosa di C++, ma non ho un cavolo con cui eseguirlo qui, non saprei nemmeno da dove partire :sad:
Dunque puoi andare semplicemente qui:
http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe
Installi, crei un nuovo progetto "Console Application", prendi il file di codice che ti si apre e lo sovrascrivi con quel codice li', infine clicchi "Compila & Esegui".

Il problema pero' e' che se devi usare il codice in modo generale e non conosci il C la cosa diventa un po' complicata. :D

I risultati per la matrice ed il vettore che hai dato li ho riportati in calce al post precedente, sono questi qui:
Codice:
0.059562 0.102831 0.0452288 0.206775 0.144505 0.125071 0.0401066 0.0668001 0.0992536 0.109867
:D

Comunque al limite provo a scriverti uno script di excel (2007 va bene ?)
 
Ultima modifica:

Users who are viewing this thread

Alto