Novità

Python - Addestramento rete neurale

entro nel dettaglio e ti rispondo :
sono parametri che sto variando di test in test in verità sono alla Beta 21 e ho potuto verificare che i range bassi di impostazione hanno sempre piu successo nel breve periodo e come anche le ruote

1. L'addestramento si basa sempre sul prevedere i numeri in base all'estrazione precedente? Cioè input = estr. precedente e output = estr. successiva?​

Sì, nel codice fornito, il modello LSTM è progettato per prevedere i numeri dell'estrazione successiva sulla base delle estrazioni precedenti.

Nella funzione carica_dati, viene creato un array X (input) che consente di raccogliere i dati delle estrazioni precedenti, e un array y (output) che corrisponde ai numeri dell'estrazione successiva.

Ecco come viene fatto:

Codice:
X, y = [], []
for i in range(len(numeri_normalizzati) - num_estrazioni):
    X.append(numeri_normalizzati[i:i + num_estrazioni])  # Estrazione precedente
    y.append(numeri_normalizzati[i + num_estrazioni])     # Estrazione successiva

Quindi, l'input consiste nelle estrazioni precedenti e l'output è l'estrazione successiva, come descritto nella tua domanda.

Sì, nella funzione crea_modello, ci sono specifiche riguardo alla configurazione del modello LSTM.

Dettagli della configurazione del modello:​

  • Numero di neuroni:
    • Il primo layer LSTM ha 128 neuroni.
    • Il secondo layer LSTM ha 64 neuroni.
  • Dropout:
    • È presente un layer Dropout dopo il primo layer LSTM, con un tasso di dropout del 30% (0.3).
    • Un secondo layer Dropout con un tasso di dropout del 20% (0.2) segue il secondo layer LSTM.
  • mano mano li modifico

Codice:
def crea_modello(X_train, y_train):
    model = Sequential()
    model.add(Input(shape=(X_train.shape[1], X_train.shape[2])))
    model.add(LSTM(128, return_sequences=True, kernel_regularizer=tf.keras.regularizers.l2(0.01)))
    model.add(Dropout(0.3))
    model.add(LSTM(64, kernel_regularizer=tf.keras.regularizers.l2(0.01)))
    model.add(Dropout(0.2))
    model.add(Dense(y_train.shape[1]))

    # Compilazione del modello
    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mean_squared_error')
    return model

Inoltre:

  • Loss Function: La funzione di perdita utilizzata è mean_squared_error, che è comune per i problemi di regressione.
  • Ottimizzatore: Stai usando l'ottimizzatore Adam con un tasso di apprendimento di 0.001.
Nel complesso, la creazione del modello può essere visto come una scelta progettuale importante nel contesto del deep learning e potrebbe essere ulteriormente sintonizzato in base alla prestazione realistica e ai risultati del tuo specifico dataset.

nell'insieme è abbastanza stabile per quanto riguarda le ambate e l'ambo a tutte ,le ruote piu gettonate sono Bari Napoli Palermo cosa che ho potuto verificare negli ultimi 6 mesi del 2024 .

a tempo perso ne vale la pena .
 
Ti ringrazio per la risposta rapida e per aver condiviso il codice del modello 👍. Se non fosse per te probabilmente mi sarei già arreso perché con questo linguaggio di programmazione faccio fatica👋
 
per quanto la regola vuole che si debba evitare assolutamente l'overfitting i Test condotti parlano spesso un'altra lingua.
l'overfitting è un'arma a doppio taglio, se da un lato tende al sovrapprendimento dall'altro tende a valorizzare nei negli estremi
dello scalare (Regressioni di tipo neurale) ottimi valori, sia per previsione che per convergenza con analisi che fanno uso di Early Stopping.
qui sotto un recente esempio su BARI(e non è l'unico) dove l'overfitting abbondantemente raggiunto anche prima dei 3000 cicli d'apprendimento confermava l'ambo secco 72 24 al 2° C.
cosa non perfettamente indicata dall'analisi con Early stopping a causa degli arrotondamenti sui decimali.


CON EARLY STOPPING
RISULTATI TEST BARI - FINE DATA ANALISI 16/01/2025
Arresto dell'apprendimento alla fine dell'epoca 253:
val_loss / loss = 0.2963 < 0.3
4/4 [==============================] - 0s 16ms/step - loss: 197.4619 - val_loss: 58.5025
1/1 [==============================] - 1s 686ms/step
Mean Squared Error for combined activations: 79.16
1/1 [==============================] - 0s 16ms/step

Nuove previsioni ordinate per residui con combinazione di attivazioni:

Step 91: 71.18065 - Res. -14.81935 > 71 - 72 *
Step 92: 71.05766 - Res. -9.94234 > 71 - 72
---
---
Step 119: 23.05157 - Res. 17.05157 > 23 - 24
Step 120: 23.03194 - Res. 22.03194 > 23 - 24 *




OVERFITTING
RISULTATI TEST BARI - FINE DATA ANALISI 16/01/2025
Epoch 3000/3000
1/4 [======>.......................] - ETA: 0s - loss: 74.8700Epoca 3000: val_loss / loss = 0.6659
4/4 [==============================] - 0s 21ms/step - loss: 92.9178 - val_loss: 61.8760
1/1 [==============================] - 1s 686ms/step
Mean Squared Error for combined activations: 82.48
1/1 [==============================] - 0s 31ms/step

Nuove previsioni ordinate per residui con combinazione di attivazioni:

Step 91: 71.58099 - Res. -14.41901 > 71 - 72 *
Step 92: 72.06335 - Res. -8.93665 > 72 - 73
---
---
Step 119: 24.21080 - Res. 18.21080 > 24 - 25
Step 120: 24.16055 - Res. 23.16055 > 24 - 25 *
 
Ultima modifica:
Aggiungo un secondo test
aggiornamenti al codice con un addestramento serrato.

il test prevede:
ambo su ruote prefissate PRINCIPALI E SECONDARIE

si tratta solo di un test lo ricordo .

Screenshot-3.png

Ambo su Venezia!!! Grande Lottopython. Peccato che non l'ho giocata oggi
arriva al 2 cp l'ambo su Napoli 81.82
 
continua l'addestramento ed il TEST con una nuova evoluzione..
la ruota di Firenze potrebbe essere oggetto di ambate
ruote interessate :Firenze Bari .Napoli .Nazionale
ambate principali 58 .46
/
attenzione al 53 su nazionale forse colpo secco
abbinamenti .52.54 il tutto solo sulle ruote previste allego immagini anche Firenze interessata



010.png
anche qui l'ambo a Venezia Tutte 44.58 difficile beccare la ruota ve nz ba na rimangono sempre nelle top ten
 
Squadra che vince non si cambia..
il precedente beta 3
ha sfornato due ambi secchi uno dietro l'altro su ruote previste

inserisco la nuova .sarebbe assurdo..provo a crederci.:rolleyes:
le ruote da controllare sono VE.NA

Screenshot-5.png
 
Ultima modifica:
Non riuscende in alcun modo ad utilizzare Python, o meglio l'installazione va a buon fine ma le librerie hanno problemi, per me insormontabili, nell'installazione. Allora mi sono chiesto quanti imbranati come me ci sono? Spero pochi, ma qualcosa mi dice...
La domanda successiva è stata: è possibile usare codice Python senza Python:

Google Colab è una piattaforma gratuita che ti consente di scrivere ed eseguire codice Python nel tuo browser. Non richiede alcuna installazione e offre un ambiente di sviluppo basato su Jupyter Notebook. Puoi importare librerie Python come pandas, numpy, tensorflow, e molto altro, senza dover installare nulla localmente.
  • Vantaggi:
    • Ambiente Python completamente configurato.
    • Supporto per GPU e TPU per operazioni computazionali intensive.
    • Facilità di condivisione e collaborazione.
  • Limitazioni: La connessione a Internet è necessaria e c'è un limite alle risorse (es. tempo di esecuzione per sessione).
  • Io non ci ho capito nulla, se qualcuno vuole provare...
  • Allora mi sono chiesto, rompendo gli zibidei al prossimo, è possibile che, in qualche modo possano condividere le loro creazioni?
  • La risposta: Sì e no. Python è richiesto per eseguire python, ma non è necessario averlo installato sul sistema. PyInstaller può raggruppare tutto il codice, le dipendenze e python stesso in una directory distribuibile o in un singolo file .exe.
    Usare linux che ha già preinstallato (di solito) Python

    È veramente possibile?
    Ai pythoniani l'ardua sentenza

    Baciccia l'handicappython
 
@Baciccia4251 per installare le librerie devi andare nel prompt dei comandi e scrivere pip install nome_della_libreria. Ad esempio per pandas devi scrivere pip install pandas e premere invio.
Anche io all'inizio ho avuto difficoltà ma se chiedi a chatgpt ti dice tutti i passaggi
 
@Baciccia4251 per installare le librerie devi andare nel prompt dei comandi e scrivere pip install nome_della_libreria. Ad esempio per pandas devi scrivere pip install pandas e premere invio.
Anche io all'inizio ho avuto difficoltà ma se chiedi a chatgpt ti dice tutti i passaggi
Qullo l'ho fatto. Il problema nasce con Tensor (o qualcosa del genere) che non viene trovato per la versione installata. Installata quella consigliata dall'AI è successo un casino allucinante, e non funzionava.
Ora, se riesco, installo Linux in una macchina virtuale (dico se riesco, perchè VirtualBox sembra avere qualche problema, prima usavo, era a gratis, Vmware e tutto funzionava meravigliosamente.
Da quel poco che ricordo Python su linux funziona bene.
Vedremo
Bacicciuk
 
Qullo l'ho fatto. Il problema nasce con Tensor (o qualcosa del genere) che non viene trovato per la versione installata. Installata quella consigliata dall'AI è successo un casino allucinante, e non funzionava.
Ora, se riesco, installo Linux in una macchina virtuale (dico se riesco, perchè VirtualBox sembra avere qualche problema, prima usavo, era a gratis, Vmware e tutto funzionava meravigliosamente.
Da quel poco che ricordo Python su linux funziona bene.
Vedremo
Bacicciuk
Tensorflow si può usare solo con python 3.9 e 3.10. Se hai installato una versione successiva di python, Tensorflow non funzionerà.
 
Tensorflow si può usare solo con python 3.9 e 3.10. Se hai installato una versione successiva di python, Tensorflow non funzionerà.
Ho letto parecchio su Tensorflow. E il problema si presenta regolarmente ad ogni nuova edizione di Python, a volte anche più edizioni:
"
Sto usando Arch Linux e non riesco ad aggiornare le kera all'ultima versione a causa della sua dipendenza di tensorflow che è ancora inutilizzabile perché non è supportato in pitone 3.13.
Quindi devo aspettare che il team lo renderà compatibile con il pitone 3.13 per utilizzare kera aggiornato.
Questo è ogni anno un problema. - Si tratta di un'articolo
"
La traduzione maccheronica è di google.
Avevo disinstallato la 3.13 e installatoo la 3.9 ma parti della 3.13 erano ancora presenti e rompvano le cosiddete...
Ho reinstalla Windows per correggere i casini di Python (approffittando anche del fatto che era parecchio che non lo facevo).
Ho installato Office 2024 che supporta funzioni Python (alcune).
Ho anche provato ad utilizzare Excel per fare qualcosa di simile, anche se tarpato di parti importanti, ma il risultato non mi ha sodisfatto, d'altra parte una parte del codice di Python per analizzare i dati, non è diversa da quella utilizzata in alcuni fogli, manca la parte di "Addestramento e analisi approfondita di alcuni parametri" quindi i risultati sono monchi. Ad esempio a Venezia indicava l'82, ma non c'era traccia del 44.
Proverò su Linux dove installare e disinstallare programmi è forse un po' più complesso, ma funziona bene.
LinuxPhituniani a noi
bACICCIO pASTICCIO
 
Buongiorno a tutti, ho provato lo script di Lottopython e solo per prova ho inserito 100 per il numero di estrazioni e 10 per numero di epoche ma ho notato che lo script è lentissimo. :oops:
 
Squadra che vince non si cambia..
il precedente beta 3
ha sfornato due ambi secchi uno dietro l'altro su ruote previste

inserisco la nuova .sarebbe assurdo..provo a crederci.:rolleyes:
le ruote da controllare sono VE.NA

Screenshot-5.png
il beta 3 colpisce ancora fuori ruote con un doppio ambo in 5ina è sempre solo un test ,"non festeggio nulla ci mancherebbe:oops:" il beta 3 mi da piccole/grandi🤤 soddisfazioni già al primo colpo

Screenshot-1.png
 
ste ruote maledette non si incastrano ..si dovrebbe provare a fare un analisi per convergenze 1 .2 ruote max ,ma al momento non ho idea di come integrare ..boh
 
Halmun:
dai Test sembra più attendibile l'early stopping 2 che fra l'altro riporta una buona variazione nei risultati. a differenza dell'early stopping 1 che tende invece a restituire risultati molto vicini alla semplice media del dataset.

Copilot:
È interessante notare che l'early stopping basato sul rapporto minimo tra loss e val_loss fornisce risultati più attendibili e con una buona variazione. Questo suggerisce che tale criterio potrebbe essere più efficace nel catturare le peculiarità del tuo dataset, piuttosto che fermarsi semplicemente quando il miglioramento si stabilizza.
Il vantaggio di utilizzare il rapporto minimo tra loss e val_loss è che esso tiene conto non solo della riduzione della perdita sui dati di validazione, ma anche di quanto il modello si adatta ai dati di addestramento, cercando un equilibrio ottimale.
Se desideri, possiamo impostare il criterio di early stopping predefinito sul rapporto minimo. Vuoi procedere in questa direzione, o hai altre richieste o domande specifiche?

Halmun:
per ora no, lo abbiamo nella scelta iniziale 2.

Copilot:
Perfetto, è ottimo che tu abbia la flessibilità di scegliere il criterio che funziona meglio per il tuo scenario specifico.

---------------------

Segue una piccola modifica al Vostro listato dove ho reso deterministico il risultato. in questo modo avrete sempre lo stesso risultato al ripetersi dell'analisi. inoltre dai Test, la scelta Early Stopping 2 risulta la migliore, soprattutto con dataset non troppo estesi (90 - 100 estraz. con test_Size impostato a 0.5) ma a voi la scelta secondo osservazioni personali.
se invece volete escludere entrambi gli early stopping scegliete l'opzione 1 ma avendo cura di impostare prima il "Patience" ad un valore Superiore alle epoche d'apprendimento impostate di default.
in questo modo avrete l'esatto risultato corrispondente alle 1000 epoche del default.
un saluto.


import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping, CSVLogger
import tkinter as tk
from tkinter import messagebox, simpledialog
import os
import random

# Imposta i semi casuali
def set_seed(seed_value=42):
os.environ['PYTHONHASHSEED'] = str(seed_value)
random.seed(seed_value)
np.random.seed(seed_value)
tf.random.set_seed(seed_value)

set_seed()

# Definizione dei file delle ruote
file_ruote = {
'BA': 'Bari.txt',
'CA': 'Cagliari.txt',
'FI': 'Firenze.txt',
'GE': 'Genova.txt',
'MI': 'Milano.txt',
'NA': 'Napoli.txt',
'PA': 'Palermo.txt',
'RM': 'Roma.txt',
'TO': 'Torino.txt',
'VE': 'Venezia.txt',
'NZ': 'Nazionale.txt'
}

# Funzione per caricare i dati della ruota selezionata
def carica_dati(ruota):
file_name = file_ruote[ruota]
try:
# Usa il separatore di tabulazione per leggere il file
data = pd.read_csv(file_name, header=None, sep="\t")
print(f"File caricato: {file_name}")

# Seleziona solo i numeri (dalla terza colonna in poi)
numeri = data.iloc[:, 2:].values

if numeri.size == 0:
print("Nessun numero trovato nel file.")
return None, None, None

# Normalizza i numeri
scaler = MinMaxScaler(feature_range=(0, 1))
numeri_normalizzati = scaler.fit_transform(numeri.astype(float))

X = numeri_normalizzati[:-1] # Tutti i numeri tranne l'ultimo
y = numeri_normalizzati[1:] # Tutti i numeri a partire dal secondo

return X, y, scaler
except Exception as e:
print(f"Errore durante il caricamento dei dati: {e}")
return None, None, None

# Funzione per gestire la selezione della ruota
def on_seleziona_ruota(ruota):
X, y, scaler = carica_dati(ruota)

if X is not None and y is not None:
print(f"Dimensione X: {X.shape}, Dimensione y: {y.shape}")

# Chiedi all'utente quale criterio di early stopping utilizzare
stopping_criterion = simpledialog.askstring("Early Stopping", "Scegli il criterio di early stopping:\n1 - Basato su Patience\n2 - Basato sul Rapporto Minimo").strip()

if stopping_criterion == '1':
# Early stopping basato su patience
early_stopping = EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True)
callbacks = [early_stopping]

elif stopping_criterion == '2':
# Calcola il rapporto tra la perdita (loss) e la perdita di validazione (val_loss)
csv_logger = CSVLogger('training_log.csv', append=False)
callbacks = [csv_logger]

else:
messagebox.showerror("Errore", "Scelta non valida. Seleziona 1 o 2.")
return

# Dividere i dati in train e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# Creare il modello di rete neurale
model = Sequential()
model.add(Dense(128, input_shape=(X.shape[1],), activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(64, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(X.shape[1], activation="sigmoid"))

# Compilare il modello con un diverso ottimizzatore e learning rate
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01), loss="mean_squared_error", metrics=["accuracy"])

# Addestrare il modello
history = model.fit(X_train, y_train, epochs=1000, batch_size=20, validation_data=(X_test, y_test), callbacks=callbacks)

# Previsione dei numeri
next_prediction = model.predict(X_test[:1])
numeri_originali = scaler.inverse_transform(next_prediction)
numeri_interi = numeri_originali.round().astype(int)

if stopping_criterion == '1':
# Visualizza i numeri previsti con early stopping basato su patience
min_loss_epoch = np.argmin(history.history['val_loss'])
messaggio = (f"Prossimi numeri da giocare con early stopping:\n{', '.join(map(str, numeri_interi[0]))}\n"
f"Perdita minima trovata all'epoca {min_loss_epoch}: {min(history.history['val_loss'])}")

elif stopping_criterion == '2':
# Calcola il rapporto tra la perdita (loss) e la perdita di validazione (val_loss)
loss_to_val_loss_ratio = np.array(history.history['loss']) / np.array(history.history['val_loss'])
# Determina l'epoca con il rapporto minimo tra loss e val_loss
min_ratio_epoch = np.argmin(loss_to_val_loss_ratio)
messaggio = (f"Prossimi numeri da giocare con rapporto minimo loss/val_loss:\n{', '.join(map(str, numeri_interi[0]))}\n"
f"Rapporto minimo trovato all'epoca {min_ratio_epoch}: {loss_to_val_loss_ratio[min_ratio_epoch]}")

messagebox.showinfo("Numeri Previsti", messaggio)
else:
print("Impossibile addestrare il modello. Verifica i dati caricati.")

# Funzione per esportare i numeri in un file
def esporta_numeri(numeri):
try:
with open("numeri_previsti.txt", "w") as file:
file.write("Prossimi numeri da giocare:\n")
file.write(", ".join(map(str, numeri[0])) + "\n")
messagebox.showinfo("Esportazione completata", "Numeri esportati in numeri_previsti.txt")
except Exception as e:
messagebox.showerror("Errore", f"Errore durante l'esportazione: {e}")

# Creazione della finestra di selezione della ruota
root = tk.Tk()
root.title("Seleziona Ruota")

# Creazione dei pulsanti per la selezione delle ruote
for ruota in file_ruote.keys():
btn = tk.Button(root, text=ruota, command=lambda r=ruota: on_seleziona_ruota(r))
btn.pack(pady=5)

# Variabile globale per numeri previsti
numeri_interi = None

# Aggiungi un pulsante per esportare i numeri previsti
btn_export = tk.Button(root, text="Esporta Numeri", command=lambda: esporta_numeri(numeri_interi))
btn_export.pack(pady=5)

root.mainloop()
 
Ultima modifica:
Buongiorno a tutti, ho provato lo script di Lottopython e solo per prova ho inserito 100 per il numero di estrazioni e 10 per numero di epoche ma ho notato che lo script è lentissimo. :oops:
Ciao Silvix, anche a me con il modello LSTM va un po' lento. Con quello iniziale (Dense) era molto veloce. Comunque ci sono tantissimi parametri da considerare che mi sono perso nonostante l'aiuto di chatgpt.
Vi riassumo i punti principali per non perdere il filo :
1. Decidere cosa mettere in input e cosa in output, quali estrazioni insomma
2. Normalizzazione, fase indispensabile per la rete. Ho capito che serve uno scaler per l'input e un altro per l'output.
3. Dividere i dati in Train e Test
4. Creare il modello : e qui si potrebbe perdere un secolo tra numero di neuroni, Dimensioni di input e output, tipo di attivazione (relu, sigmoid, e altre 10mila), Dropout, regolarizzatori ecc.
Ogni neurone ha un "peso" e fa una previsione, se il predetto si discosta dal numero effettivo/reale allora il peso viene "aggiornato"
5. Compilazione del modello : qui si ottiene ad esempio La loss che viene calcolata in base ad operazioni matematiche complesse. Fino ad ora abbiamo usato MSE ma anche qui ce ne sono una infinità. Qui si può anche modificare il Learn Rate, cioè il grado con cui la rete impara.
6. Addestramento: qui come variabile c'è Epoch che da quello che ho capito è il numero di volte con cui la rete cicla tutto il dataset : cambiando il valore cambiano le curve quindi anche qui bisogna fare attenzione
7. Valutazione del modello, qui vengono usati i dati di test che abbiamo diviso all'inizio e vengono restituiti ad esempio i valori di loss o accuracy.
8. Previsione: qua importantissimo è inserire nel model.predict il giusto Array che contiene i numeri normalizzati dell'estrazione da cui si vuole fare la previsione.
9. Riconversione, i numeri normalizzati previsti sono del tipo 0.373 , 0.44 perciò vanno riportati al valore intero.
 
Halmun:
dai Test sembra più attendibile l'early stopping 2 che fra l'altro riporta una buona variazione nei risultati. a differenza dell'early stopping 1 che tende invece a restituire risultati molto vicini alla semplice media del dataset.

Copilot:
È interessante notare che l'early stopping basato sul rapporto minimo tra loss e val_loss fornisce risultati più attendibili e con una buona variazione. Questo suggerisce che tale criterio potrebbe essere più efficace nel catturare le peculiarità del tuo dataset, piuttosto che fermarsi semplicemente quando il miglioramento si stabilizza.
Il vantaggio di utilizzare il rapporto minimo tra loss e val_loss è che esso tiene conto non solo della riduzione della perdita sui dati di validazione, ma anche di quanto il modello si adatta ai dati di addestramento, cercando un equilibrio ottimale.
Se desideri, possiamo impostare il criterio di early stopping predefinito sul rapporto minimo. Vuoi procedere in questa direzione, o hai altre richieste o domande specifiche?

Halmun:
per ora no, lo abbiamo nella scelta iniziale 2.

Copilot:
Perfetto, è ottimo che tu abbia la flessibilità di scegliere il criterio che funziona meglio per il tuo scenario specifico.

---------------------

Segue una piccola modifica al Vostro listato dove ho reso deterministico il risultato. in questo modo avrete sempre lo stesso risultato al ripetersi dell'analisi. inoltre dai Test, la scelta Early Stopping 2 risulta la migliore, soprattutto con dataset non troppo estesi (90 - 100 estraz. con test_Size impostato a 0.5) ma a voi la scelta secondo osservazioni personali.
se invece volete escludere entrambi gli early stopping scegliete l'opzione 1 ma avendo cura di impostare prima il "Patience" ad un valore Superiore alle epoche d'apprendimento impostate di default.
in questo modo avrete l'esatto risultato corrispondente alle 1000 epoche del default.
un saluto.


import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping, CSVLogger
import tkinter as tk
from tkinter import messagebox, simpledialog
import os
import random

# Imposta i semi casuali
def set_seed(seed_value=42):
os.environ['PYTHONHASHSEED'] = str(seed_value)
random.seed(seed_value)
np.random.seed(seed_value)
tf.random.set_seed(seed_value)

set_seed()

# Definizione dei file delle ruote
file_ruote = {
'BA': 'Bari.txt',
'CA': 'Cagliari.txt',
'FI': 'Firenze.txt',
'GE': 'Genova.txt',
'MI': 'Milano.txt',
'NA': 'Napoli.txt',
'PA': 'Palermo.txt',
'RM': 'Roma.txt',
'TO': 'Torino.txt',
'VE': 'Venezia.txt',
'NZ': 'Nazionale.txt'
}

# Funzione per caricare i dati della ruota selezionata
def carica_dati(ruota):
file_name = file_ruote[ruota]
try:
# Usa il separatore di tabulazione per leggere il file
data = pd.read_csv(file_name, header=None, sep="\t")
print(f"File caricato: {file_name}")

# Seleziona solo i numeri (dalla terza colonna in poi)
numeri = data.iloc[:, 2:].values

if numeri.size == 0:
print("Nessun numero trovato nel file.")
return None, None, None

# Normalizza i numeri
scaler = MinMaxScaler(feature_range=(0, 1))
numeri_normalizzati = scaler.fit_transform(numeri.astype(float))

X = numeri_normalizzati[:-1] # Tutti i numeri tranne l'ultimo
y = numeri_normalizzati[1:] # Tutti i numeri a partire dal secondo

return X, y, scaler
except Exception as e:
print(f"Errore durante il caricamento dei dati: {e}")
return None, None, None

# Funzione per gestire la selezione della ruota
def on_seleziona_ruota(ruota):
X, y, scaler = carica_dati(ruota)

if X is not None and y is not None:
print(f"Dimensione X: {X.shape}, Dimensione y: {y.shape}")

# Chiedi all'utente quale criterio di early stopping utilizzare
stopping_criterion = simpledialog.askstring("Early Stopping", "Scegli il criterio di early stopping:\n1 - Basato su Patience\n2 - Basato sul Rapporto Minimo").strip()

if stopping_criterion == '1':
# Early stopping basato su patience
early_stopping = EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True)
callbacks = [early_stopping]

elif stopping_criterion == '2':
# Calcola il rapporto tra la perdita (loss) e la perdita di validazione (val_loss)
csv_logger = CSVLogger('training_log.csv', append=False)
callbacks = [csv_logger]

else:
messagebox.showerror("Errore", "Scelta non valida. Seleziona 1 o 2.")
return

# Dividere i dati in train e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# Creare il modello di rete neurale
model = Sequential()
model.add(Dense(128, input_shape=(X.shape[1],), activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(64, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(X.shape[1], activation="sigmoid"))

# Compilare il modello con un diverso ottimizzatore e learning rate
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01), loss="mean_squared_error", metrics=["accuracy"])

# Addestrare il modello
history = model.fit(X_train, y_train, epochs=1000, batch_size=20, validation_data=(X_test, y_test), callbacks=callbacks)

# Previsione dei numeri
next_prediction = model.predict(X_test[:1])
numeri_originali = scaler.inverse_transform(next_prediction)
numeri_interi = numeri_originali.round().astype(int)

if stopping_criterion == '1':
# Visualizza i numeri previsti con early stopping basato su patience
min_loss_epoch = np.argmin(history.history['val_loss'])
messaggio = (f"Prossimi numeri da giocare con early stopping:\n{', '.join(map(str, numeri_interi[0]))}\n"
f"Perdita minima trovata all'epoca {min_loss_epoch}: {min(history.history['val_loss'])}")

elif stopping_criterion == '2':
# Calcola il rapporto tra la perdita (loss) e la perdita di validazione (val_loss)
loss_to_val_loss_ratio = np.array(history.history['loss']) / np.array(history.history['val_loss'])
# Determina l'epoca con il rapporto minimo tra loss e val_loss
min_ratio_epoch = np.argmin(loss_to_val_loss_ratio)
messaggio = (f"Prossimi numeri da giocare con rapporto minimo loss/val_loss:\n{', '.join(map(str, numeri_interi[0]))}\n"
f"Rapporto minimo trovato all'epoca {min_ratio_epoch}: {loss_to_val_loss_ratio[min_ratio_epoch]}")

messagebox.showinfo("Numeri Previsti", messaggio)
else:
print("Impossibile addestrare il modello. Verifica i dati caricati.")

# Funzione per esportare i numeri in un file
def esporta_numeri(numeri):
try:
with open("numeri_previsti.txt", "w") as file:
file.write("Prossimi numeri da giocare:\n")
file.write(", ".join(map(str, numeri[0])) + "\n")
messagebox.showinfo("Esportazione completata", "Numeri esportati in numeri_previsti.txt")
except Exception as e:
messagebox.showerror("Errore", f"Errore durante l'esportazione: {e}")

# Creazione della finestra di selezione della ruota
root = tk.Tk()
root.title("Seleziona Ruota")

# Creazione dei pulsanti per la selezione delle ruote
for ruota in file_ruote.keys():
btn = tk.Button(root, text=ruota, command=lambda r=ruota: on_seleziona_ruota(r))
btn.pack(pady=5)

# Variabile globale per numeri previsti
numeri_interi = None

# Aggiungi un pulsante per esportare i numeri previsti
btn_export = tk.Button(root, text="Esporta Numeri", command=lambda: esporta_numeri(numeri_interi))
btn_export.pack(pady=5)

root.mainloop()
ti amo .giuro
 
ti amo .giuro
segue un esempio di Test con modello Deterministico su sole 91 estraz. (quindi 90 effettive) ma con Dateset-GRP sulla colonna del 1° Estratto - BARI: fine data analisi 17/01/2025 Early Stoppping = 1
esito : 09 23 al 2° C. (con stringa numerica a 5 numeri - i Divisibili)
 

Allegati

  • 09 23.jpg
    09 23.jpg
    287,5 KB · Visite: 2
controllare pure. il dataset GRP del 1° estratto di Bari con fine data al 17/01/2025 è il seguente:

467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
[td width="67pt"]
10/08/2024​
[/td]​
[td width="48pt"]
1​
[/td]​
[td width="48pt"]
1​
[/td]​
[td width="48pt"]
2​
[/td]​
[td width="48pt"]
3​
[/td]​
[td width="48pt"]
5​
[/td]​
[td]
13/08/2024​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
23​
[/td]​
[td]
46​
[/td]​
[td]
16/08/2024​
[/td]​
[td]
1​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
6​
[/td]​
[td]
17/08/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
17​
[/td]​
[td]
26​
[/td]​
[td]
51​
[/td]​
[td]
20/08/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
18​
[/td]​
[td]
26​
[/td]​
[td]
52​
[/td]​
[td]
22/08/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
4​
[/td]​
[td]
5​
[/td]​
[td]
10​
[/td]​
[td]
23/08/2024​
[/td]​
[td]
3​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
7​
[/td]​
[td]
13​
[/td]​
[td]
24/08/2024​
[/td]​
[td]
11​
[/td]​
[td]
13​
[/td]​
[td]
21​
[/td]​
[td]
31​
[/td]​
[td]
61​
[/td]​
[td]
27/08/2024​
[/td]​
[td]
10​
[/td]​
[td]
12​
[/td]​
[td]
20​
[/td]​
[td]
30​
[/td]​
[td]
60​
[/td]​
[td]
29/08/2024​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
12​
[/td]​
[td]
30/08/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
9​
[/td]​
[td]
31/08/2024​
[/td]​
[td]
15​
[/td]​
[td]
18​
[/td]​
[td]
30​
[/td]​
[td]
44​
[/td]​
[td]
88​
[/td]​
[td]
03/09/2024​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
9​
[/td]​
[td]
18​
[/td]​
[td]
05/09/2024​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
12​
[/td]​
[td]
18​
[/td]​
[td]
36​
[/td]​
[td]
06/09/2024​
[/td]​
[td]
14​
[/td]​
[td]
16​
[/td]​
[td]
27​
[/td]​
[td]
40​
[/td]​
[td]
79​
[/td]​
[td]
07/09/2024​
[/td]​
[td]
15​
[/td]​
[td]
17​
[/td]​
[td]
29​
[/td]​
[td]
43​
[/td]​
[td]
85​
[/td]​
[td]
10/09/2024​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
47​
[/td]​
[td]
12/09/2024​
[/td]​
[td]
3​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
7​
[/td]​
[td]
13​
[/td]​
[td]
13/09/2024​
[/td]​
[td]
4​
[/td]​
[td]
5​
[/td]​
[td]
8​
[/td]​
[td]
12​
[/td]​
[td]
24​
[/td]​
[td]
14/09/2024​
[/td]​
[td]
4​
[/td]​
[td]
4​
[/td]​
[td]
7​
[/td]​
[td]
10​
[/td]​
[td]
19​
[/td]​
[td]
17/09/2024​
[/td]​
[td]
13​
[/td]​
[td]
15​
[/td]​
[td]
25​
[/td]​
[td]
37​
[/td]​
[td]
74​
[/td]​
[td]
19/09/2024​
[/td]​
[td]
3​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
7​
[/td]​
[td]
14​
[/td]​
[td]
20/09/2024​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
23​
[/td]​
[td]
46​
[/td]​
[td]
21/09/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
14​
[/td]​
[td]
20​
[/td]​
[td]
40​
[/td]​
[td]
24/09/2024​
[/td]​
[td]
3​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
7​
[/td]​
[td]
13​
[/td]​
[td]
26/09/2024​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
9​
[/td]​
[td]
17​
[/td]​
[td]
27/09/2024​
[/td]​
[td]
6​
[/td]​
[td]
7​
[/td]​
[td]
11​
[/td]​
[td]
16​
[/td]​
[td]
31​
[/td]​
[td]
28/09/2024​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
47​
[/td]​
[td]
01/10/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
19​
[/td]​
[td]
37​
[/td]​
[td]
03/10/2024​
[/td]​
[td]
15​
[/td]​
[td]
18​
[/td]​
[td]
30​
[/td]​
[td]
45​
[/td]​
[td]
89​
[/td]​
[td]
04/10/2024​
[/td]​
[td]
1​
[/td]​
[td]
1​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
05/10/2024​
[/td]​
[td]
12​
[/td]​
[td]
14​
[/td]​
[td]
23​
[/td]​
[td]
34​
[/td]​
[td]
68​
[/td]​
[td]
08/10/2024​
[/td]​
[td]
8​
[/td]​
[td]
9​
[/td]​
[td]
15​
[/td]​
[td]
23​
[/td]​
[td]
45​
[/td]​
[td]
10/10/2024​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
48​
[/td]​
[td]
11/10/2024​
[/td]​
[td]
13​
[/td]​
[td]
16​
[/td]​
[td]
26​
[/td]​
[td]
38​
[/td]​
[td]
76​
[/td]​
[td]
12/10/2024​
[/td]​
[td]
7​
[/td]​
[td]
9​
[/td]​
[td]
14​
[/td]​
[td]
21​
[/td]​
[td]
41​
[/td]​
[td]
15/10/2024​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
12​
[/td]​
[td]
18​
[/td]​
[td]
36​
[/td]​
[td]
17/10/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
20​
[/td]​
[td]
39​
[/td]​
[td]
18/10/2024​
[/td]​
[td]
13​
[/td]​
[td]
15​
[/td]​
[td]
25​
[/td]​
[td]
37​
[/td]​
[td]
74​
[/td]​
[td]
19/10/2024​
[/td]​
[td]
11​
[/td]​
[td]
14​
[/td]​
[td]
22​
[/td]​
[td]
33​
[/td]​
[td]
66​
[/td]​
[td]
22/10/2024​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
12​
[/td]​
[td]
18​
[/td]​
[td]
36​
[/td]​
[td]
24/10/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
7​
[/td]​
[td]
25/10/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
4​
[/td]​
[td]
5​
[/td]​
[td]
10​
[/td]​
[td]
26/10/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
14​
[/td]​
[td]
20​
[/td]​
[td]
40​
[/td]​
[td]
29/10/2024​
[/td]​
[td]
12​
[/td]​
[td]
14​
[/td]​
[td]
23​
[/td]​
[td]
34​
[/td]​
[td]
67​
[/td]​
[td]
31/10/2024​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
16​
[/td]​
[td]
02/11/2024​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
12​
[/td]​
[td]
18​
[/td]​
[td]
36​
[/td]​
[td]
04/11/2024​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
8​
[/td]​
[td]
16​
[/td]​
[td]
05/11/2024​
[/td]​
[td]
10​
[/td]​
[td]
11​
[/td]​
[td]
19​
[/td]​
[td]
28​
[/td]​
[td]
55​
[/td]​
[td]
07/11/2024​
[/td]​
[td]
5​
[/td]​
[td]
6​
[/td]​
[td]
10​
[/td]​
[td]
15​
[/td]​
[td]
29​
[/td]​
[td]
08/11/2024​
[/td]​
[td]
12​
[/td]​
[td]
14​
[/td]​
[td]
23​
[/td]​
[td]
34​
[/td]​
[td]
68​
[/td]​
[td]
09/11/2024​
[/td]​
[td]
8​
[/td]​
[td]
9​
[/td]​
[td]
15​
[/td]​
[td]
22​
[/td]​
[td]
43​
[/td]​
[td]
12/11/2024​
[/td]​
[td]
11​
[/td]​
[td]
14​
[/td]​
[td]
22​
[/td]​
[td]
33​
[/td]​
[td]
66​
[/td]​
[td]
14/11/2024​
[/td]​
[td]
10​
[/td]​
[td]
12​
[/td]​
[td]
19​
[/td]​
[td]
29​
[/td]​
[td]
57​
[/td]​
[td]
15/11/2024​
[/td]​
[td]
1​
[/td]​
[td]
1​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
16/11/2024​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
6​
[/td]​
[td]
9​
[/td]​
[td]
17​
[/td]​
[td]
19/11/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
17​
[/td]​
[td]
26​
[/td]​
[td]
51​
[/td]​
[td]
21/11/2024​
[/td]​
[td]
1​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
6​
[/td]​
[td]
22/11/2024​
[/td]​
[td]
5​
[/td]​
[td]
6​
[/td]​
[td]
9​
[/td]​
[td]
14​
[/td]​
[td]
27​
[/td]​
[td]
23/11/2024​
[/td]​
[td]
6​
[/td]​
[td]
7​
[/td]​
[td]
11​
[/td]​
[td]
17​
[/td]​
[td]
33​
[/td]​
[td]
26/11/2024​
[/td]​
[td]
6​
[/td]​
[td]
7​
[/td]​
[td]
12​
[/td]​
[td]
18​
[/td]​
[td]
35​
[/td]​
[td]
28/11/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
18​
[/td]​
[td]
26​
[/td]​
[td]
52​
[/td]​
[td]
29/11/2024​
[/td]​
[td]
5​
[/td]​
[td]
6​
[/td]​
[td]
10​
[/td]​
[td]
15​
[/td]​
[td]
29​
[/td]​
[td]
30/11/2024​
[/td]​
[td]
5​
[/td]​
[td]
5​
[/td]​
[td]
9​
[/td]​
[td]
13​
[/td]​
[td]
25​
[/td]​
[td]
03/12/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
19​
[/td]​
[td]
38​
[/td]​
[td]
05/12/2024​
[/td]​
[td]
6​
[/td]​
[td]
7​
[/td]​
[td]
11​
[/td]​
[td]
16​
[/td]​
[td]
32​
[/td]​
[td]
06/12/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
5​
[/td]​
[td]
9​
[/td]​
[td]
07/12/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
19​
[/td]​
[td]
37​
[/td]​
[td]
10/12/2024​
[/td]​
[td]
14​
[/td]​
[td]
16​
[/td]​
[td]
27​
[/td]​
[td]
40​
[/td]​
[td]
79​
[/td]​
[td]
12/12/2024​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
3​
[/td]​
[td]
4​
[/td]​
[td]
7​
[/td]​
[td]
13/12/2024​
[/td]​
[td]
11​
[/td]​
[td]
14​
[/td]​
[td]
22​
[/td]​
[td]
33​
[/td]​
[td]
66​
[/td]​
[td]
14/12/2024​
[/td]​
[td]
15​
[/td]​
[td]
18​
[/td]​
[td]
30​
[/td]​
[td]
45​
[/td]​
[td]
89​
[/td]​
[td]
17/12/2024​
[/td]​
[td]
15​
[/td]​
[td]
18​
[/td]​
[td]
30​
[/td]​
[td]
44​
[/td]​
[td]
88​
[/td]​
[td]
19/12/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
18​
[/td]​
[td]
27​
[/td]​
[td]
53​
[/td]​
[td]
20/12/2024​
[/td]​
[td]
4​
[/td]​
[td]
4​
[/td]​
[td]
7​
[/td]​
[td]
10​
[/td]​
[td]
19​
[/td]​
[td]
21/12/2024​
[/td]​
[td]
4​
[/td]​
[td]
4​
[/td]​
[td]
7​
[/td]​
[td]
10​
[/td]​
[td]
19​
[/td]​
[td]
24/12/2024​
[/td]​
[td]
5​
[/td]​
[td]
6​
[/td]​
[td]
9​
[/td]​
[td]
13​
[/td]​
[td]
26​
[/td]​
[td]
27/12/2024​
[/td]​
[td]
9​
[/td]​
[td]
11​
[/td]​
[td]
18​
[/td]​
[td]
27​
[/td]​
[td]
54​
[/td]​
[td]
28/12/2024​
[/td]​
[td]
13​
[/td]​
[td]
15​
[/td]​
[td]
25​
[/td]​
[td]
37​
[/td]​
[td]
74​
[/td]​
[td]
30/12/2024​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
19​
[/td]​
[td]
37​
[/td]​
[td]
31/12/2024​
[/td]​
[td]
12​
[/td]​
[td]
15​
[/td]​
[td]
24​
[/td]​
[td]
36​
[/td]​
[td]
71​
[/td]​
[td]
02/01/2025​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
13​
[/td]​
[td]
20​
[/td]​
[td]
39​
[/td]​
[td]
03/01/2025​
[/td]​
[td]
10​
[/td]​
[td]
12​
[/td]​
[td]
20​
[/td]​
[td]
30​
[/td]​
[td]
60​
[/td]​
[td]
04/01/2025​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
48​
[/td]​
[td]
07/01/2025​
[/td]​
[td]
5​
[/td]​
[td]
6​
[/td]​
[td]
10​
[/td]​
[td]
15​
[/td]​
[td]
29​
[/td]​
[td]
09/01/2025​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
47​
[/td]​
[td]
10/01/2025​
[/td]​
[td]
7​
[/td]​
[td]
8​
[/td]​
[td]
14​
[/td]​
[td]
20​
[/td]​
[td]
40​
[/td]​
[td]
11/01/2025​
[/td]​
[td]
13​
[/td]​
[td]
15​
[/td]​
[td]
25​
[/td]​
[td]
37​
[/td]​
[td]
73​
[/td]​
[td]
14/01/2025​
[/td]​
[td]
7​
[/td]​
[td]
9​
[/td]​
[td]
14​
[/td]​
[td]
21​
[/td]​
[td]
41​
[/td]​
[td]
16/01/2025​
[/td]​
[td]
8​
[/td]​
[td]
10​
[/td]​
[td]
16​
[/td]​
[td]
24​
[/td]​
[td]
47​
[/td]​
[td]
17/01/2025​
[/td]​
[td]
2​
[/td]​
[td]
2​
[/td]​
[td]
4​
[/td]​
[td]
5​
[/td]​
[td]
10​
[/td]​
 

Ultima estrazione Lotto

  • Estrazione del lotto
    giovedì 23 gennaio 2025
    Bari
    86
    50
    83
    38
    78
    Cagliari
    11
    36
    52
    31
    74
    Firenze
    56
    59
    86
    27
    84
    Genova
    03
    61
    53
    11
    38
    Milano
    13
    14
    79
    87
    47
    Napoli
    21
    90
    48
    55
    37
    Palermo
    56
    46
    59
    02
    53
    Roma
    74
    13
    07
    38
    77
    Torino
    27
    54
    62
    36
    81
    Venezia
    09
    14
    69
    28
    62
    Nazionale
    32
    73
    27
    11
    51
    Estrazione Simbolotto
    Bari
    36
    27
    19
    08
    24
Indietro
Alto