受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)代码1

环境:python 2, 32位

https://www.cnblogs.com/tuhooo/p/5440473.html

备注:这个python代码需要用到psyco包,psyco包目前只有python2 32位版本。在windows 64+python 3环境下,如果下载psyco的源代码安装,比较麻烦。

https://blog.csdn.net/qq_36965134/article/details/80039026

"""

Continuous Restricted Boltzmann Machine

14/09/2008 - v. 0.1 by http://imonad.com

"""

from numpy import *

from numpy.random import *

import pylab as p

from scipy import stats, mgrid, c_, reshape, random, rot90

import psyco

psyco.full()

class RBM:

    def __init__(self, nvis, nhid):

        self.sig = 0.2

        self.epsW = 0.5

        self.epsA  = 0.5

        self.nvis = nvis

        self.nhid = nhid

        self.Ndat = 500

        self.cost = 0.00001

        self.moment = 0.90

        self.Svis0 = zeros( nvis+1, dtype=float32)

        self.Svis0[-1] = 1.0

        self.Svis = zeros( nvis+1, dtype=float32)

        self.Svis[-1] = 1.0

        self.Shid = zeros( nhid+1, dtype=float32)

        self.W  = standard_normal((nvis+1, nhid+1))/10

        self.dW = standard_normal((nvis+1, nhid+1))/1000

        self.Avis  =  0.1*ones( nvis+1, dtype=float32)

        self.Ahid  =  ones( nhid+1, dtype=float32)

        self.dA = zeros( nvis+1, dtype=float32)

        self.dat = self.genData()

    def genData(self):

        c1 = 0.5

        r1 = 0.4

        r2 = 0.3

        # generate enough data to filter

        N = 20* self.Ndat

        X = array(random_sample(N))

        Y = array(random_sample(N))

        X1 = X[(X-c1)*(X-c1) + (Y-c1)*(Y-c1) < r1*r1]

        Y1 = Y[(X-c1)*(X-c1) + (Y-c1)*(Y-c1) < r1*r1]

        X2 = X1[(X1-c1)*(X1-c1) + (Y1-c1)*(Y1-c1) > r2*r2]

        Y2 = Y1[(X1-c1)*(X1-c1) + (Y1-c1)*(Y1-c1) > r2*r2]

        X3 = X2[ abs(X2-Y2)>0.05 ]

        Y3 = Y2[ abs(X2-Y2)>0.05 ]

        #X3 = X2[ X2-Y2>0.15 ]

        #Y3 = Y2[ X2-Y2>0.15]

        X4=zeros( self.Ndat, dtype=float32)

        Y4=zeros( self.Ndat, dtype=float32)

        for i in xrange(self.Ndat):

            if (X3[i]-Y3[i]) >0.05:

                X4[i] = X3[i] + 0.08

                Y4[i] = Y3[i] + 0.18

            else:

                X4[i] = X3[i] - 0.08

                Y4[i] = Y3[i] - 0.18

        print "X", size(X3[0:self.Ndat]), "Y", size(Y3)

        return(vstack((X4[0:self.Ndat],Y4[0:self.Ndat])))

    # Sigmoidal Function

    def sigFun(self, X, A):

        lo = 0.0

        hi = 1.0

        return(lo + (hi-lo)/(1.0 + exp(-A*X)))

    # visible=0, hidden=1

    def activ(self, who):

        if(who==0):

            self.Svis = dot(self.W, self.Shid) + self.sig*standard_normal(self.nvis+1)        

            self.Svis = self.sigFun(self.Svis, self.Avis)

            self.Svis[-1] = 1.0 # bias

        if(who==1):

            self.Shid = dot(self.Svis, self.W) + self.sig*standard_normal(self.nhid+1)

            self.Shid = self.sigFun(self.Shid, self.Ahid)

            self.Shid[-1] = 1.0 # bias

    def wview(self):

        import pylab as p

        p.plot(xrange(size(self.W[2])),self.W[2], ‘bo‘)

        p.show()

    def learn(self, epochmax):

        Err = zeros( epochmax, dtype=float32)

        E = zeros( epochmax, dtype=float32)

        self.stat = zeros( epochmax, dtype=float32)

        self.stat2 = zeros( epochmax, dtype=float32)

        ksteps = 1

        

        for epoch in range(1,epochmax):

            wpos = zeros( (self.nvis+1, self.nhid+1), dtype=float32)

            wneg = zeros( (self.nvis+1, self.nhid+1), dtype=float32)

            apos = zeros( self.nhid+1, dtype=float32)

            aneg = zeros( self.nhid+1, dtype=float32)

                

            if(epoch>0):

                ksteps=50

            if(epoch>1000):

                ksteps=(epoch-epoch%100)/100+40

            self.ksteps = ksteps

            

            for point in xrange(self.Ndat):

                #print(self.dat[:][point])

                self.Svis0[0:2] = self.dat[:,point]

                self.Svis = self.Svis0

                # positive phase

                self.activ(1)

                wpos = wpos + outer(self.Svis, self.Shid)

                apos = apos + self.Shid*self.Shid

                # negative phase

                self.activ(0)

                self.activ(1)

                

                

                for recstep in xrange(ksteps):

                    self.activ(0)

                    self.activ(1)

                tmp = outer(self.Svis, self.Shid)

                wneg = wneg + tmp

                aneg = aneg + self.Shid*self.Shid

                

                

                delta = self.Svis0[0:2]-self.Svis[0:2]

                # statistics

                Err[epoch] = Err[epoch] + sum(delta*delta)

                E[epoch] =E[epoch] -sum( dot(self.W.T, tmp) )

                

            

            self.dW = self.dW*self.moment + self.epsW * ((wpos-wneg)/size(self.dat) - self.cost*self.W)

            self.W = self.W + self.dW

            self.Ahid = self.Ahid + self.epsA*(apos-aneg)/(size(self.dat)*self.Ahid*self.Ahid)

            Err[epoch] = Err[epoch]/(self.nvis*size(self.dat))

            E[epoch] = E[epoch]/size(self.dat)

            if (epoch%100==0) or (epoch==epochmax) or (epoch==1):

                print "epoch:", epoch, "err:", round_(Err[epoch], 6), "ksteps:", ksteps

            self.stat[epoch] = self.W[0,0]

            self.stat2[epoch] = self.Ahid[0]

        self.Err = Err

        self.E   = E

        

    def reconstruct(self, Npoint, Nsteps):

        X = array(random_sample(Npoint))

        Y = array(random_sample(Npoint))

        datnew = vstack((X, Y))

        self.datout = zeros( (2,Npoint), dtype=float32)

        for point in xrange(Npoint):

            self.Svis[0:2] = datnew[:,point]

            for recstep in xrange(Nsteps):

                self.activ(1)

                self.activ(0)

        

            self.datout[:,point] = self.Svis[0:2]

            

    def contour(self, p, dat):

        X, Y = mgrid[0.0:1.0:100j, 0.0:1.0:100j]

        positions = c_[X.ravel(), Y.ravel()]

        val           = c_[dat[0,:], dat[1,:]]

        kernel = stats.kde.gaussian_kde(val.T)

        Z = reshape(kernel(positions.T).T, X.T.shape)

        p.imshow(     rot90(Z) , cmap=p.cm.YlGnBu, extent=[0, 1, 0, 1])

        p.plot(dat[0,:], dat[1,:], ‘r.‘)

        p.axis([0.0, 1.0, 0.0, 1.0])

    

        

if __name__ == "__main__":

    

    seed(12345)

    rbm = RBM(2,8)

    rbm.learn(4000)

    kkk=0

    

    p.figure(1)

    p.plot(xrange(size(rbm.E)),rbm.E, ‘b+‘)

    p.figure(2)

    p.plot(xrange(size(rbm.Err)),rbm.Err, ‘r.‘)

    p.figure(3)

    if kkk==1:

        p.plot(rbm.dat[0,:],rbm.dat[1,:], ‘bo‘)

        p.axis([0.0, 1.0, 0.0, 1.0])

    else:

        rbm.contour(p, rbm.dat)

        p.savefig("dat.png",dpi=100)

    rbm.reconstruct(rbm.Ndat, 1)

    p.figure(4)

    if kkk==1:

        p.plot(rbm.datout[0,:],rbm.datout[1,:], ‘b.‘)

        p.axis([0.0, 1.0, 0.0, 1.0])

    else:

        rbm.contour(p, rbm.datout)

    

    rbm.reconstruct(rbm.Ndat, 20)

    p.figure(5)

    if kkk==1:

        p.plot(rbm.datout[0,:],rbm.datout[1,:], ‘b.‘)

        p.axis([0.0, 1.0, 0.0, 1.0])

    else:

        rbm.contour(p, rbm.datout)

    

    

    rbm.reconstruct(rbm.Ndat, rbm.ksteps)

    p.figure(6)

    if kkk==1:

        p.plot(rbm.datout[0,:],rbm.datout[1,:], ‘b.‘)

        p.axis([0.0, 1.0, 0.0, 1.0])

    else:

        rbm.contour(p, rbm.datout)

        p.savefig("reconstruct.png",dpi=100)

    p.figure(7)

    p.plot(xrange(size(rbm.stat)), rbm.stat, "b.")

    p.figure(8)

    p.plot(xrange(size(rbm.stat2)), rbm.stat2, "b.")

    print(around(rbm.W,5))

    print(rbm.Ahid)

    p.show()

原文地址:https://www.cnblogs.com/emanlee/p/12383913.html

时间: 2024-11-08 21:31:33

受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)代码1的相关文章

受限玻尔兹曼机(Restricted Boltzmann Machine)

