⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 learn_struct_pdag_ic_star.m

📁 麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!
💻 M
字号:
function [pdag, G] = learn_struct_pdag_ic_star(cond_indep, n, k, varargin)% LEARN_STRUCT_PDAG_IC_STAR Learn a partially oriented DAG (pattern) with latent % variables using the IC* algorithm% P = learn_struct_pdag_ic_star(cond_indep, n, k, ...)%% n is the number of nodes.% k is an optional upper bound on the fan-in (default: n)% cond_indep is a boolean function that will be called as follows:% feval(cond_indep, x, y, S, ...)% where x and y are nodes, and S is a set of nodes (positive integers),% and ... are any optional parameters passed to this function.%% The output P is an adjacency matrix, in which% P(i,j) = -1 if there is either a latent variable L such that i <-L-> j % OR there is a directed edge from i->j.% P(i,j) = -2 if there is a marked directed i-*>j edge.% P(i,j) = P(j,i) = 1 if there is and undirected edge i--j% P(i,j) = P(j,i) = 2 if there is a latent variable L such that i<-L->j.%% The IC* algorithm learns a latent structure associated with a set of observed % variables. % The latent structure revealed is the projection in which every latent variable is% 1) a root node% 2) linked to exactly two observed variables.% Latent variables in the projection are represented using a bidirectional graph, % and thus remain implicit.%% See Pearl, "Causality: Models, Reasoning, and Inference", 2000, p52 for more details.% Written by Tamar Kushnir, 2000sep = cell(n,n);ord = 0;done = 0;G = ones(n,n);G = setdiag(G,0);while ~done  done = 1;  [X,Y] = find(G);   for i=1:length(X)    x = X(i); y = Y(i);    nbrs = mysetdiff(myunion(neighbors(G, x), neighbors(G,y)), [x y]);    if length(nbrs) >= ord & G(x,y) ~= 0      done = 0;      SS = subsets(nbrs, ord, ord); % all subsets of size ord      for si=1:length(SS)	S = SS{si};	if feval(cond_indep, x, y, S, varargin{:})  	  G(x,y) = 0;	  G(y,x) = 0;	  sep{x,y} = myunion(sep{x,y}, S);	  sep{y,x} = myunion(sep{y,x}, S);	  break; % no need to check any more subsets 	end      end    end  end  ord = ord + 1;end% Create the minimal pattern,% i.e., the only directed edges are V structures.pdag = G;[X, Y] = find(G);% We want to generate all unique triples x,y,z% where y is a common neighbor to x and zfor i=1:length(X)  x = X(i);  y = Y(i);  Z = find(G(y,:));  Z = mysetdiff(Z, x);  for z=Z(:)'    if G(x,z)==0 & ~ismember(y, sep{x,z}) & ~ismember(y, sep{z,x})      pdag(x,y) = -1; pdag(y,x) = 0;      pdag(z,y) = -1; pdag(y,z) = 0;    end  endend% Convert the minimal pattern to a complete one using the following rules:% Rule 1:% if a and b are non-adjacent nodes with a common neighbor c,% if a->c and not b->c then c-*>b (marked arrow).% Rule 2:% if a and b are adjacent and there is a directed path (marked links) from a to b% then a->b (add arrowhead).%Pearl (2000)arrowin = [-1 -2 2];old_pdag = zeros(n);iter = 0;while ~isequal(pdag, old_pdag)  iter = iter + 1;  old_pdag = pdag;  % rule 1  [X, Y] = find(pdag);  for i=1:length(X)    x = X(i);    y = Y(i);    Z = find(pdag(y,:));    Z = mysetdiff(Z, x);    for z=Z(:)'      if G(x,z)==0 & ismember(pdag(x,y),arrowin) & ~ismember(pdag(z,y),arrowin)        pdag(y,z) = -2; pdag(z,y) = 0;      end    end  end  % rule 2  [X, Y] = find(G);   %check all adjacent nodes because if pdag(x,y) = -1   %and pdag(y,x) = 0 there could still be an bidirected edge between x & y.  for i=1:length(X)    x = X(i);    y = Y(i);    if ~ismember(pdag(x,y), arrowin) %x->y doesn't exist yet      %find marked path from x to y      add_arrow = marked_path(x,y,pdag);      if add_arrow         if pdag(y,x)==-1 %bidirected edge          pdag(x,y) = 2; pdag(y,x) = 2;        else          pdag(x,y) = -1;pdag(y,x) = 0;        end      end    end  endend%%%%%%%%%%%%%function t = marked_path(x,y,L)% MARKED_PATH is a boolean function which returns 1 if a marked path % between nodes x and y exists in the partially directed latent structure L.%% t = marked_path(x,y,L)%% x and y are the starting and ending nodes in the path, respectively.% L is a latent structure (partially directed graph with possible latent variables).%% Rule 2 of IC* algorithm (see Pearl, 2000)t=0;%find set of marked links from xmarked = find(L(x,:)==-2);if ismember(y,marked)  t=1; %marked path foundelse  for m=marked(:)'    t = marked_path(m,y,L);    if t==1      break; %stop when marked path found    end  endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -