wolffd@0
|
1 function risultati = fhme(net, nodes_info, data, n)
|
wolffd@0
|
2 %HMEFWD Forward propagation through an HME model
|
wolffd@0
|
3 %
|
wolffd@0
|
4 % Each row of the (n x class_num) matrix 'risultati' containes the estimated class posterior prob.
|
wolffd@0
|
5 %
|
wolffd@0
|
6 % ----------------------------------------------------------------------------------------------------
|
wolffd@0
|
7 % -> pierpaolo_b@hotmail.com or -> pampo@interfree.it
|
wolffd@0
|
8 % ----------------------------------------------------------------------------------------------------
|
wolffd@0
|
9 %
|
wolffd@0
|
10 ns=net.node_sizes;
|
wolffd@0
|
11 if nargin==3
|
wolffd@0
|
12 ndata=n;
|
wolffd@0
|
13 else
|
wolffd@0
|
14 ndata=size(data, 1);
|
wolffd@0
|
15 end
|
wolffd@0
|
16 altezza=size(ns,2);
|
wolffd@0
|
17 coeff=cell(altezza-1,1);
|
wolffd@0
|
18 for m=1:ndata
|
wolffd@0
|
19 %- i=2 --------------------------------------------------------------------------------------
|
wolffd@0
|
20 s=struct(net.CPD{2});
|
wolffd@0
|
21 if nodes_info(1,2)==0,
|
wolffd@0
|
22 mu=[]; W=[]; predict=[];
|
wolffd@0
|
23 mu=s.mean(:,:);
|
wolffd@0
|
24 W=s.weights(:,:,:);
|
wolffd@0
|
25 predict=mu(:,:)+W(:,:,:)*data(m,:)';
|
wolffd@0
|
26 coeff{1,1}=predict';
|
wolffd@0
|
27 elseif nodes_info(1,2)==1,
|
wolffd@0
|
28 coeff{1,1}=fglm(s.glim{1}, data(m,:));
|
wolffd@0
|
29 else,
|
wolffd@0
|
30 coeff{1,1}=fmlp(s.mlp{1}, data(m,:));
|
wolffd@0
|
31 end
|
wolffd@0
|
32 %----------------------------------------------------------------------------------------------
|
wolffd@0
|
33 if altezza>3,
|
wolffd@0
|
34 for i=3:altezza-1,
|
wolffd@0
|
35 s=[]; f=[]; dpsz=[];
|
wolffd@0
|
36 f=family(net.dag,i); f=f(2:end-1); dpsz=prod(ns(f));
|
wolffd@0
|
37 s=struct(net.CPD{i});
|
wolffd@0
|
38 for j=1:dpsz,
|
wolffd@0
|
39 if nodes_info(1,i)==1,
|
wolffd@0
|
40 coeff{i-1,1}(j,:)=coeff{i-2,1}(1,j)*fglm(s.glim{j}, data(m,:));
|
wolffd@0
|
41 else
|
wolffd@0
|
42 coeff{i-1,1}(j,:)=coeff{i-2,1}(1,j)*fmlp(s.mlp{j}, data(m,:));
|
wolffd@0
|
43 end
|
wolffd@0
|
44 end
|
wolffd@0
|
45 app=cat(2, coeff{i-1,1}(:)); coeff{i-1,1}=app'; clear app;
|
wolffd@0
|
46 end
|
wolffd@0
|
47 end
|
wolffd@0
|
48 %- i=altezza ----------------------------------------------------------------------------------
|
wolffd@0
|
49 if altezza>2,
|
wolffd@0
|
50 i=altezza;
|
wolffd@0
|
51 s=[]; f=[]; dpsz=[];
|
wolffd@0
|
52 f=family(net.dag,i); f=f(2:end-1); dpsz=prod(ns(f));
|
wolffd@0
|
53 s=struct(net.CPD{i});
|
wolffd@0
|
54 if nodes_info(1,i)==0,
|
wolffd@0
|
55 mu=[]; W=[];
|
wolffd@0
|
56 mu=s.mean(:,:);
|
wolffd@0
|
57 W=s.weights(:,:,:);
|
wolffd@0
|
58 end
|
wolffd@0
|
59 for j=1:dpsz,
|
wolffd@0
|
60 if nodes_info(1,i)==0,
|
wolffd@0
|
61 predict=[];
|
wolffd@0
|
62 predict=mu(:,j)+W(:,:,j)*data(m,:)';
|
wolffd@0
|
63 coeff{i-1,1}(j,:)=coeff{i-2,1}(1,j)*predict';
|
wolffd@0
|
64 elseif nodes_info(1,i)==1,
|
wolffd@0
|
65 coeff{i-1,1}(j,:)=coeff{i-2,1}(1,j)*fglm(s.glim{j}, data(m,:));
|
wolffd@0
|
66 else
|
wolffd@0
|
67 coeff{i-1,1}(j,:)=coeff{i-2,1}(1,j)*fmlp(s.mlp{j}, data(m,:));
|
wolffd@0
|
68 end
|
wolffd@0
|
69 end
|
wolffd@0
|
70 end
|
wolffd@0
|
71 %----------------------------------------------------------------------------------------------
|
wolffd@0
|
72 risultati(m,:)=sum(coeff{altezza-1,1},1);
|
wolffd@0
|
73 clear coeff; coeff=cell(altezza-1,1);
|
wolffd@0
|
74 end
|
wolffd@0
|
75 return
|
wolffd@0
|
76
|
wolffd@0
|
77 %-------------------------------------------------------------------
|
wolffd@0
|
78
|
wolffd@0
|
79 function [y, a] = fglm(net, x)
|
wolffd@0
|
80 %GLMFWD Forward propagation through 1-layer net->GLM statistical model
|
wolffd@0
|
81
|
wolffd@0
|
82 ndata = size(x, 1);
|
wolffd@0
|
83
|
wolffd@0
|
84 a = x*net.w1 + ones(ndata, 1)*net.b1;
|
wolffd@0
|
85
|
wolffd@0
|
86 nout = size(a,2);
|
wolffd@0
|
87 % Ensure that sum(exp(a), 2) does not overflow
|
wolffd@0
|
88 maxcut = log(realmax) - log(nout);
|
wolffd@0
|
89 % Ensure that exp(a) > 0
|
wolffd@0
|
90 mincut = log(realmin);
|
wolffd@0
|
91 a = min(a, maxcut);
|
wolffd@0
|
92 a = max(a, mincut);
|
wolffd@0
|
93 temp = exp(a);
|
wolffd@0
|
94 y = temp./(sum(temp, 2)*ones(1,nout));
|
wolffd@0
|
95
|
wolffd@0
|
96 %-------------------------------------------------------------------
|
wolffd@0
|
97
|
wolffd@0
|
98 function [y, z, a] = fmlp(net, x)
|
wolffd@0
|
99 %MLPFWD Forward propagation through 2-layer network.
|
wolffd@0
|
100
|
wolffd@0
|
101 ndata = size(x, 1);
|
wolffd@0
|
102
|
wolffd@0
|
103 z = tanh(x*net.w1 + ones(ndata, 1)*net.b1);
|
wolffd@0
|
104 a = z*net.w2 + ones(ndata, 1)*net.b2;
|
wolffd@0
|
105 temp = exp(a);
|
wolffd@0
|
106 nout = size(a,2);
|
wolffd@0
|
107 y = temp./(sum(temp,2)*ones(1,nout));
|
wolffd@0
|
108
|
wolffd@0
|
109 %-------------------------------------------------------------------
|