Commit 9658ac9e authored by npedot's avatar npedot
Browse files

sample code for semint clean

parent 9face37a
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import code.logictensornetworks_wrapper as ltnw
# ages=np.random.uniform(0,1,(6,1)).astype(np.float32)
ages = np.array([0.10, 0.20, 0.33, 0.11]).astype(np.float32)
print(ages)
minore = ages[np.where(ages < 0.18)]
print(minore)
maggiore = ages[np.where(ages >= 0.18)]
print(maggiore)
ltnw.variable("?data_maggiore", maggiore)
ltnw.variable("?data_minore", minore)
ltnw.predicate("M", 1)
ltnw.axiom("forall ?data_maggiore: M(?data_maggiore)")
ltnw.axiom("forall ?data_minore: ~M(?data_minore)")
ltnw.initialize_knowledgebase(initial_sat_level_threshold=.1)
sat_level = ltnw.train(track_sat_levels=1000, sat_level_epsilon=.99)
ltnw.constant("g", [0.15])
ltnw.constant("h", [0.75])
print("g is Maggiorenne: %s" % ltnw.ask("M(g)"))
print("h is Maggiorenne: %s" % ltnw.ask("M(h)"))
# -*- coding: utf-8 -*-
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import matplotlib.pyplot as plt
import code.logictensornetworks_wrapper as ltnw
nr_samples=500
data=np.random.uniform([0,0],[1.,1.],(nr_samples,2)).astype(np.float32)
data_A=data[np.where(np.sum(np.square(data-[.5,.5]),axis=1)<.09)]
data_not_A=data[np.where(np.sum(np.square(data-[.5,.5]),axis=1)>=.09)]
ltnw.variable("?data_A",data_A)
ltnw.variable("?data_not_A",data_not_A)
ltnw.variable("?data",data)
ltnw.predicate("A",2)
ltnw.axiom("forall ?data_A: A(?data_A)")
ltnw.axiom("forall ?data_not_A: ~A(?data_not_A)")
ltnw.initialize_knowledgebase(initial_sat_level_threshold=.1)
sat_level=ltnw.train(track_sat_levels=1000,sat_level_epsilon=.99)
ltnw.constant("a",[0.25,.5])
ltnw.constant("b",[1.,1.])
print("a is in A: %s" % ltnw.ask("A(a)"))
print("b is in A: %s" % ltnw.ask("A(b)"))
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import tensorflow as tf
import code.logictensornetworks_wrapper as ltnw
#ltnw.constant('a',[1.,2.,3.,16])
#ltnw.constant('b',[1.,2.,3.,16])
ltnw.constant('a',[1, 15])
ltnw.constant('b',[1, 17])
ltnw.constant('c',[1, 18])
ltnw.constant('d',[1, 22])
ltnw.constant('e',[1, 99])
ltnw.constant('f',[1, ])
ltnw.constant('maggiorenne',[1, 18])
ltnw.constant('roma',[12.,41.])
ltnw.constant('frascati',[12.5,42.])
ltnw.constant('parigi',[48.,2.])
ltnw.function("eta", 1, fun_definition = lambda x:x[:,1])
ltnw.initialize_knowledgebase()
def _maggiorenne(x):
return tf.cast(tf.less_equal(x,18),dtype=tf.float32)
def _crisp_leq(x,y):
return tf.cast(tf.less_equal(x,y),dtype=tf.float32)
def _dist(x,y):
return tf.exp(-tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(x,y)),axis=1,keepdims=True)))
ltnw.predicate("cleq",2,_crisp_leq)
ltnw.predicate("close",2,_dist)
print(ltnw.ask("eta(f)"))
print(ltnw.ask("cleq(eta(maggiorenne),eta(a))"))
print(ltnw.ask("cleq(eta(maggiorenne),eta(b))"))
print(ltnw.ask("cleq(eta(maggiorenne),eta(c))"))
print(ltnw.ask("cleq(eta(maggiorenne),eta(d))"))
print(ltnw.ask("cleq(eta(maggiorenne),eta(e))"))
ltnw.constant('z',[1, 12])
print("z {}".format(ltnw.ask("cleq(eta(maggiorenne),eta(z))")))
print(ltnw.ask('close(roma,parigi)'))
print(ltnw.ask('close(roma,frascati)'))
print(ltnw.ask('close(roma,roma)'))
# -*- coding: utf-8 -*-
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import code.logictensornetworks as ltn
import code.logictensornetworks_wrapper as ltnw
# Hyper-parameters
ltn.LAYERS = 10
ltnw.set_universal_aggreg('min')
EMBEDDING_SIZE = 6
# KNOWLEDGE
constants = list('abcdef')
print(constants)
for c in constants:
ltnw.constant(c,
min_value=[0.]*EMBEDDING_SIZE,
max_value=[1.]*EMBEDDING_SIZE)
def simple_net():
N = tf.Variable(tf.random_normal((EMBEDDING_SIZE, EMBEDDING_SIZE),
stddev=0.1))
def net(x):
a = tf.sigmoid(tf.reduce_sum(
tf.multiply(tf.matmul(x, N), x), axis=1))
print("A SHAPE: {}".format(a.shape))
return a
return net
ltnw.predicate("Adult", EMBEDDING_SIZE, pred_definition=simple_net())
ltnw.predicate("Married", EMBEDDING_SIZE, pred_definition=simple_net())
ltnw.predicate("Worker", EMBEDDING_SIZE, pred_definition=simple_net())
ltnw.variable('x', tf.concat(
[ltnw.CONSTANTS[c] for c in constants if c not in ['b']], axis=0))
# [ltnw.CONSTANTS[c] for c in constants], axis=0))
# RULES
# If Married then is Adult.
ltnw.axiom('forall x:(Married(x) -> Adult(x))')
# If Worker then is Adult.
ltnw.axiom('forall x:(Worker(x) -> Adult(x))')
# Constraints
ltnw.axiom('~Adult(a)')
#ltnw.axiom('Worker(a)')
#ltnw.axiom('~Married(a)')
#ltnw.axiom('Worker(b)')
# *** TRAIN
ltnw.initialize_knowledgebase(optimizer=tf.train.RMSPropOptimizer(
learning_rate=.001),
initial_sat_level_threshold=.1)
sat_level = ltnw.train(track_sat_levels=100,
sat_level_epsilon=.99,
max_epochs=3000)
# *** QUERY
print('Married(a) {}'.format(ltnw.ask('Married(a)')))
print('Worker(a) {}'.format(ltnw.ask('Worker(a)')))
print('Adult(a) {}'.format(ltnw.ask('Adult(a)')))
print('~Adult(a) {}'.format(ltnw.ask('~Adult(a)')))
# constant without rules
print('Worker(b) {}'.format(ltnw.ask('Worker(b)')))
print('Adult(b) {}'.format(ltnw.ask('Adult(b)')))
# constant with rules without informations
print('Worker(c) {}'.format(ltnw.ask('Worker(c)')))
print('Adult(c) {}'.format(ltnw.ask('Adult(c)')))
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import tensorflow as tf
import code.logictensornetworks_wrapper as ltnw
ltnw.constant('a',min_value=[1.,2.,3.,0.],max_value=[1.,2.,3.,100.])
ltnw.constant('b',min_value=[4.,5.,6.,0.],max_value=[4.,5.,6.,100.])
ltnw.constant('c',min_value=[4.,5.,6.,0.],max_value=[4.,5.,6.,100.])
ltnw.constant("ten",[10.])
ltnw.constant("twenty",[20.])
print(ltnw.CONSTANTS)
def _close_eta(x,y):
return 1-tf.abs(x-y)/100.
ltnw.function('eta',4,fun_definition=lambda x:x[:,3])
ltnw.predicate("close_eta",2,_close_eta)
ltnw.axiom("close_eta(eta(a),ten)")
ltnw.axiom("close_eta(eta(b),twenty)")
ltnw.axiom("close_eta(eta(b),eta(c))")
ltnw.initialize_knowledgebase(optimizer=tf.train.RMSPropOptimizer(learning_rate=.01),
initial_sat_level_threshold=.4)
ltnw.train(max_epochs=20000)
print("eta(a)",ltnw.ask('eta(a)'))
print("eta(b)",ltnw.ask('eta(b)'))
print("eta(c)",ltnw.ask('eta(c)'))
import logging; logging.basicConfig(level=logging.INFO)
import numpy as np
import tensorflow as tf
import code.logictensornetworks_wrapper as ltnw
ltnw.constant('roma', [12.0, 41.])
ltnw.constant('frascati', [12.5, 42.])
ltnw.constant('parigi', [48.0, 2.])
#ltnw.initialize_knowledgebase()
def _dist(x, y):
return tf.exp(-tf.sqrt(
tf.reduce_sum(
tf.square(tf.subtract(x, y)), axis=1, keepdims=True)))
ltnw.predicate("close", 2, _dist)
print(ltnw.ask('close(roma,parigi)'))
print(ltnw.ask('close(roma,frascati)'))
print(ltnw.ask('close(roma,roma)'))
......@@ -147,5 +147,5 @@ def try_guess_movies_rate():
"A1_Vote", "t1_1")
# try_fix_hospital_10()
try_guess_movies_rate()
try_fix_hospital_10()
# try_guess_movies_rate()
Test LDB
Test LDB simple contradition
per lanciarlo:
python -m doctest test_contradiction.txt
python -m doctest test_basic_contradiction.txt
>>> import code.ldb as ldb #doctest: +ELLIPSIS
......
......@@ -132,19 +132,23 @@ Altro beneficio della logica fuzzy è quello di riuscire a gestire con estrema f
Possiamo usare LTWN per il passo di previsione del valore per correggere o calcolare valori incogniti.
1. dalla tabella alle enumerazioni
costruzione delle costanti e dei range varibaili
2. caratterizzazione delle enumerazioni
1. definizione dello spazio
costruzione delle costanti e dei range variabili
2. scelta della metriche
per poter misurare le distanze tra due features
3. caratterizzazione dei vincoli nello spazio
costruzione degli assiomi
3. calcolo dell'incognita
4. calcolo dell'incognita
definizione dell'incognita
train & ask
5. scelta dell'ottimizzazione
train
6. interrogazione dello spazio calcolato dalla fase di train
ask
## Esempi applicativi
Per capire come si svlogano i passi di traduzione di una tabella in LTWN proposiamo una serie graduale di esempi pratici accompagnati dalle rispettive diffiltà che mettono in luce.
Per capire come si svolgano i passi di traduzione di una tabella in LTWN proposiamo una serie graduale di esempi pratici accompagnati dalle rispettive diffiltà che mettono in luce.
### Esempio minimale di dipendenza
......@@ -166,7 +170,18 @@ Vanno quindi introdotti vincoli di mutua esclusione per ciascuna categoria possi
Fornita una certa popolazione di allenamento possiamo chiedere ad LDB il valore di una nuova persona, secondo i valori
assunti da altri parametri, es. lavoratore, maggiorenne
Caso di studio categorico: [test_ldb_numeric](docker/docker-ldb/ldb/test/test_numeric.py)
Caso di studio categorico: [test_ldb_category](docker/docker-ldb/ldb/sample/basic_category.py)
### Esempio minimale di incosistenza
Partendo dal caso categorico precedente se aggiungiamo una descrizione che contraddice un vincolo,
ad esempio
l'ottimizzazione terminera' per timeout e non per aver ridotto al minimo le distanze dei vincoli, lasciano lo spazio dei valori in una configurazione non garantita soddisfare tutti i vincoli.
Caso di studio inconsistenza: [test_ldb_basic_contradiction](docker/docker-ldb/ldb/test/test_basic_contradiction.py)
### Esempio minimale numerico
......@@ -175,30 +190,27 @@ Traduciamo un semplice archivio che descriva una feature numerica.
Supponiamo una tabella (id:stringa, età:intero(0-100), maggiorenne:booleano)
dato un primo campione di valori possiamo usare LDB quale classificatore per farci suggerire il miglior valore :
Caso di studio numerico: [test_ldb_numeric](docker/docker-ldb/ldb/test/test_numeric.py)
Caso di studio numerico: [test_ldb_numeric](docker/docker-ldb/ldb/sample/basic_numeric.py)
### Esempio minimale di incosistenza
Scegliendo una metrica bidimensionale
possiamo estendere i vincoli ad esempio ad uno spazio euclideo.
Traduciamo un semplice archivio che descriva una feature categorica ed aggiungiamo
Supponiamo una tabella (id, )
Caso di studio inconsistenza: [test_ldb_basic_contradiction](docker/docker-ldb/ldb/test/test_basic_contradiction.py)
Caso di studio numerico euclideo: [test_ldb_numeric_ecludean](docker/docker-ldb/ldb/code/basic_numeric_euclidean.py)
### Esempio di distribuzione
Per capire come influisca la distribuzione dei valori partiamo da una tabella in formato CSV:
Caso di studio distribuzione 105 : [test_ldb_105](docker/docker-ldb/ldb/code/test_ldb_dedudb.py)
Caso di studio distribuzione 105 : [test_ldb_105](docker/docker-ldb/ldb/sample/basic_distrib.py)
### Esempio di vincolo
### Esempio di distribuzione vincolata
Verifichiamo che i vincoli logici impattino sul risultato oltre la sola distribuzione.
Introduciamo quindi un vincolo sulla distribuzione
Introduciamo quindi un ulteriore vincolo sulla distribuzione ed osserviamo i cambiamento sul risultato.
Caso di studio vincolo: [test_ldb_constraint](docker/docker-ldb/ldb/test/test_constraint.py)
Caso di studio vincolo: [test_ldb_constraint](docker/docker-ldb/ldb/sample/basic_distrib_constraint.py)
### Esempio realistico semplificato
......@@ -207,7 +219,7 @@ Assumendo di partire da valori non in formato enumerato ma valori liberi di test
sarà necessario applicare ai dati sorgente dei passi di traduzione aggiuntivi.
Il primo passo è la costruzione di categorie per ciascuna colonna.
Caso di studio HoloClean hospital_10 : [test_ldb_hospital_100](docker/docker-ldb/ldb/code/test_ldb_hospital_10.py)
Caso di studio HoloClean hospital_10 : [test_ldb_hospital_100](docker/docker-ldb/ldb/sample/fix_hospital_10.py)
* difficoltà evidenziata di mapping, per ottenere una buon apprendimento l'intero record dovrebbe essere mappato in vettori reali,
per alcune tipologie di campo non è immediata questa attività.
......@@ -217,10 +229,13 @@ per alcune tipologie di campo non è immediata questa attività.
Usando l'intero set di dati composto da
Caso di studio HoloClean hospital: [test_ldb_hospital_100](docker/docker-ldb/ldb/code/test_ldb_hospital.py)
Caso di studio HoloClean hospital: [test_ldb_hospital_100](docker/docker-ldb/ldb/sample/fix_hospital.py)
* difficoltà evidenziata di scalabilità, i tempi di addestramento della rete, di applicazione e l'efficacia restano ampiamente ottimizzabili.
Reuisito necessario propedeutico alla messa in prova su casi reali. Studiare ove possibile, tecniche di costruzione di una distribuzione sintetica ridotta in cardinalità a partire dai dati di origine, come la compressione (clusterizzazione) del set di dati senza perdita di informazione.
Scalabilita' e' un requisito necessario propedeutico alla messa in prova su casi reali.
Studiare ove possibile, tecniche di costruzione automatica di una distribuzione sintetica ridotta in cardinalità a partire dai dati di origine, come la compressione (clusterizzazione) del set di dati senza perdita di informazione.
......@@ -230,7 +245,7 @@ La pulizia del dato da eleborare ed analizzare è una priorità ed ua sfida
vista le diversi modi in cui può essere sporcato. Ad oggi non esistono soluzioni automatizzate.
Numerose le proposte in ricerca per le sfide. Qui abbiamo voluto proporre nello specifico una soluzione alla sostituzione di valori mancanti od errati
basata su apprendimento misto con reti neurali e regole di logica sfumata fornite da un esperto di dominio.
Gli esperimenti svolti indicano positiva applicabilità della proposta, rimangono aperte varie attività.
Gli esperimenti svolti indicano positiva applicabilità della proposta, rimangono aperte varie attività di ottimizzazione.
### Lavori futuri
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment