LWTest
- improved tests for LW - fixed LW bugs - refactored NetworkNode for better usability - removed net not used in tests
This commit is contained in:
@@ -13,7 +13,7 @@ import smile.Network;
|
||||
public class LikelyhoodWeighting {
|
||||
|
||||
public final Network net;
|
||||
private Map<Integer, double[]> values = new HashMap<>();
|
||||
private final Map<Integer, NetworkNode> nodes = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Inizializza un nuovo oggetto che calcolerà i valori per la rete inserita
|
||||
@@ -31,8 +31,8 @@ public class LikelyhoodWeighting {
|
||||
* @return l'array di valori da restituire
|
||||
*/
|
||||
public double[] getNodeValue(int node) {
|
||||
if(values.size() == 0) throw new UnsupportedOperationException("You should run first updateNetwork method");
|
||||
return values.get(node);
|
||||
if(nodes.size() == 0) throw new UnsupportedOperationException("You should run first updateNetwork method");
|
||||
return nodes.get(node).values;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -43,35 +43,35 @@ public class LikelyhoodWeighting {
|
||||
public void updateNetwork(int totalRuns) {
|
||||
totalRuns = Math.max(1, totalRuns);
|
||||
|
||||
var nodes = SmileLib.buildListFrom(net);
|
||||
var list = SmileLib.buildListFrom(net);
|
||||
var rand = new SecureRandom();
|
||||
var prob = new double[totalRuns];
|
||||
var sum = 0.0d;
|
||||
|
||||
for(var node : nodes)
|
||||
node.samples = new int[totalRuns];
|
||||
|
||||
for(var run = 0; run < totalRuns; run++) {
|
||||
var probRun = 1.0d;
|
||||
|
||||
for(var node: nodes) {
|
||||
if(!node.isEvidence()) node.setSample(rand.nextDouble(), run);
|
||||
else probRun *= node.getProbSampleEvidence(run);
|
||||
for(var node: list) {
|
||||
if(node.isEvidence()) probRun *= node.getProbSampleEvidence();
|
||||
else node.setSample(rand.nextDouble());
|
||||
}
|
||||
|
||||
for(var node: list) {
|
||||
if(!node.isEvidence()) {
|
||||
node.values[node.sample] += probRun;
|
||||
node.sample = -1;
|
||||
}
|
||||
}
|
||||
|
||||
prob[run] = probRun;
|
||||
sum += probRun;
|
||||
}
|
||||
|
||||
for(var node : nodes) if(!node.isEvidence()) {
|
||||
var values = new double[node.outcomes.length];
|
||||
this.nodes.clear();
|
||||
for(var node : list) {
|
||||
this.nodes.put(node.handle, node);
|
||||
|
||||
for(var run = 0; run < totalRuns; run++)
|
||||
values[node.samples[run]] += prob[run];
|
||||
for(var i = 0; i < values.length; i++)
|
||||
values[i] /= sum;
|
||||
|
||||
this.values.put(node.handle, values);
|
||||
if(!node.isEvidence())
|
||||
for(var i = 0; i < node.values.length; i++)
|
||||
node.values[i] /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package net.berack.upo.ai.problem3;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
|
||||
import smile.Network;
|
||||
|
||||
/**
|
||||
@@ -13,109 +15,121 @@ import smile.Network;
|
||||
*/
|
||||
public class NetworkNode {
|
||||
|
||||
final int handle;
|
||||
final String[] outcomes;
|
||||
final double[] definition;
|
||||
final int evidence;
|
||||
final Network net;
|
||||
final int handle;
|
||||
final String[] outcomes;
|
||||
final double[] definition;
|
||||
final int evidence;
|
||||
final Network net;
|
||||
final int type;
|
||||
final NetworkNode[] parents;
|
||||
|
||||
NetworkNode[] parents;
|
||||
public int[] samples;
|
||||
public int sample = -1;
|
||||
public final double[] values;
|
||||
|
||||
/**
|
||||
* Questo costruttore crea un nodo e gli assegna i valori essenziali.
|
||||
* @apiNote Non usare questo costruttore se non si sa che si sa quello che si sta facendo
|
||||
* @param net la rete
|
||||
* @param handle l'handle del nodo
|
||||
*/
|
||||
NetworkNode(Network net, int handle) {
|
||||
this.handle = handle;
|
||||
this.net = net;
|
||||
/**
|
||||
* Questo costruttore crea un nodo e gli assegna i valori essenziali.
|
||||
* @apiNote Non usare questo costruttore se non si sa che si sa quello che si sta facendo
|
||||
* @param net la rete
|
||||
* @param handle l'handle del nodo
|
||||
* @param nodes i nodi creati prima di questo
|
||||
*/
|
||||
NetworkNode(Network net, int handle, Map<Integer, NetworkNode> nodes) {
|
||||
this.handle = handle;
|
||||
this.type = net.getNodeType(handle);
|
||||
this.net = net;
|
||||
|
||||
this.definition = net.getNodeDefinition(handle);
|
||||
this.outcomes = net.getOutcomeIds(handle);
|
||||
this.evidence = net.isEvidence(handle)? net.getEvidence(handle) : -1;
|
||||
}
|
||||
this.outcomes = net.getOutcomeIds(handle);
|
||||
this.values = new double[this.outcomes.length];
|
||||
this.evidence = net.isEvidence(handle)? net.getEvidence(handle) : -1;
|
||||
if(this.isEvidence()) this.values[this.evidence] = 1.0d;
|
||||
|
||||
/**
|
||||
* Indica se il nodo è evidenza o meno
|
||||
* @return vero se lo è
|
||||
*/
|
||||
public boolean isEvidence() {
|
||||
return this.evidence > 0 ;
|
||||
}
|
||||
var parentsHandle = net.getParents(handle);
|
||||
this.parents = new NetworkNode[parentsHandle.length];
|
||||
for(var i = 0; i < parentsHandle.length; i++)
|
||||
this.parents[i] = nodes.get(parentsHandle[i]);
|
||||
|
||||
/**
|
||||
* Per utilizzare questo metodo il nodo deve essere una evidenza.
|
||||
* Dato un roud di sample permette di ricevere il valore della
|
||||
* probabilità che, dati i sample dei genitori, il nodo abbia
|
||||
* il valore dell'evidenza impostata.
|
||||
*
|
||||
* @param round il numero del round che si stà controllando
|
||||
* @return il valore della probabilità della evidenza
|
||||
*/
|
||||
public double getProbSampleEvidence(int round) {
|
||||
if(!this.isEvidence()) throw new IllegalArgumentException("Evidence");
|
||||
this.definition = switch(this.type) {
|
||||
case Network.NodeType.CPT -> net.getNodeDefinition(handle);
|
||||
case Network.NodeType.NOISY_MAX -> net.getNoisyExpandedDefinition(handle);
|
||||
default -> throw new IllegalArgumentException("Network with node type not supporrted -> " + this.type);
|
||||
};
|
||||
}
|
||||
|
||||
var init = getStartingIndex(round);
|
||||
return this.definition[init + this.evidence];
|
||||
}
|
||||
/**
|
||||
* Indica se il nodo è evidenza o meno
|
||||
* @return vero se lo è
|
||||
*/
|
||||
public boolean isEvidence() {
|
||||
return this.evidence >= 0 ;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mette un sample al nodo nel round selezionato.
|
||||
* Il valore di rand deve essere un numero casuale tra 0 e 1 ed
|
||||
* esso permetterà di impostare un valore in base ai valori dei genitori.
|
||||
*
|
||||
* @param rand un valore casuale tra 0 e 1
|
||||
* @param round il numero del round
|
||||
*/
|
||||
public void setSample(double rand, int round) {
|
||||
var init = getStartingIndex(round);
|
||||
var end = init + this.outcomes.length;
|
||||
var prob = 0.0d;
|
||||
/**
|
||||
* Per utilizzare questo metodo il nodo deve essere una evidenza.
|
||||
* Permette di ricevere il valore della probabilità che, dati i sample dei genitori,
|
||||
* il nodo abbia il valore dell'evidenza impostata.
|
||||
*
|
||||
* @return il valore della probabilità della evidenza
|
||||
*/
|
||||
public double getProbSampleEvidence() {
|
||||
if(!this.isEvidence()) throw new IllegalArgumentException("Evidence");
|
||||
|
||||
for(var i = init; i < end; i++) {
|
||||
prob += this.definition[i];
|
||||
var init = getStartingIndex();
|
||||
return this.definition[init + this.evidence];
|
||||
}
|
||||
|
||||
if(prob >= rand) {
|
||||
this.samples[round] = i - init;
|
||||
break;
|
||||
}
|
||||
/**
|
||||
* Mette un sample al nodo nel round selezionato.
|
||||
* Il valore di rand deve essere un numero casuale tra 0 e 1 ed
|
||||
* esso permetterà di impostare un valore in base ai valori dei sample dei genitori.
|
||||
*
|
||||
* @param rand un valore casuale tra 0 e 1
|
||||
*/
|
||||
public void setSample(double rand) {
|
||||
var init = getStartingIndex();
|
||||
var end = init + this.values.length;
|
||||
var prob = 0.0d;
|
||||
|
||||
for(var i = init; i < end; i++) {
|
||||
prob += this.definition[i];
|
||||
|
||||
if(prob >= rand) {
|
||||
this.sample = i - init;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dato un round permette di ricavare l'indice di partenza della CPT.
|
||||
* Questo metodo serve perchè i genitori del nodo nel sample hanno
|
||||
* dei valori e io devo generarli in accordo con la CPT di questo nodo.
|
||||
*
|
||||
* @param round il roundo corrente
|
||||
* @return l'indice iniziale per gli output del nodo in base ai valori dei genitori
|
||||
*/
|
||||
private int getStartingIndex(int round) {
|
||||
var init = 0;
|
||||
var tot = this.definition.length;
|
||||
/**
|
||||
* Permette di ricavare l'indice di partenza della CPT.
|
||||
* Questo metodo serve perchè i genitori del nodo nel sample hanno
|
||||
* dei valori e io devo generarli in accordo con la CPT di questo nodo.
|
||||
*
|
||||
* @return l'indice iniziale per gli output del nodo in base ai valori dei genitori
|
||||
*/
|
||||
private int getStartingIndex() {
|
||||
var init = 0;
|
||||
var tot = this.definition.length;
|
||||
|
||||
for(var p : this.parents) {
|
||||
var pIndex = p.isEvidence()? p.evidence : p.samples[round];
|
||||
if(pIndex < 0) throw new IllegalArgumentException("Parent"); // in theory impossible since Topological sorted
|
||||
for(var p : this.parents) {
|
||||
var pIndex = p.isEvidence()? p.evidence : p.sample;
|
||||
if(pIndex < 0) throw new IllegalArgumentException("Parent"); // in theory impossible since Topological sorted
|
||||
|
||||
tot /= p.outcomes.length;
|
||||
init += tot * pIndex;
|
||||
}
|
||||
|
||||
return init;
|
||||
tot /= p.outcomes.length;
|
||||
init += tot * pIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if(!obj.getClass().isInstance(this)) return false;
|
||||
return init;
|
||||
}
|
||||
|
||||
var other = (NetworkNode) obj;
|
||||
if(this.handle != other.handle) return false;
|
||||
if(this.evidence != other.evidence) return false;
|
||||
if(!Arrays.equals(this.definition, other.definition)) return false;
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if(!obj.getClass().isInstance(this)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
var other = (NetworkNode) obj;
|
||||
if(this.handle != other.handle) return false;
|
||||
if(this.evidence != other.evidence) return false;
|
||||
if(!Arrays.equals(this.definition, other.definition)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -82,19 +82,11 @@ public class SmileLib {
|
||||
var list = new ArrayList<NetworkNode>();
|
||||
|
||||
for(var handle : net.getAllNodes()) {
|
||||
var node = new NetworkNode(net, handle);
|
||||
var node = new NetworkNode(net, handle, nodes);
|
||||
list.add(node);
|
||||
nodes.put(handle, node);
|
||||
}
|
||||
|
||||
for(var node : nodes.values()) {
|
||||
var parentsHandle = net.getParents(node.handle);
|
||||
node.parents = new NetworkNode[parentsHandle.length];
|
||||
|
||||
for(var i = 0; i < parentsHandle.length; i++)
|
||||
node.parents[i] = nodes.get(parentsHandle[i]);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,21 +2,19 @@ package net.berack.upo.ai.problem3;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import smile.Network;
|
||||
|
||||
public class LWTest {
|
||||
|
||||
// 3% difference max (it is a lot but is fair)
|
||||
public static final float DELTA = 0.05f;
|
||||
|
||||
@Test
|
||||
public void testSmile() {
|
||||
var net = SmileLib.getNetworkFrom("VentureBN.xdsl");
|
||||
|
||||
var nodes = net.getAllNodes();
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
System.out.println(nodes[i] + " -> " + net.getNodeId(nodes[i]));
|
||||
}
|
||||
|
||||
net.setEvidence("Forecast", "Moderate");
|
||||
net.updateBeliefs();
|
||||
|
||||
@@ -29,18 +27,32 @@ public class LWTest {
|
||||
|
||||
@Test
|
||||
public void testSimpleNetwork() {
|
||||
var net = SmileLib.getNetworkFrom("VentureBN.xdsl");
|
||||
net.updateBeliefs();
|
||||
checkNodesValues(SmileLib.getNetworkFrom("Malaria.xdsl"));
|
||||
checkNodesValues(SmileLib.getNetworkFrom("VentureBN.xdsl"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEvidence() {
|
||||
var net = SmileLib.getNetworkFrom("WetGrass.xdsl");
|
||||
checkNodesValues(net);
|
||||
|
||||
net.setEvidence("Sprinkler", "On");
|
||||
checkNodesValues(net);
|
||||
|
||||
net.setEvidence("Wet_grass", "Bagnata");
|
||||
checkNodesValues(net);
|
||||
}
|
||||
|
||||
private void checkNodesValues(Network net) {
|
||||
var lw = new LikelyhoodWeighting(net);
|
||||
|
||||
net.updateBeliefs();
|
||||
lw.updateNetwork(1000);
|
||||
|
||||
for(var node : net.getAllNodes()) {
|
||||
var arr1 = net.getNodeValue(node);
|
||||
var arr2 = lw.getNodeValue(node);
|
||||
|
||||
System.out.println(Arrays.toString(arr1) + " " + Arrays.toString(arr2));
|
||||
assertArrayEquals(arr1, arr2, 0.05); // 5% difference max (it is a lot but is fair)
|
||||
assertArrayEquals(arr1, arr2, DELTA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This network was created in GeNIe Academic, which can be used for academic teaching and research purposes only -->
|
||||
<smile version="1.0" id="Network1" numsamples="1000" discsamples="10000">
|
||||
<nodes>
|
||||
<decision id="AirportSite">
|
||||
<state id="Isolated" />
|
||||
<state id="Suburbs" />
|
||||
<state id="Town" />
|
||||
</decision>
|
||||
<cpt id="AirTraffic">
|
||||
<state id="low" />
|
||||
<state id="high" />
|
||||
<probabilities>0.3 0.7</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Litigation">
|
||||
<state id="low" />
|
||||
<state id="high" />
|
||||
<probabilities>0.2 0.8</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Construction">
|
||||
<state id="low" />
|
||||
<state id="high" />
|
||||
<probabilities>0.4 0.6</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Deaths">
|
||||
<state id="safe" />
|
||||
<state id="unsafe" />
|
||||
<parents>AirTraffic AirportSite</parents>
|
||||
<probabilities>0.9 0.09999999999999998 0.7 0.3 0.7 0.3 0.8 0.2 0.6 0.4 0.4 0.6</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Noise">
|
||||
<state id="tolerable" />
|
||||
<state id="untolerable" />
|
||||
<parents>AirTraffic AirportSite</parents>
|
||||
<probabilities>0.9 0.09999999999999998 0.8 0.2 0.7 0.3 0.7 0.3 0.4 0.6 0.2 0.8</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Cost">
|
||||
<state id="low" />
|
||||
<state id="high" />
|
||||
<parents>Litigation Construction AirportSite</parents>
|
||||
<probabilities>0.9 0.09999999999999998 0.8 0.2 0.75 0.25 0.3 0.7 0.25 0.75 0.2 0.8 0.4 0.6 0.5 0.5 0.45 0.55 0.3 0.7 0.2 0.8 0.09999999999999998 0.9</probabilities>
|
||||
</cpt>
|
||||
<utility id="UD">
|
||||
<parents>Deaths</parents>
|
||||
<utilities>1 0</utilities>
|
||||
</utility>
|
||||
<utility id="UN">
|
||||
<parents>Noise</parents>
|
||||
<utilities>1 0</utilities>
|
||||
</utility>
|
||||
<utility id="UC">
|
||||
<parents>Cost</parents>
|
||||
<utilities>1 0</utilities>
|
||||
</utility>
|
||||
<mau id="U">
|
||||
<parents>UC UD UN</parents>
|
||||
<weights>2 10 1</weights>
|
||||
</mau>
|
||||
</nodes>
|
||||
<extensions>
|
||||
<genie version="1.0" app="GeNIe 4.1.3402.0 ACADEMIC" name="Airport">
|
||||
<node id="AirportSite">
|
||||
<name>AirportSite</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>440 289 503 315</position>
|
||||
</node>
|
||||
<node id="AirTraffic">
|
||||
<name>AirTraffic</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>375 62 436 100</position>
|
||||
</node>
|
||||
<node id="Litigation">
|
||||
<name>Litigation</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>375 138 432 173</position>
|
||||
</node>
|
||||
<node id="Construction">
|
||||
<name>Construction</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>365 211 440 257</position>
|
||||
</node>
|
||||
<node id="Deaths">
|
||||
<name>Deaths</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>558 62 609 93</position>
|
||||
</node>
|
||||
<node id="Noise">
|
||||
<name>Noise</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>564 138 609 166</position>
|
||||
</node>
|
||||
<node id="Cost">
|
||||
<name>Cost</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>567 221 609 247</position>
|
||||
</node>
|
||||
<textbox>
|
||||
<caption>Per l'utilita' data:\nsi suppone di considerare le seguenti\npriorita' o preferenze:\nSafety, Tollerabilita' rumore, Costo\nCio' implica che tutte le utilita' con Deaths=Safe devono essere maggiori di quelle con Deaths=Unsafe, che, specificato Deaths, quelle con Noise=tolerable devono essere maggiori di quelle con Noise=untolerable e in subordine quelle con Cost=low maggiori di quelle con Cost=high</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>28 32 221 200</position>
|
||||
</textbox>
|
||||
<node id="UD">
|
||||
<name>UD</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>716 72 750 104</position>
|
||||
</node>
|
||||
<node id="UN">
|
||||
<name>UN</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>723 153 757 185</position>
|
||||
</node>
|
||||
<node id="UC">
|
||||
<name>UC</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>741 231 775 263</position>
|
||||
</node>
|
||||
<node id="U">
|
||||
<name>U</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>886 168 913 200</position>
|
||||
</node>
|
||||
</genie>
|
||||
</extensions>
|
||||
</smile>
|
||||
@@ -1,92 +0,0 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<!-- This network was created in GeNIe Academic, which can be used for educational and research purposes only -->
|
||||
<smile version="1.0" id="AppleTree" numsamples="1000" discsamples="10000">
|
||||
<nodes>
|
||||
<cpt id="Malato" dynamic="plate">
|
||||
<state id="Si" />
|
||||
<state id="No" />
|
||||
<probabilities>0.1 0.9</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Secco" dynamic="plate">
|
||||
<state id="Si" />
|
||||
<state id="No" />
|
||||
<probabilities>0.1 0.9</probabilities>
|
||||
</cpt>
|
||||
<cpt id="PerditaFoglie" dynamic="plate">
|
||||
<state id="Si" />
|
||||
<state id="No" />
|
||||
<parents>Malato Secco</parents>
|
||||
<probabilities>0.95 0.05000000000000004 0.9 0.09999999999999998 0.85 0.15 0.02 0.98</probabilities>
|
||||
</cpt>
|
||||
<decision id="Trattamento" dynamic="plate">
|
||||
<state id="Si" />
|
||||
<state id="No" />
|
||||
<parents>PerditaFoglie</parents>
|
||||
</decision>
|
||||
<utility id="CostoT" dynamic="plate">
|
||||
<parents>Trattamento</parents>
|
||||
<utilities>-8000 0</utilities>
|
||||
</utility>
|
||||
<utility id="U" dynamic="plate">
|
||||
<parents>Malato</parents>
|
||||
<utilities>3000 20000</utilities>
|
||||
</utility>
|
||||
</nodes>
|
||||
<dynamic numslices="5">
|
||||
<cpt id="Malato" order="1">
|
||||
<parents>Malato Trattamento</parents>
|
||||
<probabilities>0.2 0.8 0.99 0.01 0.01000000000000001 0.99 0.02000000000000002 0.98</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Secco" order="1">
|
||||
<parents>Secco</parents>
|
||||
<probabilities>0.6 0.4 0.05000000000000004 0.95</probabilities>
|
||||
</cpt>
|
||||
</dynamic>
|
||||
<extensions>
|
||||
<genie version="1.0" app="GeNIe 2.1.621.1 ACADEMIC" name="AppleTree" faultnameformat="nodestate">
|
||||
<plate leftwidth="120" rightwidth="120">20 30 819 509</plate>
|
||||
<node id="Malato">
|
||||
<name>Malato</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>228 205 302 251</position>
|
||||
</node>
|
||||
<node id="Secco">
|
||||
<name>Secco</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>226 87 300 133</position>
|
||||
</node>
|
||||
<node id="PerditaFoglie">
|
||||
<name>PerditaFoglie</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>382 143 508 221</position>
|
||||
</node>
|
||||
<node id="Trattamento">
|
||||
<name>Trattamento</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>311 304 424 338</position>
|
||||
</node>
|
||||
<node id="CostoT">
|
||||
<name>CostoT</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>327 382 418 472</position>
|
||||
</node>
|
||||
<node id="U">
|
||||
<name>U</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="14" />
|
||||
<position>584 295 625 343</position>
|
||||
</node>
|
||||
</genie>
|
||||
</extensions>
|
||||
</smile>
|
||||
@@ -1,89 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This network was created in GeNIe Academic, which can be used for academic teaching and research purposes only -->
|
||||
<smile version="1.0" id="Network1" numsamples="1000" discsamples="10000">
|
||||
<nodes>
|
||||
<cpt id="Malattia">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<probabilities>0.5 0.5</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Sintomo">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>Malattia</parents>
|
||||
<probabilities>0.99 0.01000000000000001 0.15 0.85</probabilities>
|
||||
</cpt>
|
||||
<decision id="Test">
|
||||
<state id="si" />
|
||||
<state id="no" />
|
||||
<parents>Sintomo</parents>
|
||||
</decision>
|
||||
<cpt id="RisultatoTest">
|
||||
<state id="pos" />
|
||||
<state id="neg" />
|
||||
<state id="nessuno" />
|
||||
<parents>Test Malattia</parents>
|
||||
<probabilities>0.95 0.05000000000000004 0 0.01000000000000001 0.99 0 0 0 1 0 0 1</probabilities>
|
||||
</cpt>
|
||||
<decision id="Intervento">
|
||||
<state id="si" />
|
||||
<state id="no" />
|
||||
<parents>RisultatoTest</parents>
|
||||
</decision>
|
||||
<utility id="U">
|
||||
<parents>Malattia Intervento</parents>
|
||||
<utilities>0.9871992685296302 0 0.9992856734670552 1</utilities>
|
||||
</utility>
|
||||
</nodes>
|
||||
<extensions>
|
||||
<genie version="1.0" app="GeNIe 4.1.3402.0 ACADEMIC" name="Micromorti">
|
||||
<node id="Malattia">
|
||||
<name>Malattia</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>283 79 335 111</position>
|
||||
</node>
|
||||
<node id="Sintomo">
|
||||
<name>Sintomo</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>285 185 339 218</position>
|
||||
</node>
|
||||
<node id="Test">
|
||||
<name>Test</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>416 189 449 215</position>
|
||||
</node>
|
||||
<node id="RisultatoTest">
|
||||
<name>RisultatoTest</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>443 60 518 106</position>
|
||||
</node>
|
||||
<node id="Intervento">
|
||||
<name>Intervento</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>571 188 631 214</position>
|
||||
</node>
|
||||
<node id="U">
|
||||
<name>U</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>448 306 475 338</position>
|
||||
</node>
|
||||
<textbox>
|
||||
<caption>(MM) Micromorte=1 probabilita' su un millione di morire entro l'anno\nStima: 1 MM=$20\n\nUna probabilita' p e' quindi = p*10^6 MM\n(facendo una proporzione p:x=10^-6:1)\n\nAvere la malattia e non intervenire comporta un rischio pari ad una probabilita' del 35% di morire entro l'anno.\nCio' e' pari a 350.000 MM ossia $7Millioni\n\nIntervenire sulla malattia abbassa tale probabilita' per il nostro paziente a 0.0002=200MM=$4000\n\nSe il ns paziente non e' malato la sua aspettativa di vita e' tale che la prob. che muoia entro l'anno e' 1/50000=20MM=$400\n\nL'intervento non e' rischioso (quindi si tralascia di stimare quante micromorti vale l'intervento in assenza di malattia)\n\nSupponiamo che l'intervento costi $5000\n\nLa funzione di utilita' si puo' calcolare usando questi costi\nU(no M, no I)=-400\nU(no M, I)=-400-5000\nU(M, no I)=-7M\nU(M, I)=-4000-5000\n\nRinormalizzata a 1 e' come appare nell'ID\n</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>3 21 230 497</position>
|
||||
</textbox>
|
||||
</genie>
|
||||
</extensions>
|
||||
</smile>
|
||||
@@ -1,160 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This network was created in GeNIe Academic, which can be used for academic teaching and research purposes only -->
|
||||
<smile version="1.0" id="Network4" numsamples="1000" discsamples="10000">
|
||||
<nodes>
|
||||
<cpt id="Age">
|
||||
<state id="child" />
|
||||
<state id="adult" />
|
||||
<state id="elderly" />
|
||||
<probabilities>0.3333333333333333 0.3333333333333333 0.3333333333333334</probabilities>
|
||||
</cpt>
|
||||
<cpt id="Heart_failiure">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>Age</parents>
|
||||
<probabilities>0.05 0.95 0.5 0.5 0.8 0.2</probabilities>
|
||||
<property id="DSL_OUTCOME_ORDER">-1</property>
|
||||
</cpt>
|
||||
<cpt id="dyspnea">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>Heart_failiure</parents>
|
||||
<probabilities>0.95 0.05000000000000004 0.1 0.9</probabilities>
|
||||
</cpt>
|
||||
<cpt id="tachycpnea">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>dyspnea</parents>
|
||||
<probabilities>0.98 0.02000000000000002 0.2 0.8</probabilities>
|
||||
</cpt>
|
||||
<cpt id="tachicardia">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>dyspnea</parents>
|
||||
<probabilities>0.95 0.05000000000000004 0.1 0.9</probabilities>
|
||||
</cpt>
|
||||
<cpt id="PulmonaryCrepitations">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>Heart_failiure</parents>
|
||||
<probabilities>0.7 0.3 0.15 0.85</probabilities>
|
||||
</cpt>
|
||||
<decision id="treatment">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>Age tachycpnea tachicardia PulmonaryCrepitations</parents>
|
||||
<property id="DSL_OUTCOME_ORDER">-1</property>
|
||||
</decision>
|
||||
<cpt id="intermdiate_result">
|
||||
<state id="bad" />
|
||||
<state id="good" />
|
||||
<parents>treatment Heart_failiure Age</parents>
|
||||
<probabilities>0.6 0.4 0.45 0.55 0.65 0.35 0.1 0.9 0.15 0.85 0.18 0.8200000000000001 0.6 0.4 0.8 0.2 0.95 0.05000000000000004 0.1 0.9 0.15 0.85 0.18 0.8200000000000001</probabilities>
|
||||
<property id="DSL_OUTCOME_ORDER">-1</property>
|
||||
</cpt>
|
||||
<cpt id="Late_complications">
|
||||
<state id="yes" />
|
||||
<state id="no" />
|
||||
<parents>intermdiate_result treatment</parents>
|
||||
<probabilities>0.5 0.5 0.95 0.05000000000000004 0.01 0.99 0.1 0.9</probabilities>
|
||||
</cpt>
|
||||
<utility id="U">
|
||||
<parents>treatment intermdiate_result Late_complications</parents>
|
||||
<utilities>0 0.6 0.4 0.8 0.3 0.7 0.5 1</utilities>
|
||||
</utility>
|
||||
</nodes>
|
||||
<extensions>
|
||||
<genie version="1.0" app="GeNIe 4.1.3402.0 ACADEMIC" name="Treatment">
|
||||
<node id="Age">
|
||||
<name>Age</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>599 419 640 444</position>
|
||||
</node>
|
||||
<node id="Heart_failiure">
|
||||
<name>Heart_failiure</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>386 329 462 376</position>
|
||||
</node>
|
||||
<node id="dyspnea">
|
||||
<name>dyspnea</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>387 197 480 221</position>
|
||||
</node>
|
||||
<node id="tachycpnea">
|
||||
<name>tachycpnea</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>385 102 451 143</position>
|
||||
</node>
|
||||
<node id="tachicardia">
|
||||
<name>tachiycardia</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>543 203 609 244</position>
|
||||
</node>
|
||||
<node id="PulmonaryCrepitations">
|
||||
<name>pulmonary crepitations</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>532 278 610 326</position>
|
||||
</node>
|
||||
<textbox>
|
||||
<caption>aumento velocita' respirazione</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>333 86 479 100</position>
|
||||
</textbox>
|
||||
<textbox>
|
||||
<caption>aumento velocita' cardiaca</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>513 187 641 201</position>
|
||||
</textbox>
|
||||
<textbox>
|
||||
<caption>difficolta' a respirare</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>285 198 384 212</position>
|
||||
</textbox>
|
||||
<node id="treatment">
|
||||
<name>treatment</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>713 177 770 203</position>
|
||||
</node>
|
||||
<node id="intermdiate_result">
|
||||
<name>intermdiate result</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>619 643 712 701</position>
|
||||
</node>
|
||||
<node id="Late_complications">
|
||||
<name>Late complications</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>863 432 962 493</position>
|
||||
</node>
|
||||
<node id="U">
|
||||
<name>U</name>
|
||||
<interior color="e5f6f7" />
|
||||
<outline color="000080" />
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>775 429 802 461</position>
|
||||
</node>
|
||||
<textbox>
|
||||
<caption>Utilita' graduata considerando LateComplications piu' importante di IntermideiaResult piu' importante di costo trattamento</caption>
|
||||
<font color="000000" name="Arial" size="8" />
|
||||
<position>85 74 279 130</position>
|
||||
</textbox>
|
||||
</genie>
|
||||
</extensions>
|
||||
</smile>
|
||||
Reference in New Issue
Block a user