samer@0: % aica - ICA samer@0: % samer@0: % aica :: samer@0: % model(real) ~'probability model for components', samer@0: % [[N,N]] ~'initial weight matrix', samer@0: % options { samer@0: % rate :: nonneg/1e-4 ~'adaptation rate'; samer@0: % } samer@0: % -> arrow({[[N]]},{[[N]]},aica_state). samer@0: samer@0: function o=aica(model,W0,varargin) samer@37: opts=options('rate',1e-4,varargin{:}); samer@0: score=scorefn(model); samer@0: samer@0: rate=opts.rate; samer@0: o=loop(@update,@(s)W0); samer@0: samer@0: function [y,W]=update(x,W) samer@0: % y=W'*x; W=W+rate*(W-(W*y)*score(y)'); samer@0: y=W*x; W=W+rate*(W-(score(y)/size(y,2))*(y'*W)); samer@0: end samer@0: end