【强化学习-蘑菇书-3】马尔可夫性质,马尔可夫链,马尔可夫过程,马尔可夫奖励过程,如何计算马尔可夫奖励过程里面的价值
欢迎去各大电商平台选购纸质版蘑菇书《Easy RL:强化学习教程》
文章是根据 蘑菇书EasyRL ,网络查找资料和汇总,以及新版本的python编写的可运行代码和示例,包含了一些自己对书内容的简单理解
一、 马尔可夫性质
在随机过程中,马尔可夫性质(Markov property)是指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态。
举个例子:
明天的天气(是否下大雨)仅与今天的天气(是否刮大风)有关,而与前天及以前的天气无关
我今天醒来花呗剩余额度只和我昨天的额度及昨天的消费情况有关,跟历史数据没有关系。
The future is independent of the past given the present
未来独立于过去,只基于当下。
过去所有的信息都已经被保存到了现在的状态,基于现在就可以预测未来。
如果某一个过程满足马尔可夫性质,那么未来的转移与过去的是独立的,它只取决于现在。马尔可夫性质是所有马尔可夫过程的基础。
二、随机过程 :原文地址:https://zhuanlan.zhihu.com/p/448575579
马尔可夫链是随机过程 这门课程中的一部分,先来简单了解一下。
随机过程就是使用统计模型一些事物的过程进行预测和处理 ,比如股价预测通过今天股票的涨跌,却预测明天后天股票的涨跌;天气预报通过今天是否下雨,预测明天后天是否下雨。
这些过程都是可以通过数学公式进行量化计算的。通过下雨、股票涨跌的概率,用公式就可以推导出来 N 天后的状况。
天气预报通过今天是否下雨,预测明天后天是否下雨(的概率):
股价预测通过今天股票的涨跌,却预测明天后天股票的涨跌(的概率);
这个马尔可夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。
这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵P某一位置 P ( i , j ) P(i,j) P(i,j)的值为 P ( i ∣ j ) P(i|j) P(i∣j) ,即从状态i
转化到状态j
的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2。
这样我们得到了马尔科夫链模型的状态转移矩阵为:
P = ( 0.9 0.075 0.025 0.15 0.8 0.05 0.25 0.25 0.5 ) \begin{equation} %开始数学环境 P=\left( %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 0.9 & 0.075 & 0.025\\ %第一行元素 0.15 & 0.8 & 0.05\\ %第二行元素 0.25 & 0.25 & 0.5\\ %第三行元素 \end{array} \right) %右括号 \end{equation} P= 0.90.150.250.0750.80.250.0250.050.5
三、马尔科夫链
马尔可夫过程是一组具有马尔可夫性质的随机变量序列 s1,s2……,其中下一个时刻的状态s(t+1)只取决于s(t),也就是上一时刻的状态(可以理解成:过去所有的信息都已经被保存到了现在的状态,基于现在就可以预测未来。)
从当前 s(t), 转移到 s(t+1),它是直接就等于它之前所有的状态转移到 s(t+1)。
离散时间的马尔可夫过程也称为马尔可夫链(Markov chain)
马尔可夫链是最简单的马尔可夫过程,其状态是有限的,
例如,下图里,有4个状态,这4个状态在 S1,S2,S3,S4之间互相转移
S1有0.1的概率留在S1, 0.2的概率去S2, 0.7的概率去S4
S2只能转移到S1
S3只能转移到S2
S4有0.5概率留在S4, 0.2概率转移到S3,0.3概率转移到S2
我们可以用状态转移矩阵(state transition matrix)P来描述状态转移的关系,
也就是从
S1->S1,S1->S2,S1->S3,S1->S4
S2->S1,S2->S2,S2->S3,S2->S4
S3->S1,S3->S2,S3->S3,S3->S4
S4->S1,S4->S2,S4->S3,S4->S4
带入图中的例子得到状态转移矩阵
S1->S1(0.1
),S1->S2(0.2
),S1->S3(0.0
),S1->S4(0.7
)
S2->S1(1.0
),S2->S2(0.0
),S2->S3(0.0
),S2->S4(0.0
)
S3->S1(0.0
),S3->S2(1.0
),S3->S3(0.0
),S3->S4(0.0
)
S4->S1(0.0
),S4->S2(0.3
),S4->S3(0.2
),S4->S4(0.5
)
它的每一行描述的是从一个节点到达所有其他节点
的概率。
四、马尔可夫过程的例子
上图所示为一个马尔可夫过程的例子,这里有七个状态。
比如从 s 1 s_1 s1 开始,它有0.4的概率到 s 2 s_2 s2 ,有 0.6 的概率留在当前的状态。
s 2 s_2 s2 有 0.4 的概率到 s 1 s_1 s1,有 0.4 的概率到 s 3 s_3 s3 ,另外有 0.2 的概率留在当前状态。
所以给定状态转移的马尔可夫链后,我们可以对这个链进行采样,这样就会得到一串轨迹。
例如,假设我们从状态 s 3 s_3 s3 开始,可以得到3个轨迹:
- s 3 , s 4 , s 5 , s 6 , s 6 s_3, s_4, s_5, s_6, s_6 s3,s4,s5,s6,s6;( s 6 还可以去 s 7 , s 7 又可以回到 s 6 ,有很多的路径 s_6还可以去s_7,s_7又可以回到s_6,有很多的路径 s6还可以去s7,s7又可以回到s6,有很多的路径)
- s 3 , s 2 , s 3 , s 2 , s 1 s_3, s_2, s_3, s_2, s_1 s3,s2,s3,s2,s1;
- s 3 , s 4 , s 4 , s 5 , s 5 s_3, s_4, s_4, s_5, s_5 s3,s4,s4,s5,s5。
这里只是列出了其中一些路径!!
通过对状态的采样,我们可以生成很多这样的轨迹。
例子2:
上图中有 A 和 B 两个状态,A 到 A 的概率是 0.3,A 到 B 的概率是 0.7;B 到 B 的概率是 0.1,B 到 A 的概率是 0.9。
初始状态在 A,如果我们求 2 次运动后状态还在 A 的概率是多少?非常简单:
P = A → A → A + A → B → A P=A\rightarrow A\rightarrow A +A\rightarrow B\rightarrow A P=A→A→A+A→B→A
其中
A → A → A = 0.3 ∗ 0.3 A\rightarrow A\rightarrow A=0.3*0.3 A→A→A=0.3∗0.3
A → B → A = 0.7 ∗ 0.9 A\rightarrow B\rightarrow A=0.7*0.9 A→B→A=0.7∗0.9
所以
P = 0.3 ∗ 0.3 + 0.7 ∗ 0.9 = 0.72 P =0.3*0.3+0.7*0.9=0.72 P=0.3∗0.3+0.7∗0.9=0.72
如果求 2 次运动后的状态概率分别是多少?初始状态和终止状态未知时怎么办呢?
这是就要引入转移概率矩阵 ,可以非常直观的描述所有的概率。
有了状态矩阵,我们可以轻松得出以下结论:
初始状态 A,2 次运动后状态为 A 的概率是 0.72;
初始状态 A,2 次运动后状态为 B 的概率是 0.28;
初始状态 B,2 次运动后状态为 A 的概率是 0.36;
初始状态 B,2 次运动后状态为 B 的概率是 0.64;
有了概率矩阵,即便求运动 n 次后的各种概率,也能非常方便求出。
状态转移矩阵的稳定性
状态转移矩阵有一个非常重要的特性,经过一定有限次数序列的转换,最终一定可以得到一个稳定的概率分布 ,且与初始状态概率分布无关。
更详细的信息在:
什么是马尔可夫链?:https://zhuanlan.zhihu.com/p/38764470
以上面的那个股市的例子来说:
假设我们当前股市的概率分布为: [ 0.3 , 0.4 , 0.3 ] [0.3,0.4,0.3] [0.3,0.4,0.3] ,即30%概率的牛市,40%概率的熊盘与30%的横盘。然后这个状态作为序列概率分布的初始状态 t 0 t0 t0,将其带入这个状态转移矩阵计算 t 1 , t 2 , t 3 … … t1,t2,t3…… t1,t2,t3…… 的状态。代码如下:
import numpy as np
matrix = np.matrix([[0.9, 0.075, 0.025],[0.15, 0.8, 0.05],[0.25, 0.25, 0.5]], dtype=float)
vector1 = np.matrix([[0.3, 0.4, 0.3]], dtype=float)for i in range(100):vector1 = vector1 * matrixprint('Courrent round: {}'.format(i+1))print(vector1)
可以发现,从第60轮开始,我们的状态概率分布就不变了,一直保持
,即62.5%的牛市,31.25%的熊市与6.25%的横盘。
那么这个是巧合吗?
我们现在换一个初始概率分布试一试,现在我们用 [ 0.7 , 0.1 , 0.2 ] [0.7,0.1,0.2] [0.7,0.1,0.2] 作为初始概率分布,然后这个状态作为序列概率分布的初始状态 t 0 t0 t0,将其带入这个状态转移矩阵计算 t 1 , t 2 , t 3 … … t1,t2,t3…… t1,t2,t3…… 的状态。代码如下:
import numpy as np
matrix = np.matrix([[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]], dtype=float)
vector1 = np.matrix([[0.7,0.1,0.2]], dtype=float)for i in range(100):vector1 = vector1*matrixprint('Current round: {}'.format(i+1))print(vector1)
可以看出,尽管这次我们采用了不同初始概率分布,最终状态的概率分布趋于同一个稳定的概率分布
也就是说我们的马尔可夫链模型的状态转移矩阵收敛到的稳定概率分布与我们的初始状态概率分布无关。
也就是说,如果我们得到了这个稳定概率分布对应的马尔可夫链模型的状态转移矩阵,则我们可以用任意的概率分布样本开始,带入马尔可夫链模型的状态转移矩阵,这样经过一些序列的转换,最终就可以得到符合对应稳定概率分布的样本。
这个性质不光对我们上面的状态转移矩阵有效,对于绝大多数的其他的马尔可夫链模型的状态转移矩阵也有效。同时不光是离散状态,连续状态时也成立。
五、马尔可夫奖励过程
1)非周期的马尔可夫链:
这个主要是指马尔可夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔可夫链一般都是非周期性的。
用数学方式表述则是:对于任意某一状态 i i i ,d为集合 n ∣ n ≥ 1 , P i i n > 0 n|n\geq1,P^n_{ii}>0 n∣n≥1,Piin>0 的最大公约数,如果 d = 1 d=1 d=1,则该状态为非周期的;
2)任何两个状态是连通的:
指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况;
3)马尔可夫链的状态数可以是有限的,也可以是无限的。
因此可以用于连续概率分布和离散概率分布;
4) π \pi π 通常称为马尔可夫链的平稳分布。
马尔可夫奖励过程(Markov reward process, MRP)是马尔可夫链加上奖励函数。在马尔可夫奖励过程中,状态转移矩阵和状态都与马尔可夫链一样,只是多了奖励函数(reward function)。奖励函数 R R R 是一个期望,表示当我们到达某一个状态的时候,可以获得多大的奖励。这里另外定义了折扣因子 γ \gamma γ 。
折扣因子有以下的一些作用:
- 第一,有些马尔可夫过程是带环的,它并不会终结,我们想避免无穷的奖励。
- 第二,我们并不能建立完美的模拟环境的模型,我们对未来的评估不一定是准确的,我们不一定完全信任模型,因为这种不确定性,所以我们对未来的评估增加一个折扣。我们想把这个不确定性表示出来,希望尽可能快地得到奖励,而不是在未来某一个点得到奖励。
- 第三,如果奖励是有实际价值的,我们可能更希望立刻就得到奖励,而不是后面再得到奖励(现在的钱比以后的钱更有价值)。
- 第四:最后,我们也更想得到即时奖励。有些时候可以把折扣因子设为 0( γ = 0 \gamma=0 γ=0),我们就只关注当前的奖励。我们也可以把折扣因子设为 1( γ = 1 \gamma=1 γ=1),对未来的奖励并没有打折扣,未来获得的奖励与当前获得的奖励是一样的。折扣因子可以作为强化学习智能体的一个超参数(hyperparameter)来进行调整,通过调整折扣因子,我们可以得到不同动作的智能体。
六、如何计算马尔可夫奖励过程里面的价值
- 范围:范围(horizon) 是指一个回合的长度(每个回合最大的时间步数),它是由有限个步数决定的,例如在吃豆人里面,我们走XX步能吃到XX个豆子,这个步子不是无穷的,我们需要定义一个步数,决定吃豆人最多能走多少步。
- 回报:**回报(return)**可以定义为奖励的逐步叠加,假设时刻 t t t后的奖励序列为 r t + 1 , r t + 2 , r t + 3 , ⋯ r_{t+1},r_{t+2},r_{t+3},\cdots rt+1,rt+2,rt+3,⋯,则回报为
G t = r t + 1 + γ r t + 2 + γ 2 r t + 3 + γ 3 r t + 4 + … + γ T − t − 1 r T G_{t}=r_{t+1}+\gamma r_{t+2}+\gamma^{2} r_{t+3}+\gamma^{3} r_{t+4}+\ldots+\gamma^{T-t-1} r_{T} Gt=rt+1+γrt+2+γ2rt+3+γ3rt+4+…+γT−t−1rT
其中, T T T是最终时刻, γ \gamma γ 是折扣因子,越往后得到的奖励,折扣越多。这说明我们更希望得到现有的奖励,对未来的奖励要打折扣。
当我们有了回报之后,就可以定义状态的价值了,就是状态价值函数(state-value function)。对于马尔可夫奖励过程,状态价值函数被定义成回报的期望,即
V t ( s ) = E [ G t ∣ s t = s ] = E [ r t + 1 + γ r t + 2 + γ 2 r t + 3 + … + γ T − t − 1 r T ∣ s t = s ] \begin{aligned} V^{t}(s) &=\mathbb{E}\left[G_{t} \mid s_{t}=s\right] \\ &=\mathbb{E}\left[r_{t+1}+\gamma r_{t+2}+\gamma^{2} r_{t+3}+\ldots+\gamma^{T-t-1} r_{T} \mid s_{t}=s\right] \end{aligned} Vt(s)=E[Gt∣st=s]=E[rt+1+γrt+2+γ2rt+3+…+γT−t−1rT∣st=s]
其中, G t G_t Gt 是之前定义的折扣回报(discounted return)。我们对 G t G_t Gt取了一个期望,期望就是从这个状态开始,我们可能获得多大的价值。所以期望也可以看成未来可能获得奖励的当前价值的表现,就是当我们进入某一个状态后,我们现在有多大的价值。
马尔可夫奖励过程
马尔可夫奖励过程依旧是状态转移,其奖励函数可以定义为:
智能体进入第一个状态 s 1 s_1 s1 的时候会得到 5 的奖励,
进入第七个状态 s 7 s_7 s7 的时候会得到 10 的奖励,
进入其他状态都没有奖励。
我们可以用向量来表示奖励函数,即 R = [ 5 , 0 , 0 , 0 , 0 , 0 , 10 ] \boldsymbol{R}=[5,0,0,0,0,0,10] R=[5,0,0,0,0,0,10]
我们对 4 步的回合( γ = 0.5 \gamma=0.5 γ=0.5)来采样回报 G G G。
(1) s 4 , s 5 , s 6 , s 7 的回报 : 0 + 0.5 × 0 + 0.25 × 0 + 0.125 × 10 = 1.25 s_{4}, s_{5}, s_{6}, s_{7} \text{的回报}: 0+0.5\times 0+0.25 \times 0+ 0.125\times 10=1.25 s4,s5,s6,s7的回报:0+0.5×0+0.25×0+0.125×10=1.25
(2) s 4 , s 3 , s 2 , s 1 的回报 : 0 + 0.5 × 0 + 0.25 × 0 + 0.125 × 5 = 0.625 s_{4}, s_{3}, s_{2}, s_{1} \text{的回报}: 0+0.5 \times 0+0.25\times 0+0.125 \times 5=0.625 s4,s3,s2,s1的回报:0+0.5×0+0.25×0+0.125×5=0.625
(3) s 4 , s 5 , s 6 , s 6 的回报 : 0 + 0.5 × 0 + 0.25 × 0 + 0.125 × 0 = 0 s_{4}, s_{5}, s_{6}, s_{6} \text{的回报}: 0+0.5\times 0 +0.25 \times 0+0.125 \times 0=0 s4,s5,s6,s6的回报:0+0.5×0+0.25×0+0.125×0=0
我们现在可以计算每一个轨迹得到的奖励,
比如我们对轨迹 s 4 , s 5 , s 6 , s 7 s_4,s_5,s_6,s_7 s4,s5,s6,s7 的奖励进行计算,这里折扣因子是 0.5。在 s 4 s_4 s4 的时候,奖励为0。下一个状态 s 5 s_5 s5 的时候,因为我们已经到了下一步,所以要把 s 5 s_5 s5 进行折扣, s 5 s_5 s5 的奖励也是0。然后是 s 6 s_6 s6,奖励也是0,折扣因子应该是0.25。到达 s 7 s_7 s7 后,我们获得了一个奖励,但是因为状态 s 7 s_7 s7 的奖励是未来才获得的奖励,所以我们要对之进行3次折扣。最终这个轨迹的回报就是 1.25。类似地,我们可以得到其他轨迹的回报。
这里就引出了一个问题,当我们有了一些轨迹的实际回报时,怎么计算它的价值函数呢?
比如我们想知道 s 4 s_4 s4 的价值,即当我们进入 s 4 s_4 s4 后,它的价值到底如何?
一个可行的做法就是我们可以生成很多轨迹,然后把轨迹都叠加起来。
比如我们可以从 s 4 s_4 s4 开始,采样生成很多轨迹,把这些轨迹的回报都计算出来,然后将其取平均值作为我们进入 s 4 s_4 s4 的价值。这其实是一种计算价值函数的办法,也就是通过蒙特卡洛(Monte Carlo,MC)采样的方法计算 s 4 s_4 s4 的价值。
相关文章:
【强化学习-蘑菇书-3】马尔可夫性质,马尔可夫链,马尔可夫过程,马尔可夫奖励过程,如何计算马尔可夫奖励过程里面的价值
欢迎去各大电商平台选购纸质版蘑菇书《Easy RL:强化学习教程》 文章是根据 蘑菇书EasyRL ,网络查找资料和汇总,以及新版本的python编写的可运行代码和示例,包含了一些自己对书内容的简单理解 一、 马尔可夫性质 在随机过程中&a…...
leetcode 718 最长公共子数组
这个题目和最长公共子数组,类似于镜像题,子问题比较难想。对于 d p [ i ] [ j ] dp[i][j] dp[i][j] ,定义为分别以 i i i 和 j j j 结尾的最长公共子数组(公共后缀) 核心代码: if(nums1[i-1] nums2[j-…...
【C++】继承:万字总结
📝前言: 这篇文章我们来讲讲面向对象三大特性之一——继承 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础,py…...
java和c#的相似及区别基础对比
用过十几种语言,但是java和c#是最为重要的两门。c#发明人曾主导开发了pascal和delphi,加入微软后,参考了c和java完成了c#和net。大家用过java或c#任意一种的,可以通过本篇文章快速掌握另外一门语言。 基础语法 变量声明…...
TP8 PHP 支付宝-通用版-V3 SDK 接口加签方式为证书方式
TP8 已安装支付宝-通用版-V3 SDK 接口加签方式之前使用密钥方式,现在要使用证书 官方文档小程序文档 - 支付宝文档中心 SDK源码仓库https://github.com/alipay/alipay-sdk-php-all/tree/master/v3 第一步:生成证书 需要先下载支付宝官方工具:…...
地毯填充luogu
P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主…...
数据查询语言
一、DQL基础语法与执行逻辑 1.SELECT语句结构 (1)核心语法: SELECT 列名 FROM 表名 WHERE 条件 ,用于指定返回的字段和筛选行。例如, SELECT name, age FROM emp WHERE age > 25 筛选年龄大于25岁的员工姓名和年龄。 (2)执行顺序: FROM → WHERE → GROUP BY → HAV…...
【NLP】18. Encoder 和 Decoder
1. Encoder 和 Decoder 概述 在序列到序列(sequence-to-sequence,简称 seq2seq)的模型中,整个系统通常分为两大部分:Encoder(编码器)和 Decoder(解码器)。 Encoder&…...
基于Cline和OpenRouter模型进行MCP实战
大家好,我是herosunly。985院校硕士毕业,现担任算法工程师一职,获得CSDN博客之星第一名,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得多项AI顶级比赛的Top名次,其中包括阿里云、科大讯飞比赛第一名…...
Elasticsearch 故障转移及水平扩容
一、故障转移 Elasticsearch 的故障转移(Failover)机制是其高可用性的核心,通过分布式设计、自动检测和恢复策略确保集群在节点故障时持续服务。 1.1 故障转移的核心组件 组件作用Master 节点管理集群状态(分片分配、索引创建&…...
聊聊Spring AI的Prompt
序 本文主要研究一下Spring AI的Prompt Prompt org/springframework/ai/chat/prompt/Prompt.java public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions chatOptions;public Prompt(…...
centos 7:虚拟机网络配置
1、网络模式选择 桥接模式 特点:虚拟机会获得与物理机同网段的独立IP,可直接访问内网/外网适用场景:渗透测试、需要与其他设备交互的场景配置要点:需在VMware中指定桥接到物理机的真实网卡(如WiFi或有线网卡ÿ…...
Spring - 14 ( 5000 字 Spring 入门级教程 )
一:Spring原理 1.1 Bean 作用域的引入 在 Spring 的 IoC 和 DI 阶段,我们学习了 Spring 如何有效地管理对象。主要内容包括: 使用 Controller、Service、Repository、Component、Configuration 和 Bean 注解来声明 Bean 对象。通过 Applic…...
基于贝叶斯估计的多传感器数据融合算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 贝叶斯估计 4.2 多传感器数据融合 5.完整程序 1.程序功能描述 基于贝叶斯估计的多传感器数据融合算法matlab仿真,输入多个传感器的数据,通过贝叶斯估计…...
linux编辑器-vim
一、基本概念 vim有很多模式但是有三个重要的模式分别是命令模式、插入模式、低行模式。 命令模式:控制光标移动、字符、字或行的删除、移动、复制等。插入模式:只有在该模式下才可以进行文字输入。低行模式:文件的保存或退出,也…...
day27图像处理OpenCV
文章目录 一、图像预处理1 图像翻转(图像镜像旋转)2 图像仿射变换2.1 图像旋转2.2 图像平移2.3 图像缩放2.4 图像剪切 3 插值方法3.1 最近邻插值3.2 双线性插值(常用)3.3 像素区域插值--一般缩小使用3.4 双三次插值3.5 Lanczos插值 一、图像预处理 1 图像翻转(图像镜像旋转) …...
iOS开发--接入ADMob广告失败
接入ADMob的第三方广告,初始化时提示错误如下: state Not Ready;No such adapter in the application 查了各种官方文档,发现接入过程正确,查了Chatgpt和DeepSeek,它们各种分析,分析结果如下: …...
PyTorch进阶学习笔记[长期更新]
第一章 PyTorch简介和安装 PyTorch是一个很强大的深度学习库,在学术中使用占比很大。 我这里是Mac系统的安装,相比起教程中的win/linux安装感觉还是简单不少(之前就已经安好啦),有需要指导的小伙伴可以评论。 第二章…...
vue3 ts 自定义指令 app.directive
在 Vue 3 中,app.directive 是一个全局 API,用于注册或获取全局自定义指令。以下是关于 app.directive 的详细说明和使用方法 app.directive 用于定义全局指令,这些指令可以用于直接操作 DOM 元素。自定义指令在 Vue 3 中非常强大࿰…...
【漫话机器学习系列】199.过拟合 vs 欠拟合(Overfit vs Underfit)
机器学习核心问题:过拟合 vs 欠拟合 图示作者:Chris Albon 1. 什么是拟合(Fit)? 拟合(Fit)是指模型对数据的学习效果。 理想目标: 在训练集上效果好 在测试集上效果也好 不复杂、…...
从0到1使用C++操作MSXML
1. 引言 MSXML(Microsoft XML Core Services)是微软提供的一套用于处理XML的COM组件库,广泛应用于Windows平台的XML解析、验证、转换等操作。本文将详细介绍如何从零开始,在C中使用MSXML解析和操作XML文件,包含完整的…...
【中间件】nginx反向代理实操
一、说明 nginx用于做反向代理,其目标是将浏览器中的请求进行转发,应用场景如下: 说明: 1、用户在浏览器中发送请求 2、nginx监听到浏览器中的请求时,将该请求转发到网关 3、网关再将请求转发至对应服务 二、具体操作…...
C语言中冒泡排序和快速排序的区别
冒泡排序和快速排序都是常见的排序算法,但它们在原理、效率和应用场景等方面存在显著区别。以下是两者的详细对比: 一、算法原理 1. 冒泡排序 原理:通过重复遍历数组,比较相邻元素的大小,并在必要时交换它们的位置。…...
进程基本介绍
进程是操作系统的重要内容,都是需要了解和学习的,那么今天我们就来好好看看. 进程基本介绍 1、Linux中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号(pid,进程号). 2.每个进程都可以以两种方式存在的,前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的,…...
通过平台大数据智能引擎及工具,构建设备管理、运行工况监测、故障诊断等应用模型的智慧快消开源了
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...
不同数据库的注入报错信息
不同数据库在报错注入时返回的报错信息具有显著差异,了解这些差异可以帮助快速判断数据库类型并构造针对性的注入攻击语句。以下是主流数据库的典型报错模式及对比: 目录 1. MySQL 2. Microsoft SQL Server 3. Oracle …...
tcpdump`是一个非常强大的命令行工具,用于在网络上捕获并分析数据包
通过 tcpdump,你可以抓取网络流量,诊断网络问题,或分析通信协议的细节。下面是如何在 Linux 上使用 tcpdump 进行抓包的详细步骤。 1. 安装 tcpdump 在大多数 Linux 发行版中,tcpdump 是默认安装的。如果没有安装,可…...
【漏洞复现】Vite 任意文件读取漏洞 CVE-2025-30208/CVE-2025-31125/CVE-2025-31486/CVE-2025-32395
Vite是什么,和Next.js有什么区别? 我上一篇文章刚介绍了Next.js漏洞的复现: 【漏洞复现】Next.js中间件权限绕过漏洞 CVE-2025-29927_next.js 中间件权限绕过漏洞-CSDN博客 Vite 和 Next.js 是两个不同类型的前端工具,它们各自…...
Odrive源码分析(六) 相关控制变量传递
本文记录下odrive源代码中相关控制模块之间变量的传递,这对理解odrive源代码至关重要。 通过前面文字的分析,odrive有两条数据链路,一条是通过中断进行实时的控制,另外一条是OS相关的操作,主要分析下中断内部的相关变量…...
ARM架构FFmpeg极致优化交叉编译指南
ARM架构FFmpeg极致优化交叉编译指南 一、工具链科学配置 使用最新的ARM官方工具链(Linaro或ARM GNU Toolchain) 确保工具链支持目标平台特定指令集(如NEON, VFP等) 设置正确的–sysroot和–prefix参数 1. 工具链选择原则 # 32位ARM (推荐) wget https://developer.arm.com/…...
zk源码—7.ZAB协议和数据存储一
大纲 1.两阶段提交Two-Phase Commit(2PC) 2.三阶段提交Three-Phase Commit(3PC) 3.ZAB协议算法 4.ZAB协议与Paxos算法 5.zk的数据存储原理之内存数据 6.zk的数据存储原理之事务日志 7.zk的数据存储原理之数据快照 8.zk的数据存储原理之数据初始化和数据同步流程 1.两阶…...
2025蓝桥杯C++A组省赛 题解
昨天打完蓝桥杯本来想写个 p y t h o n python python A A A 组的题解,结果被队友截胡了。今天上课把 C A CA CA 组的题看了,感觉挺简单的,所以来水一篇题解。 这场 B B B 是一个爆搜, C C C 利用取余的性质比较好写&#…...
用哪个机器学习模型 依靠极少量即时静态数据来训练ai预测足球赛的结果?
目录 一、模型推荐 1.集成树模型(XGBoost/CatBoost) 2.逻辑回归(Logistic Regression) 3.贝叶斯概率模型(Naive Bayes或贝叶斯网络) 4.支持向量机(SVM) 二、模型排除 三、训练…...
讲解贪心算法
贪心算法是一种常用的算法思想,其在解决问题时每一步都做出在当前状态下看起来最优的选择,从而希望最终能够获得全局最优解。C作为一种流行的编程语言,可以很好地应用于贪心算法的实现。下面我们来讲一篇关于C贪心算法的文章。 目录 贪心算法…...
0基础 | 电动汽车的“电源翻译官” | DC/DC转换器 | 电源系统三
你有没有想过,电动汽车里那么多五花八门的电子设备,比如车灯、仪表盘、摄像头,甚至连控制马达的“大脑”(ECU),是怎么用上电的?今天就来聊聊电动车里一个默默工作的“小功臣”——DC/DC转换器&a…...
zynq7020 u-boot 速通
zynq u-boot 速通 简介 上回最小系统已经跑起来,证明串口和 ddr 正确配置.现在我们需要正确配置 网口, qspi, emmc. 网口:通过 tftp 下载 dtb,image,rootfs 在线调试.qspi:固化 boot.bin 到 qspi flash,这样 qspi 启动就可以直接运行 u-boot.emmc:存放 ubuntu_base 跟文件系统…...
C++学习之路,从0到精通的征途:string类的模拟实现
目录 一.string类的成员变量与成员函数 二.string类的接口实现 1.构造函数,析构函数,拷贝构造函数,赋值重载 (1)构造函数 (2)析构函数 (3)拷贝构造函数 &…...
网页制作中的MVC和MVT
MVC(模型-视图-控制器)和MVT(模型-模板-视图)是两种常见的软件架构模式,通常用于Web应用程序的设计。它们之间的主要区别在于各自的组件职责和工作方式。 MVC(模型-视图-控制器): 模…...
02 - spring security基于配置文件及内存的账号密码
spring security基于配置的账号密码 文档 00 - spring security框架使用01 - spring security自定义登录页面 yml文件中配置账号密码 spring:security:user:name: adminpassword: 123456yml文件中配置账号密码后,控制台将不再输出临时密码 基于内存的账号密码 …...
Firebase Studio:开启 AI 驱动的开发新纪元
Firebase Studio(前身为 Project IDX)的推出,标志着软件开发范式正经历深刻变革。它不仅是一个传统的 IDE,更是一个以 AI 为主导的、代理式 (agentic) 的云端开发环境,专注于全栈 AI 应用(包括 API、后端、…...
网络基础2
目录 跨网络传输流程 网络中的地址管理 - 认识 IP 地址 跨网络传输 报文信息的跨网络发送 IP地址的转化 认识端口号 端口号范围划分 源端口号和目的端口号 认识 TCP / UDP协议 理解 socket 网络字节序 socket 编程接口 sockaddr 结构 我们继续来学习网络基础 跨网…...
Maven工具学习使用(十一)——部署项目到仓库
1、使用Maven默认方式 Maven 部署项目时默认使用的上传文件方式是通过 HTTP/HTTPS 协议。要在 Maven 项目中配置部署,您需要在项目的 pom.xml 文件中添加 部分。这个部分定义了如何部署项目的构件(如 JAR 文件)到仓库。。这个部分定义了如何…...
FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )
目录 前言 一、设计流程 1.1 需求理解 1.2 模块划分 1.3 测试验证 二、模块分工 2.1 RGMII→GMII(接收方向,rgmii_rx 模块) 2.2 GMII→RGMII(发送方向,rgmii_tx 模块) 三、代码实现 3.1 顶层模块 …...
torch.cat和torch.stack的区别
torch.cat 和 torch.stack 是 PyTorch 中用于组合张量的两个常用函数,它们的核心区别在于输入张量的维度和输出张量的维度变化。以下是详细对比: 1. torch.cat (Concatenate) 作用:沿现有维度拼接多个张量,不创建新维度 输入要求…...
索引下推(Index Condition Pushdown, ICP)
概念 索引下推是一种数据库查询优化技术,通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况,因为它可以在索引扫描阶段就排除不符合全部条件的数据行,而不是将所有可能匹配的记录加载到服务器层再进行…...
C++基础精讲-06
文章目录 1. this指针1.1 this指针的概念1.2 this指针的使用 2. 特殊的数据成员2.1 常量数据成员2.2 引用数据成员2.3 静态数据成员2.4 对象成员 3. 特殊的成员函数3.1 静态成员函数3.2 const成员函数3.3 mutable关键字 1. this指针 1.1 this指针的概念 1.c规定,t…...
Django3 - 建站基础
学习开发网站必须了解网站的组成部分、网站类型、运行原理和开发流程。使用Django开发网站必须掌握Django的基本操作,比如创建项目、使用Django的操作指令以及开发过程中的调试方法。 一、网站的定义及组成 网站(Website)是指在因特网上根据一定的规则,…...
UE5蓝图设置界面尺寸大小
UE5蓝图设置界面尺寸大小 Create widget 创建UIadd to Viewport 添加视图get Game User Settings获取游戏用户设置set Screen Resolutions 设置屏幕尺寸大小1920*1080set Fullscreen Mode 设置全屏模式为:窗口化或者全屏Apply Settings 应用设置...
无数字字母RCE
无数字字母RCE,这是一个老生常谈的问题,就是不利用数字和字母构造出webshell,从而能够执行我们的命令。 <?php highlight_file(__FILE__); $code $_GET[code]; if(preg_match("/[A-Za-z0-9]/",$code)){die("hacker!&quo…...
AutoGen参数说明
UserProxyAgent用户 user_proxy = UserProxyAgent配置说明: # 构造参数 def __init__(self,name: str,is_termination_msg: Optional[Callable[[Dict], bool]] = None,max_consecutive_auto_reply: Optional[int] = None,human_input_mode: Literal["ALWAYS", &qu…...