NLP基础 : HMM 隐马尔可夫模型

Hidden Markov Model, HMM 隐马尔可夫模型,是一种描述隐性变量(状态)和显性变量(观测状态)之间关系的模型。该模型遵循两个假设,隐性状态i只取决于前一个隐性状态i-1,而与其他先前的隐形状态无关。观测状态也只取决于当前的隐形状态。因此我们常常将隐马尔科夫模型表现为一种如下图所示链式的模型。
显性状态链与隐性状态链图示
其中,xtx_txt代表某一时刻的隐形状态链,其N个状态取值集合为{s1,s2,s3,...,N}\{s_1,s_2,s_3,...,_N\}{s1,s2,s3,...,N}yty_tyt表示为对应的该时刻的显性状态(观测状态),其M个状态取值集合为{o1,o2,o3,...,ok,...,oM}\{o_1,o_2,o_3,...,o_k,...,o_M\}{o1,o2,o3,...,ok,...,oM}。隐马尔科夫模型θ\thetaθ可以由三个矩阵来进行描述θ=(A,B,Π)\theta = (A,B,\Pi)θ=(A,B,Π)

1. 大小为 N*N (N代表N种隐性的状态)的过渡矩阵 A:

A={aij}={P(xt+1=sj∣xt=si)}={P(sj∣si)}A = \{a_{ij}\} = \{P(x_{t+1}=s_j|x_t=s_i)\} = \{P(s_j|s_i)\}A={aij}={P(xt+1=sjxt=si)}={P(sjsi)}
过渡矩阵A中的每一个元素表示由上一个隐性状态sis_isi变为下一个隐性状态的条件概率。

2. 大小为 1*N 的初始概率向量 Π\PiΠ :

Π=πi=P(x1=si)=P(si)\Pi ={\pi_i} = {P(x_1 = s_i)} = {P(s_i)}Π=πi=P(x1=si)=P(si)
初始概率向量Π\PiΠ中的每一个元素,表示初始隐性状态为sis_isi的概率,该向量的长度N与隐性状态的可能取值个数相同。

3. 大小为 M*N 的观测矩阵 B :

B={bki}={P(yt=ok∣xt=si)}={P(ok∣si)}B = \{b_{ki}\} = \{P(y_t=o_k|x_t=s_i)\} = \{P(o_k|s_i)\} B={bki}={P(yt=okxt=si)}={P(oksi)}

观测矩阵B中的每个元素,是用来描述N个隐形状态对应M个观测状态的概率。即在隐形状态为sis_isi 的条件下,观测状态为oko_kok的概率。

上述三个矩阵构成了一个完整的隐马尔可夫模型。

掷骰子问题可以帮助我们更好地理解显性状态链和隐性状态链。例如我们有三个面数不一样的骰子可供选择投掷,三个骰子一个面数为4,一个面数为6,一个面数为8。每次选择的骰子是随机的且满足继续选到同一个骰子的概率是选到其他骰子概率的两倍。此时,隐性状态链xtx_txt就是我们每次选择的骰子,取值集合就是骰子1,骰子2,骰子3。显性状态链就是我们掷出的一系列数值,取值集合为{1,2,3,4,5,6,7,8}\{1,2,3,4,5,6,7,8\}{1,2,3,4,5,6,7,8}
根据上述的信息,我们不难整理出这个骰子问题HMM模型的三个核心矩阵 :

过渡矩阵A

previous state \ current stateD4D6D8
D423\frac{2}{3}3216\frac{1}{6}6116\frac{1}{6}61
D616\frac{1}{6}6123\frac{2}{3}3216\frac{1}{6}61
D816\frac{1}{6}6116\frac{1}{6}6123\frac{2}{3}32

初始概率向量Π\PiΠ
由于一开始是随机选取骰子,因此初始抽到三个骰子的概率是相同的13\frac{1}{3}31

D4D6D8
13\frac{1}{3}3113\frac{1}{3}3113\frac{1}{3}31

观测矩阵B :
观测矩阵存放了每种隐性状态下各观测状态的条件概率

