image thumbnail
from K2 algorithm for learning DAG structure in Bayesian network by Guangdi Li
This is the code of Cooper's K2 algorithm proposed in 1992, quick and convenient for using.

k2( LGObj,Order,u )
function  [ DAG, K2Score ] = k2( LGObj,Order,u )
%Input: a set of variables x1,...xn; a given order among them, an upper limit u on the number of parents for a node; a database on x1 ... xn.
%Output: a DAG with oriented arcs, K2Score saves the maximum score upon each node.
%For i := 1 to n do
%1.  Pai(xi) = null; Ok := true;
%2. Pold := g(xi; Pai(xi));
%3. While Ok and |pai(xi)| <= u do
%3.1. Let z be the node in the set of predecessors of xi that does not belong to Pai(xi) which maximizes g(xi; Pai(xi)) + {z} );
%3.2. Pnew := g(xi; Pai(xi) + {z});
%3.3. If Pnew > Pold. Then Pold := Pnew;  Pai(xi) := Pai(xi)+{z} Else Ok := false. 

% This code is written by Lowell Guangdi, Email: lowellli121@gmail.com

LG = struct( LGObj );
Dim = LG.VarNumber;
DAG = zeros( Dim );
K2Score = zeros( 1,Dim );

  for p = 2:Dim  % the first node have no parents
      Parent = zeros( Dim,1 ); OKToProcced = 1;
      Pold = -Inf;  %  the initiate stage 
      while OKToProcced == 1 && sum( Parent )<= u 
          %3.1.maximizes g(xi; Pai(xi)) + {z} )
          LocalMax = -Inf; LocalNode = 0;
          for q = ( p-1):( -1 ):1
              if Parent( Order( q ) )==0
                 Parent( Order( q ) ) = 1;                 
                 LocalScore = GClosedFun( LGObj, Order( p ), find( Parent' == 1 ) );
                 if LocalScore > LocalMax
                     LocalMax = LocalScore ;
                     LocalNode = Order( q );
                 end
                 Parent( Order( q ) ) = 0;
              end
          end
         %3.2. Pnew := g(xi; Pai(xi)+{z});
         Pnew = LocalMax;
         %3.3. If Pnew > Pold. Then Pold := Pnew;  Pai(xi) := Pai(xi)+{z}
         %Else Ok := false.
         if Pnew > Pold
             Pold = Pnew;
             Parent( LocalNode ) = 1;
         else
             OKToProcced = 0;
         end
      end
      % Save the local resutl upon node Order( p )
      K2Score( Order( p ) ) = Pold;
      DAG( :,Order( p ) ) = Parent;
  end
end

Contact us at files@mathworks.com