强化深度学习中利用时序差分法中的Sarsa算法解决风险投资问题实战(附源码 超详细必看)

简介: 强化深度学习中利用时序差分法中的Sarsa算法解决风险投资问题实战(附源码 超详细必看)

需要源码请点赞关注收藏后评论区留下QQ~~~

一、Sarsa算法简介

Sarsa算法每次更新都需要获取五元组(S,A,R,S',A')这也是该算法称为Sarsa的原因,每当从非终止状态进行一次转移后,就进行一次更新,但需要注意的是,动作A是情节中实际发生的动作。在更新(S,A)的动作值函数Q(S,A)时,Agent并不实际执行状态S'下的动作A‘。由于采用了贪心策略,Sarsa算法在各时间步都隐式地进行了策略改进,像这种在每个样本更新后都进行策略改进的策略迭代算法,也成为完全乐观策略算法

估算最优策略的Sarsa算法步骤如下

二、风险投资问题实战

在进行投资时,预期收益是一个非常重要的参考指标,现在越来越多的人接收概率的观点,但是收益为正的投资也未必一定理性。

假设一种风险投资,当前本金为S,下一个单位时间有0.5的概率变为原有资产的0.9倍,0.5的概率变为原有资产的1.11倍。经过一个时间单位后预期收益率变为百分之0.5,但是在实际情况中,进行2n各时间步后连续投资预期收益非常低,当N趋近于无穷时,该投资会血本无归,为了使投资更加合理,利用Sarsa算法给出在给定本金情况下的投资方案

该问题的MDP模型如下

1:状态空间

状态为当前资产的数目,因此状态空间为连续的实数空间

2:动作空间

该问题中一共有两个动作,分别为投资和不投资。用0表示不投资,用1表示投资

3:立即奖赏

在这个问题中 如果不投资则立即奖赏为0,如果进行投资则分为四种情况

资产增长且结果大于等于本金 +1奖赏

资产减少 且投资结果小于等于本金 -1奖赏

资产增加 且投资结果小于本金 +0.5奖赏

资产减少 且投资结果大于本金 -0.5奖赏

使用Sarsa算法解决风险投资问题 首先设置本金为10  将动作值函数设置为50×2的数组,且初值为0,初始学习率为0.05,使用贪心策略

当迭代到20000个情节时  迭代已经收敛 导出的Q值迭代过程表如下

结论:当资金小于本金时(10)时,不进行投资,当现有资金大于等于本金(10)时,可以进行投资

部分代码如下

import numpy as np
from invest import InvestEnv
np.random.seed(1)
env = InvestEnv()
def trans_q(Q):  # 输出保留3位小数
    new_q = []
    new_q = [round(x, 3) for x in Q]
    return new_q
def Attenuation(epsilon, alpha, episode_sum, episode):  # epsilon和alpha衰减函数
    epsilon = (float(episode_sum) - float(episode)) / float(episode_sum) * epsilon
    alpha = (float(episode_sum) - float(episode)) / float(episode_sum) * alpha
    return epsilon, alpha
# 输出函数
def print_ff(list_q, Q, episode_i, epsilon_k, alpha_k):
    list_s = range(0,50)
    for em in list_q:
        if em == episode_i:
            print("*******************************情节数:%s*******************************" % (str(em)))
            for state in list_s:
                print("Q(%d,*)" % (state) + str(trans_q(Q[state])))
                prob = [epsilon_k / 2.0, epsilon_k / 2.0]
                max_a = np.argmax(Q[state])
                prob[max_a] = 1 - (epsilon_k / 2.0)
                print('概率值' + str(trans_q(prob)))
                print("epsilon_k: {}".format(epsilon_k))
                print("alpha_k:{}".format(alpha_k))
# 输出单步计算过程
def print_dd(s, a, R, next_s, next_a, print_len, episode_i, Q, e_k, a_k, P, P_next):
    if s == 6 and a == 1:
        print("*********************************单步的计算过程************************************")
        print(6, 1)
        print("alpha:" + str(a_k))
        print("epsilon:" + str(e_k))
        print("Q_state: {} Q_next: {}".format(Q[s], Q[next_s]))
        print("Q[{},{}]: {}".format(s, a, Q[s, a]))
        print("Q[{},{}]: {}".format(next_s, next_a, Q[next_s, next_a]))
        print("update:" + str(Q[s, a] + a_k * (R + 0.8 * Q[next_s, next_a] - Q[s, a])))
        # print(p)
        print("************************************************************************************")
def policy_epsilon_greedy(env, s, Q, epsilon):
    Q_s = Q[s]
    if np.random.rand() < epsilon:
        a = np.random.choice(env.action_space)
    else:
        a = np.argmax(Q_s)
    return a
def Sarsa(env, episode_num, alpha, gamma, epsilon):
    Q = np.zeros((env.state_space, env.action_space))
    epsilon = epsilon
    count = 0
    list_q = [0,1,2,3,4,9998,9999,10000,10001,10002,19996,19997,19998,19999,20000]
    for episode_i in range(episode_num):
        env.reset()
        S = env.state
        epsilon_k, alpha_k = Attenuation(epsilon, alpha, episode_num, episode_i)
        A = policy_epsilon_greedy(env, S, Q, epsilon_k)
        print_ff(list_q, Q, episode_i, epsilon_k, alpha_k)
        if episode_i == 10000:
            print("e_k:" + str(epsilon_k) + "a_k" + str(alpha_k))
        done = False
        P_S = env.getState()
        for i in range(1000):
            next_S, R = env.step(A)
            P_S_next = env.getState()
            if next_S > 49:
                Q[S, A] = Q[S, A] + alpha_k * (R + gamma * 0.0 - Q[S, A])
                break
            next_A = policy_epsilon_greedy(env, next_S, Q, epsilon_k)
            # 输出某一个
            if episode_i in [9999, 10000]:
            count += 1
    print(count)
    return Q
Q = Sarsa(env, 20001, 0.05, 0.8, 0.5)

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
12天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
153 55
|
22天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
122 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
84 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
97 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
95 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
94 0
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
87 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
106 2
|
2月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
78 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
19天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
90 5