observed state \ hidden stateD4D6D8
114\frac{1}{4}4116\frac{1}{6}6118\frac{1}{8}81
214\frac{1}{4}4116\frac{1}{6}6118\frac{1}{8}81
314\frac{1}{4}4116\frac{1}{6}6118\frac{1}{8}81
414\frac{1}{4}4116\frac{1}{6}6118\frac{1}{8}81
5016\frac{1}{6}6118\frac{1}{8}81
6016\frac{1}{6}6118\frac{1}{8}81
70018\frac{1}{8}81
80018\frac{1}{8}81

使用HMM模型会衍生出三类基础问题 :

第一类问题. 在HMM模型θ\thetaθ确定的情况下,针对一组显性状态链y1:Ty_{1:T}y1:T,计算出该模型生成这组显性状态链的概率。

还是沿用上述的骰子为例,这类问题实际就是在确定了骰子的种类,D4D6D8(观测矩阵B),随机选择骰子的方式(过渡矩阵A和初始概率向量Π\PiΠ)的情况下,用于计算使用这三个骰子掷出一组数的可能性的问题。计算显性状态链的生成概率也是对模型是否和实际情况吻合的检验。如果多次实验得出的显性状态链由该模型生成的概率很低,可以认为构成模型的三个矩阵要素可能与实际情况不符,即在该例子中使用的骰子有被掉包的可能或实际随机选取骰子的方式与模型不一致。下面给出计算该问题的其中一个算法 forward algorithm 前向算法,与之对应的还有backward algorithm 后向算法,由于两者的思路很相似,本文中不再对backward algorithm作过多阐述。

forward algorithm 前向算法

计算一组显性状态链 y1,y2,y3,...,yTy_1,y_2,y_3,...,y_Ty1,y2,y3,...,yT (下文中统一称y1:Ty_{1:T}y1:T)生成的概率,即计算 𝔏 = P(y1:T)P(y_{1:T})P(y1:T)。我们先定义 αi(t)=P(y1:t,xt=si)\alpha_i(t) = P(y_{1:t}, x_t = s_i)αi(t)=P(y1:t,xt=si), 其中sis_isi是该显性状态链最后一个值对应的隐性状态,ttt是这个显性状态链的总长度。 αi(t)\alpha_i(t)αi(t)即是掷出该显性状态链,且最后一个隐形状态为sis_isi的概率,则最终要求的生成概率 𝔏 = P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=∑i=1Nαi(T)P(y_{1:T}) = P(y_{1:T},x_t = s_1) + P(y_{1:T},x_t = s_2) +... + P(y_{1:T},x_t = s_N) \\ = \sum_{i=1}^{N}\alpha_i{(T)}P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=i=1Nαi(T)
这样我们就把问题转化为了计算αi(T)=P(y1:T,xt=si)\alpha_i{(T)} = P(y_{1:T},x_t=s_i)αi(T)=P(y1:T,xt=si)。使用前向算法forward algorithm如下图所示,通过去掉最后一个状态的状态链的生成概率αi(t−1)\alpha_i(t-1)αi(t1)推导至αi(t)\alpha_i{(t)}αi(t),可以归纳为一个递推模型。
首先我们计算生成y1:ty_{1:t}y1:t这个显性状态链且最后一个隐形状态为s1s_1s1的概率α1(t)\alpha_1(t)α1(t),通过这个概率我们就不难推导出同样生成该显性状态链,且最后一个隐性状态为s2,s3,...,sNs_2,s_3,...,s_Ns2,s3,...,sN的概率αi(t)\alpha_i(t)αi(t)

α1(t)=P(y1:t,xt=si)=P(y1:t−1,xt−1=s1)∗P(s1∣s1)∗P(yt∣s1)+P(y1:t−1,xt−1=s2)∗P(s1∣s2)∗P(yt∣s1)+...+P(y1:t−1,xt−1=xN)∗P(s1∣sN)∗P(yt∣s1)\alpha_1{(t)} = P(y_{1:t},x_t = s_i) = P(y_{1:t-1},x_{t-1}=s_1) * P(s_1|s_1) * P(y_t|s_1) \\ + P(y_{1:t-1},x_{t-1}=s_2) * P(s_1|s_2) * P(y_t|s_1) \\+ \\...\\+ P(y_{1:t-1},x_{t-1}=x_N) * P(s_1|s_N) * P(y_t|s_1)α1(t)=P(y1:t,xt=si)=P(y1:t1,xt1=s1)P(s1s1)P(yts1)+P(y1:t1,xt1=s2)P(s1s2)P(yts1)+...+P(y1:t1,xt1=xN)P(s1sN)P(yts1)