受限玻尔兹曼机(Restricted Boltzmann Machine) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 生成模型 2. 参数学习 3. 对比散度学习算法 由于受限玻尔兹曼机的特殊结构,因此可以使用一种比吉布斯采样更有效 的学习算法,即对比散度(Contrastive Divergence)对比散度算法仅需k步吉布斯采样.为了提高效率,对比散度算法用一个训练样本作为可观测向量的初始值.然后,交替对可观测向量和隐藏向量进行吉布

Restricted Boltzmann Machine(to be continued)

1,受限玻尔兹曼机,思想似乎是源自于热力学,因为有一个玻尔兹曼分布律的东西,具体还没学习,不过可见机器学习中不同学科的思想融合,往往是idea/innovation 的发源地. 2,想迅速入门,受知乎指引看了Hugo Larochelle在YouTube上的神经网络课第五章的Restricted Boltzmann machine. 在[5.2]中讲到了P(h|x)的条件概率的推导,感觉不错,截图如下: 然后就可以很容易地推出隐层是可见层的logistic函数了: 接着,不知道怎么和local

限制Boltzmann机(Restricted Boltzmann Machine)

限制Boltzmann机(Restricted Boltzmann Machine) 起源:Boltzmann神经网络 Boltzmann神经网络的结构是由Hopfield递归神经网络改良过来的,Hopfield中引入了统计物理学的能量函数的概念. 即,cost函数由统计物理学的能量函数给出,随着网络的训练,能量函数会逐渐变小. 可视为一动力系统,其能量函数的极小值对应系统的稳定平衡点. Hinton发明的Boltzmann中乘热打铁,对神经元输出引入了随机概率重构的概念.其想法来自于模拟退火算

《神经网络与深度学习》(四) 受限玻尔兹曼机

转自:http://blog.csdn.net/qiao1245/article/details/50932519 谈到神经网络,就不得不提到最近非常火的深度学习.那么什么是深度学习?它与神经网络的关系是什么?深度学习的基本原理和常用算法是什么?我将在这篇中详细解答. 什么是深度学习 深度学习来源于人工神经网络,它的思想是组合低层次的特征从而构建出更加抽象的深层次特征.深度学习的概念由Hinton等人于2006年提出, 它是一个新的机器学习领域,通过更"深"层次的训练,它可以更加良好的

深度学习深入浅出:受限玻尔兹曼机RBM(一)基本概念

技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 最近在复习经典机器学习算法的同时,也仔细看了一些深度学习的典型算法.深度学习是机器学习的"新浪潮",它的成功主要得益于深度"神经网络模型"的优异效果.这个小系列打算深入浅出地记录一下深度学习中常用的一些算法.第一篇先写一下"受限玻尔兹曼机"RBM,会分若干个小段写,这是第一段,关于RBM的基本概念. 网上有很多关于RBM的介绍,但是很多写的比较简略,跳过了很多细节,本文

受限玻尔兹曼机(RBM)原理总结

https://blog.csdn.net/l7H9JA4/article/details/81463954 授权转发自:刘建平<受限玻尔兹曼机(RBM)原理总结> 地址:http://www.cnblogs.com/pinard/p/6530523.html 前  言 本文主要关注于这类模型中的受限玻尔兹曼机(Restricted Boltzmann Machine,以下简称RBM),RBM模型及其推广在工业界比如推荐系统中得到了广泛的应用.章节目录 RBM模型结构 RBM概率分布 RBM模

受限波兹曼机导论Introduction to Restricted Boltzmann Machines

Suppose you ask a bunch of users to rate a set of movies on a 0-100 scale. In classical factor analysis, you could then try to explain each movie and user in terms of a set of latent factors. For example, movies like Star Wars and Lord of the Rings m

受限玻尔兹曼机与推荐系统

与传统的浅层机器学习相比, 深度学习具有优秀的自动提取抽象特征的能力,并且随着分布式计算平台的快速发展,大数据的处理能力得到极大的提升,使得近年来DL在工程界得到广泛的应用,包括图像识别,语音识别,自然语言处理等领域,并取得比传统机器学习更好的效果提升.另一方面,智能推荐系统,本质上是从一堆看似杂乱无章的原始流水数据中,抽象出用户的兴趣因子,挖掘出用户的偏好,因此把深度学习与推荐系统相结合成为近年来DL发展的一个新热点,事实上,Spotify,Netflix,Facebook,Google等公司

受限玻尔兹曼机和深度置信网络

2016-07-20   11:21:33 1受限玻尔兹曼机 受限玻尔兹曼机(Restricted Boltzmann Machines, RBM)[1]由深度学习专家Hinton提出,有很多方面的应用,最成熟的有图像领域的图像识别和手写体数字识别,作为协同过滤算法对某一个未知值做预测,针对具有高维时间序列属性的数据,如人体移动的特征,同样也是做预测,还有针对文档数据分类和音频数据识别等等. 受限玻尔兹曼机RBM是一种特殊的马尔科夫随机场(Markov Random Field, MRF).一个