diff options
| author | ziejd2 | 2018-04-25 16:43:19 -0500 |
|---|---|---|
| committer | ziejd2 | 2018-04-25 16:43:19 -0500 |
| commit | 74b673ba4a706085201a5610b938ff98f08f641d (patch) | |
| tree | cb39006ea1a39499e00dbbb0e0097087a4567031 /sourcecodes/parameter_learning/code_backup/drawFigure.m | |
| parent | a781cb1ff2e7ae6de0f686bd02cd279261485b1e (diff) | |
| download | BNW-74b673ba4a706085201a5610b938ff98f08f641d.tar.gz | |
Bug fixes, code comments, and minor changes
Diffstat (limited to 'sourcecodes/parameter_learning/code_backup/drawFigure.m')
| -rw-r--r-- | sourcecodes/parameter_learning/code_backup/drawFigure.m | 390 |
1 files changed, 390 insertions, 0 deletions
diff --git a/sourcecodes/parameter_learning/code_backup/drawFigure.m b/sourcecodes/parameter_learning/code_backup/drawFigure.m new file mode 100644 index 00000000..f84bffa3 --- /dev/null +++ b/sourcecodes/parameter_learning/code_backup/drawFigure.m @@ -0,0 +1,390 @@ +function [] = drawFigure(nnodes,bnet,labels,filename,cases,stdevs,means,selectvar,selectdata) +%drawFigure writes the parameters and data that are needed to draw the +%structure of a Bayesian network for BNW. +% This is the first function that + + + +if nargin < 8, + drawFigureNoEv(nnodes,bnet,labels,filename,cases,stdevs,means); +else + drawFigureEv(nnodes,bnet,labels,filename,cases,stdevs,means,selectvar,selectdata); +end; + +end + + + +function [] = drawFigureEv(nnodes,bnet,labels,filename,cases,stdevs,means,selectvar,selectdata) +%Function to use if there is no entered evidence. +% +% +%Before each printed line, I will have a line that starts with %%% +% that describes what will be on that line + +%Create an empty evidence cell array. + +%val=cases; +%for i = 1:nnodes +% val(i,1)=val(i,2); + +%end + +A=cell2mat(cases'); +Amax=max(A); +Amin=min(A); + + +evidence = cell(1,nnodes); +engine = jtree_inf_engine(bnet); + +evidence{selectvar}=selectdata; + +[engine,loglik]=enter_evidence(engine,evidence); + +%Open the file, and write the nodes to a file. +fileID = fopen(filename,'w'); + +%%%%Evidence node +fprintf(fileID,'%i\n',selectvar); +%%% The number of nodes +fprintf(fileID,'%i\n',nnodes); +%Get canvas size +labels_temp = cellstr(labels); +[x,y] = make_layout(bnet.dag); + +x = x - min(x); +y = 1 - y; +y = y - min(y); + +[x_dim,y_dim] = canvasSize(nnodes,x,y); + +%%% The dimensions of the canvas for the javascript code +fprintf(fileID,'%i\t%i\t\n',x_dim,y_dim) + +x = x*x_dim; +y = y*y_dim; +for i = 1:nnodes, +%%% The name and X- and Y-positions of each node + fprintf(fileID,'%s\t%i\t%i\n',labels{i},round(x(i)),round(y(i))); +end + +%Get the number of parents and children for each node. +num_par = zeros(1,nnodes); +%For parents, sum down columns +for i = 1:nnodes, + for j = 1:nnodes, + if bnet.dag(j,i) == 1, + num_par(i) = num_par(i) + 1; + end + end +end +num_child = zeros(1,nnodes); +for i = 1:nnodes, + for j = 1:nnodes, + if bnet.dag(i,j) == 1, + num_child(i) = num_child(i) + 1; + end + end +end + + +for i = 1:nnodes, + %%% The name and type of each node (1=continuous, the number of states + %%% if it is discrete + fprintf(fileID,'%s\t%i\n',labels{i},bnet.node_sizes(i)); + %%% The size of the node, I am going to keep them + %%% 250(width) by 150(height) for now + %Could modify this to change the width based on the length of the node + %name + fprintf(fileID,'%i\t%i\n',250,150); + %%% The number of parents of the node, and the parents + if num_par(i) == 0; + %%% If no parents: + fprintf(fileID,'%i\n',num_par(i)); + else + parents = zeros(1,num_par(i)); + k = 1; + for j = 1:nnodes, + if bnet.dag(j,i) == 1, + parents(1,k) = j; + k = k + 1; + end + end + format = '%i\t'; + for j = 1:num_par(i)-1, + format = strcat(format,'%i\t'); + end + format = strcat(format,'%i\n'); + %%%If there are parents: + fprintf(fileID,format,num_par(i),parents(1,:)); + end + + + %%% The number of children of the node, and the children + if num_child(i) == 0; + %%% If no children: + fprintf(fileID,'%i\n',num_child(i)); + else + children = zeros(1,num_child(i)); + k = 1; + for j = 1:nnodes, + if bnet.dag(i,j) == 1, + children(1,k) = j; + k = k + 1; + end + end + format = '%i\t'; + for j = 1:num_child(i)-1, + format = strcat(format,'%i\t'); + end + format = strcat(format,'%i\n'); + %%%If there are parents: + fprintf(fileID,format,num_child(i),children(1,:)); + end + + predict = marginal_nodes(engine,i); + if isempty(evidence{i}) + if bnet.node_sizes(i) ~= 1, + for j = 1:bnet.node_sizes(i), + %%%For discrete nodes, the state and the percent of that state + fprintf(fileID,'%i\t%6.4f\n',j,predict.T(j)); + end; + else + + [x_vals,y_vals] = calcGaussian(predict.mu,predict.Sigma,Amax(i),Amin(i)); + %%%For continuous nodes, print x and the pdf of a normal curve. + for j = 1:101, + %%Undo standardization + xvals(j,1) = xvals(j,1)*stdevs{i}+means{i} + fprintf(fileID,'%6.4f\t%6.4f\n',x_vals(j,1),y_vals(j,1)); + end; + end; + else + fprintf(fileID,'%6.4f\t%6.4f\n',selectdata,1); + end + +end +%fprintf(fileID,'%s\t %\n',labels_temp{:}); + + +fclose(fileID); + +end + + + + + + +function [] = drawFigureNoEv(nnodes,bnet,labels,filename,cases,stdevs,means) +%Function to use if there is no entered evidence. +% +% +%Before each printed line, I will have a line that starts with %%% +% that describes what will be on that line +A=cell2mat(cases'); +Amax=max(A); +Amin=min(A); + +%Create an empty evidence cell array. +evidence = cell(1,nnodes); +engine = jtree_inf_engine(bnet); +[engine,loglik] = enter_evidence(engine,evidence); + +%Open the file, and write the nodes to a file. +fileID = fopen(filename,'w'); +%%% The number of nodes +fprintf(fileID,'%i\n',nnodes); + +%Get canvas size + +labels_temp = cellstr(labels); +[x,y] = make_layout(bnet.dag); +%[x,y] = layout_dag(bnet.dag); + + +x = x - min(x); +y = 1 - y; +y = y - min(y); + +[x_dim,y_dim] = canvasSize(nnodes,x,y); + +%%% The dimensions of the canvas for the javascript code +fprintf(fileID,'%i\t%i\t\n',x_dim,y_dim) + +x = x*x_dim; +y = y*y_dim; +for i = 1:nnodes, +%%% The name and X- and Y-positions of each node + fprintf(fileID,'%s\t%i\t%i\n',labels{i},round(x(i)),round(y(i))); +end + +%Get the number of parents and children for each node. +num_par = zeros(1,nnodes); +%For parents, sum down columns +for i = 1:nnodes, + for j = 1:nnodes, + if bnet.dag(j,i) == 1, + num_par(i) = num_par(i) + 1; + end + end +end +num_child = zeros(1,nnodes); +for i = 1:nnodes, + for j = 1:nnodes, + if bnet.dag(i,j) == 1, + num_child(i) = num_child(i) + 1; + end + end +end + + +for i = 1:nnodes, + %%% The name and type of each node (1=continuous, the number of states + %%% if it is discrete + fprintf(fileID,'%s\t%i\n',labels{i},bnet.node_sizes(i)); + %%% The size of the node, I am going to keep them + %%% 250(width) by 150(height) for now + %Could modify this to change the width based on the length of the node + %name + fprintf(fileID,'%i\t%i\n',250,150); + %%% The number of parents of the node, and the parents + if num_par(i) == 0; + %%% If no parents: + fprintf(fileID,'%i\n',num_par(i)); + else + parents = zeros(1,num_par(i)); + k = 1; + for j = 1:nnodes, + if bnet.dag(j,i) == 1, + parents(1,k) = j; + k = k + 1; + end + end + format = '%i\t'; + for j = 1:num_par(i)-1, + format = strcat(format,'%i\t'); + end + format = strcat(format,'%i\n'); + %%%If there are parents: + fprintf(fileID,format,num_par(i),parents(1,:)); + end + + + %%% The number of children of the node, and the children + if num_child(i) == 0; + %%% If no children: + fprintf(fileID,'%i\n',num_child(i)); + else + children = zeros(1,num_child(i)); + k = 1; + for j = 1:nnodes, + if bnet.dag(i,j) == 1, + children(1,k) = j; + k = k + 1; + end + end + format = '%i\t'; + for j = 1:num_child(i)-1, + format = strcat(format,'%i\t'); + end + format = strcat(format,'%i\n'); + %%%If there are parents: + fprintf(fileID,format,num_child(i),children(1,:)); + end + + predict = marginal_nodes(engine,i); + if bnet.node_sizes(i) ~= 1, + for j = 1:bnet.node_sizes(i), + %%%For discrete nodes, the state and the percent of that state + fprintf(fileID,'%i\t%6.4f\n',j,predict.T(j)); + end; + else + %cases(i) + % MAX(cases(i)) + % MIN(cases(i)) + [x_vals,y_vals] = calcGaussian(predict.mu,predict.Sigma,Amax(i),Amin(i)); + %%%For continuous nodes, print x and the pdf of a normal curve. + for j = 1:101, + %%Undo standardization + x_vals(j,1) = x_vals(j,1)*stdevs{i}+means{i}; + fprintf(fileID,'%6.4f\t%6.4f\n',x_vals(j,1),y_vals(j,1)); + end; + end; +end +%fprintf(fileID,'%s\t %\n',labels_temp{:}); + + +fclose(fileID); + +end + + +function [x_dim, y_dim] = canvasSize(nnodes,x,y) +%canvasSize Function to calculate the size of the canvas to +% build the network structure + + +%I am going to assume that the node size will be +% height = 150, width = 250 +% so there will be a node spacing of +% 200 (in y-dim) and 300 (in x-dim). +y_space = 200; +x_space = 300; + +%Set default minimum x and y dimensions +x_dim = 1200; +y_dim = 1200; + +%get unique y values +y_unique = unique(y); +size_y = size(y_unique,2); +y_dim_temp = size_y*y_space; + +%get the maximum nodes in any layer +size_x = zeros(1,size_y); +for i = 1:size_y, + for j = 1:nnodes, + if y_unique(i) == y(j), + size_x(1,i) = size_x(1,i) + 1; + end; + end; +end; +size_x = max(size_x); +x_dim_temp = size_x*x_space; + +if x_dim_temp > x_dim, + x_dim = x_dim_temp; +end; + +if y_dim_temp > y_dim, + y_dim = y_dim_temp; +end; +end + +function [x_vals,y_vals] = calcGaussian(mu,Sigma,maxval,minval) +%Function to calculate 101 points of Gaussian function to use in plotting +% Gets the probability density of the mean value and 50 evenly spaced +% points up to 3Sigma below the mean and 50 evenly space points up to +% 3Sigma above the mean. +%maxval +%minval +x_vals = zeros(101,1); +y_vals = zeros(101,1); + +%x_vals(1,1) = mu - 3*Sigma; +x_vals(1,1) = minval - 1; +gap=((maxval+1)-(minval - 1))/100; +%x_vals(1,1) = 0;%mu - 3*Sigma; +for i = 1:100, + % x_vals(i+1,1) = x_vals(1,1) + i*6*Sigma/100; + x_vals(i+1,1) = x_vals(i,1) + gap; + %x_vals(i+1,1) = x_vals(i,1) + 1/100; +end + +for i = 1:101, + y_vals(i,1) = normpdf(x_vals(i,1),mu,Sigma); +end + +end |