对于每个前置状态xt−1x_{t-1}xt1,计算α1(t)\alpha_1(t)α1(t)为三个概率的乘积 : 前一时刻t−1t-1t1隐形状态为sis_isi且状态链为y1:t−1y_{1:t-1}y1:t1的概率,由前一时刻的隐形状态sis_isi过渡到当前时刻s1s_1s1的过渡概率,以及在隐性状态为s1s_1s1的情况下,显性状态呈现yty_tyt的概率。
整理可得 :
α1(t)=α1(t−1)∗a11∗byt,1+α2(t−1)∗a21∗byt,1+...+αN(t−1)∗aN1∗byt,1=byt,1∑k=1Nαk(t−1)∗ak1\alpha_1(t) = \alpha_1(t-1) * a_{11} * b_{yt,1} \\+\\ \alpha_2(t-1)*a_{21} * b_{yt,1} \\+\\ ... \\+\\ \alpha_N(t-1) * a_{N1} * b_{yt,1} \\= b_{yt,1}\sum_{k=1}^N\alpha_k(t-1) * a_{k1}α1(t)=α1(t1)a11byt,1+α2(t1)a21byt,1+...+αN(t1)aN1byt,1=byt,1k=1Nαk(t1)ak1
tips : aija_{ij}aij是过渡矩阵A中第i行第j列元素,aij=P(xt−1=sj∣xt=si)a_{ij} = P(x_{t-1}=s_j|x_t=s_i)aij=P(xt1=sjxt=si)即由前一个隐形状态sis_isi过渡到现状态sjs_jsj的概率。

同理可得α2(t)=byt,2∑k=1Nαk(t−1)∗ak2\alpha_2(t) = b_{yt,2}\sum_{k=1}^N\alpha_k(t-1) * a_{k2}α2(t)=byt,2k=1Nαk(t1)ak2
不难推出αi(t)=byt,i∑k=1Nαk(t−1)∗akifor(t>=2)\alpha_i(t) = b_{yt,i}\sum_{k=1}^N\alpha_k(t-1) * a_{ki} \space \space for (t>=2)αi(t)=byt,ik=1Nαk(t1)aki  for(t>=2)
我们就得到了一个计算αi(t)\alpha_i(t)αi(t)的递推模型,初始值αi(1)=πi∗by1,i\alpha_i(1) = \pi_i*b_{y_{1},i}αi(1)=πiby1,i tips : πi\pi_iπi是初始隐性状态为i的概率(见初始概率向量Π\PiΠ)。

且𝔏 = P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=∑i=1Nαi(T)P(y_{1:T}) = P(y_{1:T},x_t = s_1) + P(y_{1:T},x_t = s_2) +... + P(y_{1:T},x_t = s_N) \\ = \sum_{i=1}^{N}\alpha_i{(T)}P(y1:T)=P(y1:T,xt=s1)+P(y1:T,xt=s2)+...+P(y1:T,xt=sN)=i=1Nαi(T)易得P(y1:T)=∑i=1N(byT,1∑k=1Nαk(T−1)∗ak1)for(T>=2)P(y_{1:T} ) = \sum_{i=1}^N(b_{y_{T,1}}\sum_{k=1}^N\alpha_k(T-1) * a_{k1}) \space\space for (\space T>=2)P(y1:T)=i=1N(byT,1k=1Nαk(T1)ak1)  for( T>=2)

在这里插入图片描述

第二类问题. 在HMM模型θ\thetaθ确定的情况下,给出一组显性状态链y1:Ty_{1:T}y1:T,找出与其对应的可能性最大 的隐性状态序列x1:Tx_{1:T}x1:T

