在上一篇文章强化学习中的无模型预测中,有说过这个无模型强化学习的预测问题,通过TDn-step TD或者MC的方法能够获得值函数,那拿到value之后如何获取policy呢?

  Model-Free Control in Reinforcement Learning

  在model free control中的第一个概念就是on-policyoff-policy,在现实中的很多问题都是这样的,我们得不到environment的白盒模型,我们就需要去与环境互动,获取经验数据,然后基于经验数据进行学习。或者是MDP的内部模型已知,但是状态空间、动作太大了无法对其采样。model free的方法就可以去解决这个问题。

On-and Off-Policy Learning

  • 两类model-free RL

  在model-free这个设定下面有两个概念,一个是on-policy learning一个是off-policy learning

  • On-policy learning

  On policy “Learn on the job” ,意思是说马上要给policy喂进来的数据都是刚刚采出来的数据。

  Learn about policy π\piπ from experience sampled from π\piπ。

  • Off-policy learning

  Off-policy “Look over someone’s shoulder” 当前学习的策略π\piπ的数据从另外一个策略μ\muμ采样出来的。

  Learn about policy π\piπ from experience sampled from another policy μ\muμ。

Model-Free Policy Iteration

  如果我们用state value去更新的话,我们就需要去知道state transition,而基于state-action value的情况就好很多:

  • Greedy policy improvement over V(s)V(s)V(s) requires model of MDP:

πnew(s)=arg max⁡a∈A{R(s,a)+γ∑s′∈SPsa(s′)Vπ(s′)}\pi^{\text{new}}(s) = \argmax_{a \in A} \{ R(s,a)+\gamma \sum_{s^{\prime} \in S} \mathcal{P}_{sa}(s^{\prime})V^{\pi}(s^{\prime})\} πnew(s)=a∈Aargmax​{R(s,a)+γs′∈S∑​Psa​(s′)Vπ(s′)}

  But we don’t know the state transition probability. 如果我们基于state-action value更新的话我们就不需要知道state transition probability。

  • Greedy policy improvement over Q(s,a)Q(s,a)Q(s,a) is model-free

πnew(s)=arg max⁡a∈AQ(s,a)\pi^{new}(s) = \argmax_{a \in A} Q(s,a) πnew(s)=a∈Aargmax​Q(s,a)

  因此计算state-value 和计算state-action value有本质的区别。之后的方法基本上都是基于state-action value的。

Generalized Policy Iteration with Action-Value Function

  在给定某一个policy之后,我们就可以去算QπQ_{\pi}Qπ​。以前的文章马尔可夫决策过程与动态规划算的是state value,这里算的是state-action value。得到这个QQQ之后我们就能够依据πnew(s)=arg max⁡a∈AQ(s,a)\pi^{new}(s) = \argmax_{a \in A} Q(s,a)πnew(s)=a∈Aargmax​Q(s,a)得到我们的策略。

Control Policy

  基于QQQ value 我们具体怎么去做control policy?就是我们具体怎么来 choose action

Example of Greedy Action Selection

  在Greedy Action中每次都去选择state-action value最大的那一个:

πnew(s)=arg max⁡a∈AQ(s,a)\pi^{new}(s) = \argmax_{a \in A} Q(s,a) πnew(s)=a∈Aargmax​Q(s,a)

  但是这里有问题,就是当你采样到了一个动作之后,拿到了reward,你之后就不会去选择探索其它的动作了。

  The policy would be suboptimal if there is no exploration.

ε\varepsilonε-Greedy Policy Exploration

  最简单的办法就是让这个policy有一些随机,或者称之为exploration。于是就变成了:

  • With probability 1−ε1-\varepsilon1−ε, choose the greedy action.
  • With probability ε\varepsilonε, choose an action at random.

  于是在状态sss下选择动作aaa的概率π(a∣s)\pi(a|s)π(a∣s)可表示为如下形式:

