2

c'est la bonne affaire. J'ai donc créé un BN suivant les instructions du manuel BNT, c'est le sprinkler mais j'ai ajouté un nœud Class pour l'hiver et l'été. Comme ceci:Bayes Réseau pour la classification en Matlab (BNT)

 
     Cloudy------ 
    / \  | 
Sprinkler Rain | 
     \ / | | 
     Wet  Class 

Où la classe dépend seulement de si elle est trouble ou s'il pleut. Avec la même spécification que http://bnt.googlecode.com/svn/trunk/docs/usage.html#basics

Et la classe est aussi binaire, la table est:

 
C R Class prob 
--------------- 
1 1 1 0 
2 1 1 0.4 
1 2 1 0.4 
2 2 1 0.9 
etc.

donc ma question en utilisant la var_elimination_eng parce que pour une raison jtree ne fonctionne pas, je reçois ce le marg.T après avoir entré la preuve de la pluie:

ans = 

0.800000000000000 
0.200000000000000 

Est-ce correct? Ai-je mis en œuvre ok? Ou ai-je oublié quelque chose? Merci.

hypothèse même 1 = false = hiver, 2 = true = été

EDIT:

Alors oui le CPT du nœud de classe est de 8 entrées

 
C R Class prob 
--------------- 
1 1 1 0 
2 1 1 0.4 
1 2 1 0.4 
2 2 1 0.9 
1 1 2 1 
2 1 2 0.6 
1 2 2 0.6 
2 2 2 0.6 
2 2 2 0.1 

Ce sont 1 - oposite . Le code est:

N = 5 
dag = zeros(N,N) 
C = 1; S = 2; R = 3; W = 4; Class = 5 
dag(C, [S R]) = 1 
dag(R, W) = 1 
dag(S, W) = 1 
dag(C, Class) = 1 
dag(R, Class) = 1 
discrete_nodes = 1:N 
nodes_size = 2*ones(1,N) 
bnet = mk_bnet(dag, nodes_size, names, {'Clody', 'S', 'R', 'W', 'Class'}, 'discrete', discrete_nodes) 
bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]) 
bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]) 
bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]) 
bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]) 
bnet.CPD{Class} = tabular_CPD(bnet, Class, [0 0.4 0.4 0.9 1 0.6 0.6 0.1]) 
evidence = cell(1, N) 
evidence{R} = 2 
engine = var_elim_inf_engine(bnet) 
[engine loglik] = enter_evidence(engine, evidence) 
marg = marginal_nodes(engine, R) 
marg = marginal_nodes(engine, Class) 
marg.T 

Ce code je, comme pour le jtree, il me donnait une erreur sur Matlab qui a disparu, mais, je pense que Elimin variable est plus facile à comprendre que je lis maintenant.

Merci.

Répondre

3

La table de probabilité conditionnelle (CPT) pour 'class' devrait avoir 8 (2 * 2 * 2) éléments dans ce cas. La sortie postérieure (marg.T) du moteur d'inférence semble correcte pour une variable binaire. Il se lit comme suit: "avec une probabilité de 0,8, le noeud 'class' est dans l'état 1, et avec une probabilité de 0,2, il est dans l'état 2". A partir de ce moment, il appartient à l'utilisateur de décider s'il doit nommer 'class' à l'état 1 ou 2.

En matière de classification, dans le cas le plus simple (et pas très conseillé), vous pouvez définir un seuil de probabilité postérieure de 0,5 et dire:

if P(class=1)> 0.5 
class = 1 
else 
class = 2 
end 

Pour évaluer les performances de votre classification binaire, vous pouvez regarder dans predictive accuracy or Area Under the ROC curve (AUC) ou faire more intelligent things qui prennent en compte les probabilités a priori des états « classe ».

P.S. Vous dites que le moteur d'arbre de jonction ne fonctionne pas dans ce cas, mais il devrait le faire. Vous pouvez manquer un point, il devrait y avoir un exemple junction_tree (je ne me souviens pas exactement du nom du fichier .m) dans le fichier .zip de la boîte à outils BNT. Si vous utilisez le moteur d'inférence de l'arbre de jonction, vous verrez que vous obtenez la même réponse qu'avec l'élimination des variables.

+0

J'ai modifié. Merci. –

+0

Oui, votre code semble correctement mis en œuvre. Maintenant, les choses commencent à devenir un peu plus compliquées lorsque vous devez apprendre les CPT à partir des données (au lieu de les nommer manuellement), en particulier dans les cas où il y a des données manquantes.Mais ce n'est pas votre problème pour le moment :) – Rhubarb

+0

Non, pas maintenant, mais qu'est-ce que vous voulez dire un peu plus compliqué? Comment? J'aurais cependant pensé que cela devrait être plus facile puisque vous avez les données, et vous pouvez simplement les lisser pour tenir compte des données manquantes. –

Questions connexes