这个问题广泛应用于自然语言处理NLP中。例如在我们获取了一组手写符号时,找出其最大概率对应的字符。解决这个问题我们就要用到viterbi algorithm 维特比算法。维特比算法仍然利用递推关系,由ttt时刻的状态推出t+1t+1t+1时刻的状态。定义δi(t)\delta_i(t)δi(t)ttt时刻且显性状态为sis_isi的最优路径的概率。
初始情况非常简单,在t=1t=1t=1时刻,δi(t)=πi∗by1,i\delta_i(t) = \pi_i * b_{y_1,i}δi(t)=πiby1,i,每个隐性状态对应的概率均是初始状态概率与对应的显性状态观测概率的乘积。紧接着有递推关系 :
δi(t+1)=[max⁡jδj(t)aji]∗byt+1,i\delta_i(t+1) = [\max_j\delta_j(t)a_{ji}] * b_{y_{t+1},i}δi(t+1)=[jmaxδj(t)aji]byt+1,i在这个递推关系中,下一时刻t+1t+1t+1每个隐性状态iii的最大概率δi(t+1)\delta_i(t+1)δi(t+1)总是对应上一时刻ttt中最优路径概率δj(t)\delta_j(t)δj(t)与过渡概率ajia_{ji}aji乘积最大的隐性状态jjj。因此,最优的隐性状态路径序列$\Psi_i(t) = [\argmax_j\delta_i(t)a_{ji}]。下面引用索邦大学课件上的例题作为使用维特比算法的例子 :

给定一个HMM模型θ\thetaθ,其中
A=∣0.30.50.200.30.7001∣A = \left| \begin{matrix} 0.3 & 0.5 & 0.2\\ 0 & 0.3 & 0.7\\ 0 & 0 & 1 \end{matrix} \right| A=0.3000.50.300.20.71

Π=∣0.60.40∣\Pi = \left| \begin{matrix} 0.6\\ 0.4 \\ 0 \end{matrix} \right| Π=0.60.40

B=∣10.5000.51∣B = \left| \begin{matrix} 1 & 0.5 & 0\\ 0 & 0.5 & 1 \end{matrix} \right| B=100.50.501
计算显性序列为 y = [1,1,2,2] 时,对应可能性最大的隐性序列。
结果如下 :
最终的最大概率隐性状态链为[1 2 3 3],对应的概率为0.105。
在这里插入图片描述

第三类问题. Baum-Welch算法,给定一个序列y1:Ty_{1:T}y1:T,估算出能最大化该序列生成概率的HMM模型的参数。

这类问题是非常常见的,HMM建模的问题。通过一组给定的显性状态链,推测出可能性最大的HMM模型。 首先我们需要用到前向算法中提到的αi(t)\alpha_i(t)αi(t)以及后向算法中的βi(t)\beta_i(t)βi(t)。前向算法的推导过程可以参考之前的部分,类似的后向算法如果有兴趣可以自行再查找资料,这里不过多赘述只列出使用的公式。
根据之前前向算法部分,我们定义了αi(t)=P(y1:t,xt=si)\alpha_i(t) = P(y_{1:t}, x_t = s_i)αi(t)=P(y1:t,xt=si)这个可以递推出的概率,αi(t)\alpha_i(t)αi(t)代表了观测状态为y1:ty_{1:t}y1:t且第ttt个隐性状态sis_isi的概率。同样在后向算法中我们定义了βi(t)=P(yt+1,...,yT,xt=si)\beta_i(t) =P(y_{t+1},...,y_T, x_t=s_i)βi(t)=P(yt+1,...,yT,xt=si)代表了观测状态为yt+1:Ty_{t+1:T}yt+1:T且第ttt个隐性状态为sis_isi的概率。

显然我们有αi(t)βi(t)=P(y1:T,xt=si)\alpha_i(t)\beta_i(t)=P(y_{1:T},x_t=s_i)αi(t)βi(t)=P(y1:T,xt=si) 且 𝔏 = P(y1:T)P(y_{1:T})P(y1:T)

根据贝叶斯公式P(A∣B)=P(A,B)P(B)P(A|B) = \frac{P(A,B)}{P(B)}P(AB)=P(B)P(A,B), [2] 我们不难得出在给定观测序列y1:Ty_{1:T}y1:T以及HMM模型θ\thetaθ的情况下,在ttt时刻状态是sis_isi的概率 :

γi(t)=P(xt=si∣y1:T)=P(xt=si,y1:T)P(y1:T)=αi(t)βi(t)∑j=1Nαj(t)βj(t)\gamma_i(t) = P(x_t=s_i|y_{1:T}) = \frac{P(x_t=s_i,y_{1:T})}{P(y_{1:T})}=\frac{\alpha_i(t)\beta_i(t)}{\sum_{j=1}^{N}\alpha_j(t)\beta_j(t)}γi(t)=P(xt=siy1:T)=P(y1:T)P(xt=si,y1:T)=j=1Nαj(t)βj(t)αi(t)βi(t)

