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

📄 hnfa.py

📁 Extension packages to Bayes Blocks library, reported in "Nonlinear independent factor analysis by hi
💻 PY
📖 第 1 页 / 共 2 页
字号:
            vA_out = self.net.GetGaussianNode(Label("vA_out",                                                    1, self.nexthidden))            prod = []            for i in range(len(weights[j])):                if weights[j][i] is None:                    continue                A = self.fact.GetGaussian(		    Label("A", 2, 1, i, self.nexthidden),		    self.fact.GetConst0(), vA_in)                self.fact.EvidenceNode(                    A, mean=weights[j][i],                    var=0.01, decay=40.0)                prod.append(self.fact.GetProdV(			Label("prA", 2, 1, i, self.nexthidden),			A, self.net.GetNode(Label("s", 2, i))))                A.SetPersist(5)            ms = (self.fact.GetGaussian(Label("ms", 1, self.nexthidden),                               self.fact.GetConst0(),                               self.fact.GetConst0()))            ms.SetPersist(5)            self.fact.EvidenceNode(                ms, mean=bias[j],                var=0.01, decay=40.0)            sum = self.fact.BuildSum2VTree(prod + [ms], ("sums",                                                        1, self.nexthidden))            vs = self.net.GetGaussianNode(Label("vs", 1, self.nexthidden))            self.fact.EvidenceNode(vs, mean=9, var=1, decay=vsdecay)            s = self.fact.GetGaussNonlinV(Label("s", 1, self.nexthidden),					  sum, vs)            s.Update()	    s.SetPersist(5)            for i in childind[j]:                vA = self.fact.GetSum2(Label("vA", 1, 0, self.nexthidden, i),                          vA_out, self.net.GetGaussianNode(Label("vA_in", 0, i)))                A = self.fact.GetGaussian(Label("A", 1, 0, self.nexthidden, i),					  self.fact.GetConst0(), vA)                prA = self.fact.GetProdV(		    Label("prA", 1, 0, self.nexthidden, i),		    A, s)                sumcache[i].append(prA)                Alist.append(A)            self.nexthidden += 1        for i in range(self.dim[0]):            if len(sumcache[i]) == 0:                continue            sum = self.fact.BuildSum2VTree(sumcache[i], ("sums", 0, i))            Helpers.AddSum2V(self.net,                             self.net.GetNode(Label("s", 0, i)),                             0, sum, Label("sums", 0, i))        map(Net.Variable.Update,Alist)        self.net.SortNodes()    def AddHiddenBest(self, num=5, numtest=1000,                      scalemean = 0.5, scalestd = 0.5, vsdecay = 1000):        if num == numtest:            return self.AddHidden(num=num,scalemean=scalemean,                                  scalestd=scalestd,vsdecay=vsdecay)        (weights, bias, costchange)=self.HiddenCost(            numtest=numtest, scalemean=scalemean, scalestd=scalestd)        cs = map(Numeric.sum, costchange)        s=list(Numeric.argsort(cs))        ind = s[-5:]        ind.reverse()        self.AddHidden2(weights=Numeric.take(weights,ind),                        bias=Numeric.take(bias,ind),                        vsdecay=vsdecay)    def HiddenCost(self, numtest=1, scalemean = 0.5, scalestd = 0.5):        sources = Numeric.array(Helpers.GetMeanV(            map(lambda i:self.net.GetVariable(Label('s', 2, i)),                range(self.dim[2]))),'d')        gradmean = Numeric.zeros((self.dim[0], self.net.Time()),'d')        gradvar = Numeric.zeros((self.dim[0], self.net.Time()),'d')        exp = []        for i in range(self.dim[0]):            s0 = self.net.GetVariable(Label('s', 0, i))            dsset = Net.DVSet()            s0.GradRealV(dsset, s0.GetParent(0))            gradmean[i] = dsset.mean            gradvar[i] = dsset.var            exp.append(Helpers.GetExp(s0.GetParent(1)))        weights=[]        bias=[]        costchange=[]        for j in range(numtest):            scale = math.exp(self.random.gauss(scalemean, scalestd))            weights.append([])            for i in range(self.dim[2]):                weights[j].append(self.random.gauss(                    0,scale/math.sqrt(self.dim[2])))            bias.append(self.random.gauss(0, scale))            try:                mean1=Numeric.dot(Numeric.array([weights[j]]), sources)+bias[j]                #This clip should take care of overflows                mean1=Numeric.clip(mean1,-18,18)                mean2=Numeric.exp(-(mean1**2))                mean2=mean2-MLab.mean(mean2,1)                #mean2=Numeric.exp(-(mean1**2)/(1+2*mvs1))/math.sqrt(1+2*mvs1)                #Want to minimise cost2 = sum(a*(x-b*m))^2                #where a=a[i], x=x[i], m=m[i], b is the parameter                #gradmean=a*x gradvar=a/2 mean2=m                #differentiate-> sum(-m*a*(x-b*m))==0                #-> b=sum(m*a*x)/sum(m^2*a) = c/d                #we wan the difference sum(a*x^2-a*(x-b*m)^2)=                #sum(2*a*x*b*m-a*b^2*m^2)=                #2*b*sum(a*x*m)-b^2*sum(a*m^2)=2*b*c-b^2*d=2*c^2/d-c^2/d=c^2/d                c=Numeric.dot(mean2,Numeric.transpose(gradmean))                _2d=Numeric.dot(mean2**2, Numeric.transpose(gradvar))                costchange.append(((c**2)/_2d)[0])            except OverflowError:                costchange.append(None)        return weights, bias, costchange    def PruneHidden(self, hidden, cdiff = None):        node = self.net.GetNode(hidden)        if cdiff is None:            cdiff = Helpers.CostDifferenceV(node)        self.learner.HistoryAdd("PruneHidden", (hidden, cdiff))        node.Die()        self.net.CleanUp()        self.net.SortNodes()    def TryPruneHidden(self, cdiff = 200, num=1, lazy=0):        self.learner.HistoryAdd("TryPruneHidden", (cdiff, num))        nodes = filter(lambda x:Unlabel(x.GetLabel())[1][1] <                       self.nexthidden-lazy,                       self.net.GetVariables('s\(1,'))        hiddens = map(lambda x:(Helpers.CostDifferenceV(x), x.GetLabel()),                      nodes)        hiddens.sort()        for i in range(num):            if len(hiddens) > i and hiddens[i][0] < cdiff:                self.PruneHidden(hiddens[i][1], hiddens[i][0])            else:                return i        return num    def AddWeight(self):        raise RuntimeError, "AddWeight() not ready for use"        hiddenlist=self.net.GetVariables('s\(1,')        hidden=self.random.choise(slist)        hiddennum = Unlabel(s.GetLabel())[1][1]        parentind=self.random.randrange(self.dim[2])        childind=self.random.randrange(self.dim[0])        vA_in = self.net.GetGaussianNode(Label("vA_in", 1, hiddennum))        vA_out = self.net.GetGaussianNode(Label("vA_out", 1, hiddennum))    def AddAllWeights(self, prob = 1.0):        adden = []        for i in range(self.dim[0]):            for j in range(self.dim[2]):                if self.random.random() < prob:                    if self.AddOneWeight((2, 0, j ,i)):                        adden.append(Label('A', 2, 0, j ,i))        hiddenlist=self.net.GetVariables('s\(1,')        for h in hiddenlist:            k = Unlabel(h.GetLabel())[1][1]            for j in range(self.dim[2]):                if self.random.random() < prob:                    if self.AddOneWeight((2, 1, j ,k)):                        adden.append(Label('A', 2, 1, j ,k))            for i in range(self.dim[0]):                if self.random.random() < prob:                    if self.AddOneWeight((1, 0, k ,i)):                        adden.append(Label('A', 1, 0, k ,i))        self.net.SortNodes()        self.learner.HistoryAdd("AddAllWeights", (prob, tuple(adden)))                def AddOneWeight(self, index, lazy = 0):        if self.net.GetNode(Label("A", index)) is None:            if index[0] == 1:                vA_out = self.net.GetGaussianNode(Label("vA_out", 1, index[2]))            elif index[0] == 2:                vA_out = None            else:                raise IndexError, "index[0] out of range"            if index[1] not in (0, 1):                raise IndexError, "index[1] out of range"            vA_in = self.net.GetGaussianNode(Label("vA_in", index[1], index[3]))            if vA_out is None:                vA = vA_in            else:                vA = self.fact.GetSum2(Label("vA", index), vA_out, vA_in)            A = self.fact.GetGaussian(Label("A", index),				      self.fact.GetConst0(), vA)            A.SetPersist(5)            prod = self.fact.GetProdV(Label("prA", index), A,                             self.net.GetNode(Label("s", index[0], index[2])))            if lazy:                return prod            Helpers.AddSum2V(self.net,                             self.net.GetNode(Label("s",                                                    index[1], index[3])),                             0, prod,                             Label("sums", index[1], index[3]))            A.Update()            self.net.SortNodes()            return 1    def TryPruning(self):        return self.learner.TryPruning()    def HookeJeeves(self):        return self.learner.HookeJeeves()            def Iteration(self):        return self.learner.Iteration()    def LearnNet(self, *args, **kws):        return self.learner.LearnNet(*args, **kws)

⌨️ 快捷键说明

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