受限玻尔兹曼机代码实现(Python)

1、前言

上一篇受限玻尔兹曼机原理推导,我们讲了受限玻尔兹曼机的原理推导。本文,我们来看看受限玻尔兹曼机如何应用到推荐系统中。
数学基础:【概率论与数理统计知识复习-哔哩哔哩】

2、案例

由于我们仅仅讲了二值的受限玻尔兹曼机,所以本文也仅仅针对二值问题。受限玻尔兹曼机也常常用在推荐系统中。

如何推荐?一般情况下,用户给出它们所喜欢(厌恶)的电影(或其他东西),比如有5部电影,甲给了【0,1,1,0,1】,0表示不喜欢,1表示喜欢。我们通常将这些0,1值当作训练数据。也就是观测变量。

那么隐藏层是什么东西呢?我们没有明确的界定,因为在神经网络中,其是一种抽象出来的概念。如果你的五部电影种,三部是喜剧,两部是恐怖片。那么设置两个隐藏层,或许可以理解为对喜剧和恐怖片的喜好。

那么,当有一个新的用户来的时候,它对该五部电影给出了偏好评价,然后我们自然可以计算出它喜欢什么类型的电影;亦或者,我们再进行一次反向的,当用户给了它喜欢什么类型的电影,我们同样也可以给他推荐相关的电影了。

3、代码实现

import numpy as np

np.random.seed(2)
class RBM():
    def __init__(self,x_layer,h_layer):
        '''
        :param x_num: 可见层维度
        :param h_num: 隐藏层维度
        '''
        self.x_layer=x_layer #可见层的维度
        self.h_layer=h_layer #隐藏层的维度
        self.w=np.random.normal(0, 0.01, size=(self.x_layer, self.h_layer)) #从正态分布中随机采样w
        self.a=np.random.normal(0, 0.01, size=(self.h_layer,1)) #从正态分布中随机采样a
        self.b=np.random.normal(0, 0.01, size=(self.x_layer,1)) #从正态分布中随机采样b
        self.learning_rate=0.1 #学习率
    def train(self,x,K):
        '''
        :param x: 训练数据
        :param K: 使用k次吉布斯采样
        :return:
        '''
        x_num=x.shape[0] #样本的个数

        for _ in np.arange(10000): #梯度上升迭代10000次
            x0=x
            #################
            #CD-K吉布斯采样
            for _ in np.arange(K): #吉布斯采样K次

                P_h=self.sigmoid_Ph_x(x0) #从v0计算出P(h=1|v0)

                #从P(h=1|v0)采样出h0
                h0=np.random.binomial(1,p=P_h,size=(x_num,self.h_layer))
                #计算出P(v|h0)
                P_x=self.sigmoid_Px_h(h0)

                #采样出v
                x0=np.random.binomial(1,p=P_x,size=(x_num,self.x_layer))
            #################
            #真实数据的P(h=1|x)
            true_h =self.sigmoid_Ph_x(x)

            #采样数据的P(h=1|x)
            x_sample_h=self.sigmoid_Ph_x(x0)
            #w梯度
            w_GD=(x.T@true_h-x0.T@x_sample_h)/x_num

            #a梯度
            a_GD=np.mean(true_h-x_sample_h,axis=0).reshape(-1,1)

            #b梯度
            b_GD=np.mean(x-x0,axis=0).reshape(-1,1)

            #梯度下降
            self.w+=self.learning_rate*w_GD
            self.a+=self.learning_rate*a_GD
            self.b+=self.learning_rate*b_GD
    def sigmoid_Ph_x(self,x):
        '''
        计算P(h=1|x)
        :param x: 数据
        :return:
        '''
        H=x @ self.w+self.a.T
        result=1/(1+np.exp(-H))
        return result
    def sigmoid_Px_h(self,h):
        '''
        计算P(x=1|h)
        :param h:
        :return:
        '''
        H=(self.w @ h.T + self.b).T
        result=1/(1+np.exp(-H))
        return result

    def predict(self,x):
        '''
        预测
        :param x: 数据
        :return:
        '''
        P=self.sigmoid_Ph_x(x) #计算概率
        result=np.random.binomial(1,P) #返回概率最大所对应的值
if __name__ == '__main__':
    K=2 #吉布斯采样k次
    x=np.array([[1,1,1,0,1],
                [1,1,1,0,0],
                [1,0,0,1,1],
                [0,0,0,1,1],]) #训练数据
    rbm = RBM(5, 2) #初始化
    rbm.train(x,K) #训练
    new_x = np.array([[1,0,1,0,0],
                     [0,0,0,1,1]]) #测试数据
    rbm.predict(new_x) #预测
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度受限玻尔兹曼机(Deep Belief Network, DBN)是一种用于特征融合的机器学习模型,它可以通过学习数据中的特征来进行模式识别和分类。在Python中,我们可以使用现有的库来实现深度受限玻尔兹曼机模型,比如使用TensorFlow或者PyTorch等深度学习框架。 首先,我们需要导入相应的库和模块,比如TensorFlow或者PyTorch。然后,我们需要准备数据集,并对数据进行预处理和特征提取。接下来,我们可以使用深度受限玻尔兹曼机模型来训练数据,并获取特征表示。最后,我们可以利用这些特征表示来进行分类或者其他机器学习任务。 下面是一个简单的使用Python实现深度受限玻尔兹曼机模型的示例: ```python import tensorflow as tf from tensorflow.keras import layers, models # 准备数据集 (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)).astype('float32') / 255 test_images = test_images.reshape((10000, 28 * 28)).astype('float32') / 255 # 构建深度受限玻尔兹曼机模型 model = models.Sequential([ layers.Dense(128, activation='relu', input_shape=(28 * 28,)), layers.Dense(64, activation='relu'), layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_images, train_labels, epochs=10) # 使用模型进行预测 test_loss, test_acc = model.evaluate(test_images, test_labels) print('Test accuracy:', test_acc) ``` 在这个示例中,我们使用TensorFlow来构建一个简单的深度受限玻尔兹曼机模型,并使用MNIST数据集进行训练和测试。通过这样的方式,我们可以利用深度受限玻尔兹曼机来进行特征融合和模式识别任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值