ttt时刻状态是sis_isi,在t+1t+1t+1时刻状态时sjs_jsj的概率 :
ξij=P(xt=si,xt+1=sj∣y1:T)=P(sj∣si)αi(t)βj(t+1)P(yt+1∣sj)P(y1:T)=aijβj(t+1)byt+1,jP(y1:T)\xi_{ij} =P(x_t=s_i,x_{t+1} =s_j|y_{1:T}) = \frac{P(s_j|s_i)\alpha_i(t)\beta_j(t+1)P(y_{t+1}|s_j)}{P(y_{1:T})} = \frac{a_{ij}\beta_j(t+1)b_{y_{t+1},j}}{P(y_{1:T})}ξij=P(xt=si,xt+1=sjy1:T)=P(y1:T)P(sjsi)αi(t)βj(t+1)P(yt+1sj)=P(y1:T)aijβj(t+1)byt+1,j

通过这些基础的概率,我们更新θ\thetaθ中的参数。

初始状态是sis_isi的概率向量:
Πi∗=γi(1)\Pi^*_i = \gamma_i(1)Πi=γi(1)

更新过渡矩阵:
aij∗=P(sj∣si)=∑t=1T−1ξij(t)∑t=1T−1γi(t)a^*_{ij} = P(s_j|s_i) = \frac{\sum_{t=1}^{T-1}\xi_{ij}(t)}{\sum_{t=1}^{T-1}\gamma_{i}(t)}aij=P(sjsi)=t=1T1γi(t)t=1T1ξij(t)

更新观测矩阵:
bok,i∗=∑t=1Tαi(t)P(yt∣si)1yt=ok∑t=1Tαi(t)βi(t)b^*_{o_k,i} = \frac{\sum_{t=1}^T\alpha_i(t)P(y_t|s_i)1_{y_t=o_k}}{\sum_{t=1}^T\alpha_i(t)\beta_i(t)}bok,i=t=1Tαi(t)βi(t)t=1Tαi(t)P(ytsi)1yt=ok
其中
1yt=ok=1whenyt=ok1_{y_t=o_k} = 1 \space\space when \space \space y_t=o_k1yt=ok=1  when  yt=ok
1yt=ok=0whenelse1_{y_t=o_k} = 0 \space\space when \space \space else1yt=ok=0  when  else

不断重复上述更新操作直至收敛,就得到了新的HMM模型。

\newline
\newline
\newline
\newline
\newline

References :

[1] Viterbi AJ (April 1967). “Error bounds for convolutional codes and an asymptotically optimum decoding algorithm”. IEEE Transactions on Information Theory. 13

[2] Baum-Welch algorithm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于秒杀系统优化方向

今天听了一节咕泡学院的公开课,有收获。 秒杀系统的特点: 1.限时;2.限量供应;3.并发量大;如何优化: 1.客户端数据缓存。 2.CDN加速。 3.nginx动静分离,静态资源缓存,负载均衡。 4.se…

RUNOOB python练习题1

用来练手的python 练习题,原链接 : python练习实例1 题干 : 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? import numpy as np cen np.array([1,2,3,4]) tens np.array([1,2,3,4])…

MySQL 亿级数据需求的优化思路(一),交易流水记录的查询

对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以下是在实验的过程中做一些操作,以及踩过的一些坑&#…

RUNOOB python练习题2

用来练手的python 练习题,原链接 : python练习实例2 题干 : 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的…

MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索

最近在研究亿级数据的时候,无意中看到了一个关于写58同城的文章 https://blog.csdn.net/admin1973/article/details/55251499?fromtimeline 其实上面讲的versionext的方式以及压缩json的思路,对于我来讲都可以看得懂,想得通,其…

RUNOOB python练习题3

用来练手的python 练习题,原链接 : python练习实例3 拿到题目就写了如下代码,思路是因为使用**0.5进行开平方操作时,python会将数据类型自动转换为float单精度浮点型。这里利用提取其整数部分,来判断这个数是否是完全平方数。 z…

使用git将项目上传到github(最简单方法)

使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可&#xff1…

RUNOOB python练习题4

