2015-04-02 2 views
0

J'essaie de créer un réseau dynamique bayésien en utilisant Bayesian Network Toolbox (BNT) dans Matlab. J'ai suivi le tutoriel près, et finissent avec le code suivant:Paramètres d'apprentissage du réseau bayésien dynamique en utilisant BNT

T=2; 
names = {'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'X12'}; 
ss = length(names); 
onodes=[1 2 3 4 5 6 7 8 9 10 11 12]; 
intrac = { 
    'X1', 'X2'; 
    'X3', 'X4'; 
    'X6', 'X7'; 
    'X7', 'X8'; 
    'X10', 'X11'; 
    'X10', 'X12'; 
    'X11', 'X12'; 
    }; 
[intra, names] = mk_adj_mat(intrac, names, 1); 
interc = { 
    'X1', 'X1'; 
    'X2', 'X2'; 
    'X3', 'X3'; 
    'X4', 'X4'; 
    'X5', 'X5'; 
    'X6', 'X6'; 
    'X7', 'X7'; 
    'X8', 'X8'; 
    'X9', 'X9'; 
    'X10', 'X10'; 
    'X11', 'X11'; 
    'X12', 'X12'; 
    }; 
inter = mk_adj_mat(interc, names, 0); 
dnodes = 1:ss; 
ns = [3 3 3 2 4 5 2 2 4 5 4 5]; 
ns(stringmatch('X1',names))=3; 
ns(stringmatch('X2',names))=3; 
ns(stringmatch('X3',names))=3; 
ns(stringmatch('X4',names))=2; 
ns(stringmatch('X5',names))=4; 
ns(stringmatch('X6',names))=5; 
ns(stringmatch('X7',names))=2; 
ns(stringmatch('X8',names))=2; 
ns(stringmatch('X9',names))=4; 
ns(stringmatch('X10',names))=5; 
ns(stringmatch('X11',names))=4; 
ns(stringmatch('X12',names))=5; 

bnet = mk_dbn(intra, inter, ns, 'discrete', dnodes); 
for i=1:2*ss 
    bnet.CPD{i} = tabular_CPD(bnet, i); 
end 
allcases=importdata('Myfile.txt',','); 
ncases = size(allcases.data,1); 
cases = cell(1, ncases); 
for i=1:ncases 
    cases{i} = cell(ss,T); 
    dataentry=allcases.data(i,:); 
    ev=uint8([dataentry(1:12)' dataentry(13:24)']); 
    cases{i} = num2cell(ev); 
end 
engine2 = smoother_engine(jtree_2TBN_inf_engine(bnet)); 
%engine2 = jtree_2TBN_inf_engine(bnet); 
[bnt, LL, engine2] = learn_params_dbn_em(engine2, cases, 'max_iter', 20); 

Lorsque je tente de l'exécuter, l'erreur suivante apparaît:

Subscript indices must either be real positive integers or logicals. 

Error in discrete_CPD/convert_to_table (line 14) 
T = CPT(index{:}); 

Error in discrete_CPD/convert_to_pot (line 20) 
    T = convert_to_table(CPD, domain, evidence); 


Error in jtree_2TBN_inf_engine/fwd1 (line 11) 
    CPDpot{n} = convert_to_pot(bnet.CPD{e}, engine.pot_type, fam(:), ev); 

Error in smoother_engine/enter_evidence (line 12) 
[f{1}, ll(1)] = fwd1(engine.tbn_engine, ev(:,1), 1); 

Error in learn_params_dbn_em>EM_step (line 131) 
    [engine, ll] = enter_evidence(engine, evidence); 

Error in learn_params_dbn_em (line 82) 
    [engine, loglik, logpost] = EM_step(engine, evidence, temperature); 

quelqu'un peut me aider avec cette erreur? Je pense qu'il y a quelque chose à faire avec la façon dont je crée mes CPD tabulaires, parce que quand j'ai regardé les CPD dans bnet, ils sont tous 1 * 1 tabulaires. Mes CPD ont été créés de la même manière que le didacticiel. Merci d'avance!

+0

Mise à jour: Je viens de me figurer que cette erreur n'a rien à voir avec les CPD tabulaires. –

+0

Mise à jour # 2: J'ai juste échantillonné tout le réseau, il apprend les paramètres avec les données échantillonnées. Donc je pense que mon problème est dans mon ensemble de données. En regardant maintenant –

Répondre

0

Problème résolu, il y a un problème avec l'ensemble de données. Dans mon jeu de données, j'ai utilisé une cellule pour toutes les entrées de données, plutôt qu'une cellule pour chaque entrée de données. Maintenant, le code fonctionne correctement.