π(a∣s)={ϵ/m+1−ϵif a∗=arg⁡max⁡a∈AQ(s,a)ϵ/motherwise \pi(a | s)=\left\{\begin{array}{ll} {\epsilon / m+1-\epsilon} & {\text { if } a^{*}=\arg \max _{a \in A} Q(s, a)} \\ {\epsilon / m} & {\text { otherwise }} \end{array}\right. π(a∣s)={ϵ/m+1−ϵϵ/m​ if a∗=argmaxa∈A​Q(s,a) otherwise ​

ε\varepsilonε-Greedy Policy Improvement

  那ε\varepsilonε-Greedy Policy能不能往前推进我们的state value呢?我们需要去证明一下:

  • Theorem:For any ε\varepsilonε-greedy policy π\piπ ,the ε\varepsilonε-greedy policy π′\pi^{\prime}π′ w.r.t QπQ^{\pi}Qπ is an improvement, i.e. Vπ′(s)≥Vπ(s)V^{\pi^{\prime}}(s) \geq V^{\pi}(s)Vπ′(s)≥Vπ(s)。

Vπ′(s)=Qπ(s,π′(s))=∑a∈Aπ′(a∣s)Qπ(s,a)=ϵm∑a∈AQπ(s,a)+(1−ϵ)max⁡a∈AQπ(s,a)≥ϵm∑a∈AQπ(s,a)+(1−ϵ)∑a∈Aπ(a∣s)−ϵ/m1−ϵQπ(s,a)=∑a∈Aπ(a∣s)Qπ(s,a)=Vπ(s)\begin{aligned} V^{\pi^{\prime}}(s)=Q^{\pi}\left(s, \pi^{\prime}(s)\right) &=\sum_{a \in A} \pi^{\prime}(a | s) Q^{\pi}(s, a) \\ &=\frac{\epsilon}{m} \sum_{a \in A} Q^{\pi}(s, a)+(1-\epsilon) \max _{a \in A} Q^{\pi}(s, a) \\ & \geq \frac{\epsilon}{m} \sum_{a \in A} Q^{\pi}(s, a)+(1-\epsilon) \sum_{a \in A} \frac{\pi(a | s)-\epsilon / m}{1-\epsilon} Q^{\pi}(s, a) \\ &=\sum_{a \in A} \pi(a | s) Q^{\pi}(s, a)=V^{\pi}(s) \end{aligned} Vπ′(s)=Qπ(s,π′(s))​=a∈A∑​π′(a∣s)Qπ(s,a)=mϵ​a∈A∑​Qπ(s,a)+(1−ϵ)a∈Amax​Qπ(s,a)≥mϵ​a∈A∑​Qπ(s,a)+(1−ϵ)a∈A∑​1−ϵπ(a∣s)−ϵ/m​Qπ(s,a)=a∈A∑​π(a∣s)Qπ(s,a)=Vπ(s)​

  其中mmm表示actions \text { actions } actions 个数,这里其实就是在证明,用π′\pi^{\prime}π′得到的state value与之前的π\piπ得到的state value是有所改进的。上述公式中推导比较难懂的就是∑a∈Aπ(a∣s)−ϵ/m1−ϵ\sum_{a \in A} \frac{\pi(a | s)-\epsilon / m}{1-\epsilon}∑a∈A​1−ϵπ(a∣s)−ϵ/m​,这一步了。这里把:

π(a∣s)={ϵ/m+1−ϵif a∗=arg⁡max⁡a∈AQ(s,a)ϵ/motherwise \pi(a | s)=\left\{\begin{array}{ll} {\epsilon / m+1-\epsilon} & {\text { if } a^{*}=\arg \max _{a \in A} Q(s, a)} \\ {\epsilon / m} & {\text { otherwise }} \end{array}\right. π(a∣s)={ϵ/m+1−ϵϵ/m​ if a∗=argmaxa∈A​Q(s,a) otherwise ​

  带入到∑a∈Aπ(a∣s)−ϵ/m1−ϵ\sum_{a \in A} \frac{\pi(a | s)-\epsilon / m}{1-\epsilon}∑a∈A​1−ϵπ(a∣s)−ϵ/m​就会发现,其实这也是个概率,一旦它是个概率,那么一定会小于等于max⁡a∈AQπ(s,a)\max _{a \in A} Q^{\pi}(s, a)maxa∈A​Qπ(s,a)。这里也就证明了其实 ε\varepsilonε-greedy 是做到了policy improvement 这一步。

Monte-Carlo Control

  一种比较经典的Control方法就是MC Control

  其算法也是大体分为两步Policy evaluationPolicy improvement

  • Policy evaluation: Monte-Carlo policy evaluation,Q≈QπQ \approx Q^{\pi}Q≈Qπ。
  • Policy improvement: ε\varepsilonε-greedy policy improvement。

MC Control vs. TD Control

  MC Control中看一整个episode,然后estimate value然后做更新,TD Control只是看一小个片段进行更新。

  • Temporal-difference (TD) learning has several advantages over Monte-Carlo (MC) :Lower varianceOnlineIncomplete sequences

On-Policy SARSA

  其算法流程主要分为以下4步:

  1. 在状态 sss, 采取action aaa ;
  2. 环境反馈 reward rrr ;
  3. 转移到下一个state s′s^{\prime}s′;
  4. state s′s^{\prime}s′, 采取 action a′a^{\prime}a′。

  用SARSA更新action-value functions

Q(s,a)←Q(s,a)+α(r+γQ(s′,a′)−Q(s,a))Q(s,a) \leftarrow Q(s,a) + \alpha(r + \gamma Q(s^{\prime},a^{\prime})-Q(s,a)) Q(s,a)←Q(s,a)+α(r+γQ(s′,a′)−Q(s,a))

  SARSA算法的整个流程如下所示:

  上述sarsa算法需要注意state-action中的‘AAA’都是基于current policy采样出来的。SARSA是一种非常典型的On-Policy方法,但是Off-Policy的算法往往更重要。

Off-Policy学习方式

  我们能否从 policy μ(a∣s)\mu(a|s)μ(a∣s) 采出来的数据 {s1,a1,r2,s2,a2,…,sT}∼μ\left\{s_{1}, a_{1}, r_{2}, s_{2}, a_{2}, \dots, s_{T}\right\} \sim \mu{s1​,a1​,r2​,s2​,a2​,…,sT​}∼μ 去学习策略 π(a∣s)\pi(a|s)π(a∣s) ?当μ(a∣s)=π(a∣s)\mu(a|s) = \pi(a|s)μ(a∣s)=π(a∣s)这个算法就是on policy的,因此off-policy的算法都可以做on-policy,其兼容性更强一点。

为什么我们需要off-policy的学习方式?

  其实主要就是在数据利用上面会方便很多,on-policy的方法需要当前智能体去采样,然后学习一次之后智能体的策略就发生了改变,那这些数据就无法使用了。然而在现实生活中我们能够拿到很多很好的数据,是其他智能体所产生了,为了很好地去利用这些数据,我们需要off-poicy的采样方式。

  • Learn from observing humans or other agents

  比如在自动驾驶中,我们可以先学习一点人类经验数据,相当于做个预训练。

  • Re-use experience generated from old policies

  虽然是自己之前的数据,但是由于现在的参数和之前的参数不一样,所以off policy的方法可以重复使用之前的训练数据。

  强化学习需要的data是非常大的,因为它有三个自由度的分布函数R(s)R(s)R(s)、Psa(s′)P_{sa}(s^{\prime})Psa​(s′)、π(a∣s)\pi(a|s)π(a∣s)。想要从数据中把这些分布关系给学到,就需要大量地去采样这些样本,然后通过强化学习算法学到其中的关联。

  因此使用之前的data就比较重要了。

  还有一点就是商业上面就没办法使用当前采样出来的数据直接进行训练。比如像淘宝用强化学习做的推荐系统。

  • Learn about optimal policy while following exploratory policy

  • Learn about multiple policies while following one policy

Importance Sampling

  那off-policy怎么来做off policylearning呢?通常的做法都是引入Importance SamplingQ值的更新可表达为以下形式:

Q(s,a)←Q(s,a)+α(r+γQ(s′,a)−Q(s,a))Q(s,a) \leftarrow Q(s,a) + \alpha(r + \gamma Q(s^{\prime},a)-Q(s,a)) Q(s,a)←Q(s,a)+α(r+γQ(s′,a)−Q(s,a))

  我们是拿后面采样出来的Q(s′,a)Q(s^{\prime},a)Q(s′,a),去更新前面采样所得到的Q(s,a)Q(s,a)Q(s,a),前面采样策略与后面采样策略不一样,那肯定就会有些问题。这个时候重要性采样就非常重要了。

  Importance Sampling can estimate the expectation of a different distribution

Ex∼p[f(x)]=∫xp(x)f(x)dx=∫xq(x)p(x)q(x)f(x)dx=Ex∼q[p(x)q(x)f(x)]\begin{aligned} \mathbb{E}_{x \sim p}[f(x)] &=\int_{x} p(x) f(x) d x \\ &=\int_{x} q(x) \frac{p(x)}{q(x)} f(x) d x \\ &=\mathbb{E}_{x \sim q}\left[\frac{p(x)}{q(x)} f(x)\right] \end{aligned} Ex∼p​[f(x)]​=∫x​p(x)f(x)dx=∫x​q(x)q(x)p(x)​f(x)dx=Ex∼q​[q(x)p(x)​f(x)]​

  Re-weight each instance by β(x)=p(x)q(x)\beta(x) = \frac{p(x)}{q(x)}β(x)=q(x)p(x)​ 。

  这里把从分布ppp中采样的数据求期望,转变成了从分布qqq中去采样数据求期望。这里只是把每个数据的权重做了些许改变,因此在Importance Sampling里面我们往往也会去计算β(x)=p(x)q(x)\beta(x) = \frac{p(x)}{q(x)}β(x)=q(x)p(x)​,甚至有机器学习专门去学习这个β(x)\beta(x)β(x),然后去做一个比较好的Importance Sampling

  在机器学习里面,我们经常会优化这样一个式子:

min⁡θ1∣D∣∑x∈DL(y,fθ(x))=Ex∼p(x)[L(y,fθ(x))]\min _{\theta} \frac{1}{|D|} \sum_{x \in D} \mathcal{L}\left(y, f_{\theta}(x)\right)=\mathbb{E}_{x \sim p(x)}\left[\mathcal{L}\left(y, f_{\theta}(x)\right)\right] θmin​∣D∣1​x∈D∑​L(y,fθ​(x))=Ex∼p(x)​[L(y,fθ​(x))]

  但很多时候我们拿到的数据并不满足p(x)p(x)p(x)分布,而满足q(x)q(x)q(x)分布,因此做个重要性采样就很好地解决这个问题。

Importance Sampling for Off-Policy Monte-Carlo

  通过重要性采样我们仍然需要去计算值函数。比如我们如何使用策略μ\muμ所获得的return去评估策略π\piπ? 依据Importance Sampling我们可以weight return GtG_{t}Gt​,对于一个episode

{s1,a1,r2,s2,a2,…,sT}∼μ\left\{s_{1}, a_{1}, r_{2}, s_{2}, a_{2}, \dots, s_{T}\right\} \sim \mu {s1​,a1​,r2​,s2​,a2​,…,sT​}∼μ

  Multiply importance ratio along with episode:

Gtπ/μ=π(at∣st)μ(at∣st)π(at+1∣st+1)μ(at+1∣st+1)⋯π(aT∣sT)μ(aT∣sT)GtG_{t}^{\pi / \mu}=\frac{\pi\left(a_{t} | s_{t}\right)}{\mu\left(a_{t} | s_{t}\right)} \frac{\pi\left(a_{t+1} | s_{t+1}\right)}{\mu\left(a_{t+1} | s_{t+1}\right)} \cdots \frac{\pi\left(a_{T} | s_{T}\right)}{\mu\left(a_{T} | s_{T}\right)} G_{t} Gtπ/μ​=μ(at​∣st​)π(at​∣st​)​μ(at+1​∣st+1​)π(at+1​∣st+1​)​⋯μ(aT​∣sT​)π(aT​∣sT​)​Gt​

  表示在策略π\piπ下会以更多或者更小的概率去看到GtG_{t}Gt​,然后再以这个新的GtG_{t}Gt​去更新算法:

V(st)←V(st)+α(Gtπ/μ−V(st))V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(G_{t}^{\pi / \mu}-V\left(s_{t}\right)\right) V(st​)←V(st​)+α(Gtπ/μ​−V(st​))

  当μ\muμ为0的时候上述公式处理起来就会比较困难,但是往往这种情况出现地比较少,通常不给予考虑。重要性采样所带来的问题就是多引入了一个变量,因此其方差会增加。TD算法相比较MC算法会减少方差,因此很自然的一个想法是:可以将TD算法引入Importance Sampling来减少方差。

Importance Sampling for Off-Policy TD

  将 Importance Sampling用在TD上面会更容易一点,因为TD算法只走一步。因此只有TD target r+γV(s′)r + \gamma V(s^{\prime})r+γV(s′)是在做importance sampling,so only need a single importance sampling correction :

V(st)←V(st)+α(π(at∣st)μ(at∣st)(rt+1+γV(st+1))−V(st))V\left(s_{t}\right) \leftarrow V\left(s_{t}\right)+\alpha\left(\frac{\pi\left(a_{t} | s_{t}\right)}{\mu\left(a_{t} | s_{t}\right)}\left(r_{t+1}+\gamma V\left(s_{t+1}\right)\right)-V\left(s_{t}\right)\right) V(st​)←V(st​)+α(μ(at​∣st​)π(at​∣st​)​(rt+1​+γV(st+1​))−V(st​))

  这种方式相比较于Monte-Carlo importance sampling方差会大大降低,因为此时需要在a single step上保持similar

  上述importance sampling过程是一个unbias过程,但是variance可能特别大,因为μ(at∣st)\mu\left(a_{t} | s_{t}\right)μ(at​∣st​)可能特别小,一除就变大了。

  因此在做off-policy的时候,我们很少会用传统的importance的办法,它虽然可以做,但是不做改进的话还是不太好。

Q-Learning

  Q-Learning focusstate-action value上面,这一点具有特别深远的意义。我们是在更新Q(s,a)Q(s,a)Q(s,a) 这样一个state-action value function,因为如果我们更新V(s)V(s)V(s)的话,它上来就需要策略,Vπ(s)=∑aπ(a∣s)(R+Vπ(s′))V^{\pi}(s) = \sum_{a}\pi(a|s)(R+V^{\pi}(s^{\prime}))Vπ(s)=∑a​π(a∣s)(R+Vπ(s′))。而如果更新的是Q(s,a)Q(s,a)Q(s,a),其实take这个actionpolicy没有关系,无论policy是什么,我都会去更新Q(s,a)Q(s,a)Q(s,a),也就是statests_{t}st​和ata_{t}at​和policy是解耦合关系,之后环境给及时奖励 rrr 和下一个状态st+1s_{t+1}st+1​,这都是和环境有关的东西,我可以采样,但跟policy没关系,就不会像Importance sampling那样还需要除一下。之后的at+1a_{t+1}at+1​不一样可能会产生点区别,前面的 ata_{t}at​ 是用 π\piπ 采样出来的,还是μ\muμ采样出来的都没有关系。

  上面说了这么多,其实就是需要注意:No importance sampling is required (why?)

Q(st,at)←Q(st,at)+α(rt+1+γQ(st+1,a′)−Q(st,at))Q\left(s_{t}, a_{t}\right) \leftarrow Q\left(s_{t}, a_{t}\right)+\alpha\left(r_{t+1}+\gamma Q\left(s_{t+1}, a^{\prime}\right)-Q\left(s_{t}, a_{t}\right)\right) Q(st​,at​)←Q(st​,at​)+α(rt+1​+γQ(st+1​,a′)−Q(st​,at​))

  • The target policy π\piπ is greedy w.r.t. Q(s,a)Q(s,a)Q(s,a):

π(st+1)=arg max⁡a′Q(st+1,a′)\pi(s_{t+1}) = \argmax_{a^{\prime}}Q(s_{t+1},a^{\prime}) π(st+1​)=a′argmax​Q(st+1​,a′)

  • The behavior policy μ\muμ is e.g. ε\varepsilonε-greedy policy w.r.t. Q(s,a)Q(s,a)Q(s,a):

rt+1+γQ(st+1,a′)=rt+1+γQ(st+1,arg max⁡a′Q(st+1,a′))=rt+1+γmax⁡a′Q(St+1,a′)\begin{aligned} r_{t+1} + \gamma Q(s_{t+1},a^{\prime}) &= r_{t+1} + \gamma Q(s_{t+1},\argmax_{a^{\prime}}Q(s_{t+1},a^{\prime}))\\ & = r_{t+1} + \gamma \max_{a^{\prime}}Q(S_{t+1},a^{\prime}) \end{aligned} rt+1​+γQ(st+1​,a′)​=rt+1​+γQ(st+1​,a′argmax​Q(st+1​,a′))=rt+1​+γa′max​Q(St+1​,a′)​

  因此Q-learning的更新算法如下所示:

Q(st,at)←Q(st,at)+α(rt+1+γmax⁡a′Q(st+1,a′)−Q(st,at))Q\left(s_{t}, a_{t}\right) \leftarrow Q\left(s_{t}, a_{t}\right)+\alpha\left(r_{t+1}+\gamma \max_{a^{\prime}}Q\left(s_{t+1}, a^{\prime}\right)-Q\left(s_{t}, a_{t}\right)\right) Q(st​,at​)←Q(st​,at​)+α(rt+1​+γa′max​Q(st+1​,a′)−Q(st​,at​))

为什么 Q-learning 会被称作一种off-policy control方法?

  • Learning from SARS generated by another policy μ\muμ
  • The first action a and the corresponding reward rare from μ\muμ
  • The next action a′a^{\prime}a′ is picked by the target policy π(st+1)=arg max⁡a′Q(st+1,a′)\pi(s_{t+1}) = \argmax_{a^{\prime}}Q(s_{t+1},a^{\prime})π(st+1​)=a′argmax​Q(st+1​,a′)。

  上述这么多就是为什么q-learningoff policy却不用importance sampling.

我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!

手把手教你强化学习 (七) 强化学习中的无模型控制相关推荐

  1. 强化学习4——无模型控制model-free control (On-Policy learning:Sarsa和Off-policy learning:Q-learning)

    文章目录 前言 无模型控制 问题 思路 方法 On-Policy learning MC Sarsa Off-policy learning Q-learning On-Policy learning ...

  2. 报名 | NVIDIA线下交流会:手把手教你搭建TensorFlow Caffe深度学习服务器

    7月21日(周六)下午14:30,量子位与NVIDIA英伟达开发者社区联合举办线下交流会,拥有丰富一线开发经验的NVIDIA开发者社区经理Ken He,将手把手教你搭建TensorFlow & ...

  3. 干货:手把手教你在音频分类DCASE2017比赛中夺冠

    这是一篇旧闻了. 2017-09-23 00:00无人驾驶 最新消息:来自英国萨里大学的团队徐勇博士等夺得DCASE2017 challenge比赛冠军.战胜来自CMU, New York Unive ...

  4. 手把手教你把代码丢入github 中

    手把手教你把代码丢入github 中 作为一个小运维一步步教你们怎么把代码放入到github 中 首先呢我们下载一个git的客户端 https://git-scm.com/downloads/  下载 ...

  5. 基于深度强化学习的机器人运动控制研究进展 | 无模型强化学习 | 元学习

    1.基于深度强化学习的机器人运动控制研究进展 1.1 深度强化学习 1.1.1 强化学习简介: 强化学习(Reinforcement Learning, RL)利用试错机制与环境进行交互,旨在通过最大 ...

  6. 手把手教你从零搭建深度学习项目(附链接)

    简介: 在学习了有关深度学习的理论之后,很多人都会有兴趣尝试构建一个属于自己的项目.本文将会从第一步开始,告诉你如何解决项目开发中会遇到的各类问题. 本文由六大部分组成,涵盖深度学习 ( DL ) 项 ...

  7. 手把手教你学51单片机-如何学习单片机

    大多数大学生之所以最后变的平庸,不是因为脑子多么笨,也不是全怪自己贪玩不上进,只是没有一个好的领路人,许多学校可能挂着导师的名头,但是多数是挂羊头卖狗肉或者是干脆不管.最后等大学生毕业之后,那些所谓的 ...

  8. 手把手教你从零搭建深度学习项目(可下载PDF版)

    源 | 机器之心   作者 | Jonathan Hui 点我调转公号推荐 下载方式:后台回复 20180531 在学习了有关深度学习的理论之后,很多人都会有兴趣尝试构建一个属于自己的项目.本文将会从 ...

  9. python--Flask学习(七)--利用Flask中的werkzeug.security模块加密

    若将密码以明文的方式保存在数据库中是不安全的,可以使用一些如MD5的方式加密,但像这种加密方式也是存在安全隐患的,这里我们来学习一下利用Flask中的werkzeug.security模块加密. 1. ...

  10. 手把手教你用Python求均值、中值和众数

    导读:数据科学入门:集中趋势度量--均值.中值和众数. 作者:保罗·戴特尔(Paul Deitel).哈维·戴特尔(Harvey Deitel) 来源:大数据DT(ID:hzdashuju) 本文我们 ...

最新文章

  1. matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)
  2. 用牛顿迭代法求浮点数的平方根
  3. BCB key事件中判断Shift、Alt、Ctrl状态
  4. 并发编程-06线程安全性之可见性 (synchronized + volatile)
  5. android -自定义view
  6. java h5在线音频_用h5 audio播放mp3 播放一分钟就报错了
  7. 获取python包的路径
  8. 最懂男人心的内裤,戳100个洞透气,超舒服
  9. hdu 1241Oil Deposits(BFS)
  10. 信息学奥赛一本通(1328:【例7.7】光荣的梦想)
  11. MySQL如何安装离线_mysql8.0.2离线安装配置方法图文教程
  12. (c语言)近似计算π
  13. 怎么把git代码导入到本地仓库_git在本地仓库添加了一个tag,如何把这个tag同步到远程仓库?...
  14. js顺序加载与并行加载
  15. 计算24点有什么窍门或技巧吗?
  16. 综合评价与决策方法02——模糊综合评判法
  17. 苹果logo_苹果LOGO起拍价2万美元?
  18. MSP430 单片机 读取 程序 LM75A LM75 温度传感器
  19. 姿态识别+校准|视觉技术新突破
  20. 如何安装R以及RStudio?打开RStudio页面告诉你没安装R或者出现页面空白问题

热门文章

  1. (转)C++类所占内存大小计算
  2. Eclipse RCP中Viewer交互的三种方式/Make your Eclipse applications richer with view linking
  3. OSI参考模型(2)
  4. 游戏开发之测试篇2(C++)
  5. C语言关于一个作用域内的局部变量反复申请同一个栈区内存空间的事儿
  6. Kubernetes详解(十四)——Pod对象生命周期
  7. Ansible详解(十四)——Ansible Role实战
  8. Leetcode 刷题笔记(二十六) ——动态规划篇之经典问题:打家劫舍
  9. Dubbo扩展点机制分析(二)
  10. accumulate