强化学习--基础篇

背景:由于返校的原因,手头的笔记本无法完成在Windows下运行虚拟机的操作,所以选择在Windows下进行一些学习。(不得不吐槽下“微星笔记本”)
最近在看“强化学习”有关书籍,其中前几章为基础知识。现做个总结:
在这里插入图片描述

  1. 书中多采用python实例,不可避免的又要和python打交道,于是配置了相关vscode的python环境。电脑本身是装有numpy,和matplotlib包的(忘了什么时候安装的了)
    首先在vscode中, ctrl+shift+P找到下图所示配置地方
    在这里插入图片描述
    添加语句如下所示:
    在这里插入图片描述
{
    "python.pythonPath": "E:\\software\\anaconda\\python.exe"
}

其中,路径为python.exe所在路径。这样,在Vscode中就可以关联找到numpy,以及mathplotlib包了。

  1. Python也是脚本语言,这点和Matlab的.m文件挺像的。
  2. 略过书中有关矩阵基本形式的介绍(书中着重强调了对称矩阵的性质,不知道后续内容是否有涉及)
  3. 概率部分,贝叶斯定理:
    P(YX)=P(XY)P(Y)P(X) P(Y|X)=\frac{P(X|Y)\cdot P(Y)}{P(X)}
  4. 重要性采样:当原分布函数比较复杂的时候,无法直接利用原分布函数进行求期望,方差等操作。这个时候,可以采用“曲线救国”的方式,基于大数定理,用采样的样本近似逼近原分布,采用的是np.random.normal()实现。附上书中的例子,慢慢琢磨:
import numpy as np
import math
import matplotlib.pyplot as plt
def gaussian(x,u ,sigma):
    return math.exp(-(x-u)**2/(2*sigma*sigma))/math.sqrt(2*math.pi*sigma*sigma)

def importance_sampling_test(ori_sigma, sample_sigma):
    origin = []
    for n in range(10):
        sum = 0
        for i in range(10000):
            a = np.random.normal(1.0,ori_sigma)
            sum += a
        origin.append(sum)

    isample = []
    for n in range(10):
        sum2 = 0
        for i in range(10000):
            a = np.random.normal(1.0,sample_sigma)
            ua = gaussian(a,1.0,sample_sigma)
            na = gaussian(a,1.0,ori_sigma)
            sum2 += a*na/ua
        isample.append(sum2)

    origin = np.array(origin)
    isample = np.array(isample)
    np_mean = np.mean(origin)
    np_std = np.std(origin)
    print(np_mean,end="") 
    print("\t",end="")#np.std(origin)
    print(np_std)
    np_mean = np.mean(isample)
    np_std = np.std(isample)
    print(np_mean,end="") #np.std(origin)
    print("\t",end="")
    print(np_std)

importance_sampling_test(1.0,1.0)
importance_sampling_test(1.0,0.5)
importance_sampling_test(1.0,2)

xs = np.linspace(-5,6,301)
y1 = [gaussian(x,1.0,1.0) for x in xs]
y2 = [gaussian(x,1.0,0.5) for x in xs]
y3 = [gaussian(x,1.0,2) for x in xs]

fig = plt.figure(figsize=(8,5))
plt.plot(xs,y1,label='sigma=1.0')
plt.plot(xs,y2,label='sigma=0.5',linestyle=':')
plt.plot(xs,y3,label='sigma=2.0',linestyle='--')
plt.legend()
plt.show()

在VScode中,单机右上角的运行按钮后,可以得到下图:
在这里插入图片描述

  1. 信息论基础:熵,书中又名“惊喜度”。事件发生的概率越小,惊喜度越大。表示熵的函数需要时连续的。f(0.5)=1f(0.5)=1。于是找到一个满足的函数为:
    entropy=entropy=xp(x)logp(x) entropy = entropy=-\sum_{x}p(x)logp(x)
    连续变量上定义为
    entropy=xp(x)logp(x)entropy=-\int_{x}p(x)logp(x)
    书中将掷硬币的例子编写曲线表示,假如有字的一面朝上的概率为pp,有花的一面的朝上的概率为1p1-p,则有关熵的公式为:
    entropy(p)=plogp(1p)log(1p)entropy(p) = -plogp-(1-p)log(1-p)
    Python代码如下:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1,101)
y = -x*np.log2(x)-(1-x)*np.log2(1-x)
y[np.isnan(y)] = 0
plt.plot(x,y)
plt.show()

在这里插入图片描述

  1. KL散度:描述两个概率分布的差异。表征两个概率分布之间的距离。当两个分布越接近,则KL散度越小;反之,两个分布越远,KL散度就越大。 (书中有一大堆公式推导,略)
  2. 凸函数及其性质:其实高中数学中就已经普及函数的凹凸性质了,以前确实没有注意到这个知识点。机器学习概念篇:一文详解凸函数和凸优化,干货满满
    凸函数,凸集的优点:如果一个点是凸函数的局部最优值,那么这个点就是函数的全局最优值。更进一步,如果这个函数是强凸函数,那么这个点是函数唯一的全局最优值。(详细证明见书中 P39-P41)
  3. 机器学习概念: Python中,有scikit-learn工具包可以完成可视化的回归问题,通过pip list查看。可以参考链接为:机器学习算法的随机数据生成 ,plot的颜色和线条设置可以参看python中matplotlib的颜色及线条控制
 import numpy
import sklearn.datasets as d
import matplotlib.pyplot as plt
reg_data = d.make_regression(100,1,1,1,1.0)
x,y = d.make_classification(100,2,2,0,0,2)
plt.subplot(121)
plt.plot(reg_data[0],reg_data[1])
plt.subplot(122)
plt.plot(x[:,0],x[:,1],marker=',')
plt.show()

在这里插入图片描述

  1. 交叉熵:举一个例子,如果有两个服从伯努利分布的随机变量P和Q,他们的交叉熵H(P,Q)H(P,Q)
    H(P,Q)=P(0)logQ(0)(1P(0))log(1Q(0)) H(P,Q)=-P(0)logQ(0)-(1-P(0))log(1-Q(0))
    用python画出来为
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.linspace(0.01,0.99,101)
Y = np.linspace(0.01,0.99,101)
X,Y = np.meshgrid(X,Y)
Z = -X*np.log2(Y) -(1-X)*np.log2(1-Y)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap='rainbow')
plt.show()

在这里插入图片描述
如果最终输出为的结果是回归问题的一个连续变量,使用平方损失函数更合适;如果最终输出是分类问题的一个离散变量,那么交叉熵损失函数更合适

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章