用来练手的python习题其四, 原题链接: python练习实例4 题干: 输入某年某月某日,判断这一天是这一年的第几天? 这个题目比较简单,只需要注意闰年和非闰年的区别就可以了。我这里使用numpy矩阵存储每个月的天数,之后用…

GitHub入门:如何上传与下载工程?

由于经常要在家写代码,所以需要有个能够方便访问代码管理工具。最近尝试了一下GitHub。经过了一翻纠结之后,基本上掌握了他的使用方式。 要使用GitHub需要首先在其网站上进行注册。其官方网站是https://github.com/。注册的流程在这里就不多少了&#x…

如何解决PIP命令不可用

今天想用PIP装一个python包,发现PIP报错,不是内部或外部命令。。。 遇事百度,有两种说法,一,没安装包,不管那么多命令执行了再说 在命令行输入:python -m ensurepip 将pip.exe文件下载下来 再pi…

RUNOOB python练习题5

用来练手的python 练习题其五,原链接 : python练习实例5 题干 : 输入三个整数x,y,z,请把这三个数由小到大输出。 又是非常简单的排序算法,只要使用numpy矩阵的排序方法或者使用python list的排序算法就可以轻松解决。 源代码如下 : import …

初步使用github,并上传下载文件

使用GitHub需要先注册GitHub的账号,登陆进去 然后开始创建项目 start a project 创建完成,开始生成公私钥,可以不必每次都要输密码 ssh-keygen -t rsa -C "mghxy123163.com" //填写email地址,然后一直“回车”ok 然后把公钥导入GitHub中的key里面去,也…

NOIP2000提高组复赛C 单词接龙

题目链接:https://ac.nowcoder.com/acm/contest/248/C 题目大意: 略 分析: 注意点:1.前缀和后缀的公共部分应该选最短的。2.如果两个字符串前缀和后缀的公共部分恰好是其中一个字符串,那么这两个字符串不能合并。 代码…

右键Git Bash Here不见了怎么办,手把手教你还原!

第一步,window R,输入regedit回车进入注册表 依次进入HKEY_CLASSES_ROOT —-》 Directory —-》Background —-》 shell 右键点击shell,选择新建,然后选择项,命名为 Git Bash Here,成功后进入桌面右键发现…

RUNOOB python练习题6 斐波那契数列

用来练手的python 练习题其六,原链接 : python练习实例6 题干 : 斐波那契数列 斐波那契数列可以说是很好的递归理解工具了,这里就用递归实现一下斐波那契数列。 源代码如下: # 返回fibonacci数列中某一项的数值 def Fibonacci(n):if n 1:return 1eli…

github windows客户端

方法/步骤 1 1. 首先到官网下载Github客户端 2 2. 点击上图红框的按钮开始下载客户端。 3 3. 双击下载好的客户端,开始安装。 4 双击之后出现一个框 5 之后等待一段时间,出现一个在线下载界面 6 4. 在线下载完成之后开始进行安装。安装完成之后…

赋值语句 变量的地址相关 : RUNOOB python练习题7

用来练手的python 练习题,原链接 : python练习实例7 练习实例7非常的简单也有意思。题干 : 将一个列表的数据复制到另一个列表中。 完成这个操作的代码非常简单,即使是我这样的初学者应该也是一语道破,赋值语句嘛。但这里我们就列举出几种不…

Web标准的概念及组成

一周更新两个或三个关于web前端的知识点,欢迎感兴趣的小伙伴们一起学习讨论1、WEB标准是网页制作的标准,它不是一个标准,它是根据网页的不同组成部分生成的一系列标准。这些标准大部分由W3C起草发布,也有部分标准由ECMA起草发布。…

Fiddler简介及安装和HTTPS的解决

Fiddler简介: 一个很强大的抓包工具,类似Charles 1.安装: Filddler官网:点击打开链接 我安装的是filddler4:点击打开链接 直接下载文件,然后一路下一步就可以了 1.下载文件: 2.安装文件一…

RUNOOB python练习题8 numpy矩阵的索引及遍历

用来练手的python 练习题,原链接 : python练习实例8 题干: 输出 9*9 乘法口诀表。 import numpy as nptable np.zeros((9,9)) for i in range(table.shape[0]):for j in range(table.shape[1]):table[i][j] (i1) * (j1)# 查询九九乘法表 def affichage_table(a,…