熵的概念理解

2023-11-13

  • Author: 修远;
  • 说明:本文为Datawhale下开源项目《李宏毅机器学习》决策树的补充内容。作者水平有限,还望学习者批评指正。
  • Datawhale

学习目标:

  • 学习信息量计算,原理
  • 学习信息熵
  • 证明 0 ⩽ H ( p ) ⩽ l o g n 0\leqslant H(p)\leqslant logn 0H(p)logn
  • 联合概率,边缘概率
  • 联合熵,条件熵,条件熵公式推导
  • 互信息,互信息公式推导
  • 相对熵,交叉熵
  • 回顾LR中的交叉熵
  • 计算给定数据集中的香农熵

熵的相关概念

1信息熵

熵 (entropy) 这一词最初来源于热力学。1948年,克劳德·爱尔伍德·香农将热力学中的熵引入信息论,所以也被称为香农熵 (Shannon entropy),信息熵 (information entropy)。首先,我们先来理解一下信息这个概念。信息是一个很抽象的概念,百度百科将它定义为:指音讯、消息、通讯系统传输和处理的对象,泛指人类社会传播的一切内容。那信息可以被量化么?可以的!香农提出的“信息熵”概念解决了这一问题。

1.1背景

一条信息的信息量和它的不确定性有着直接的关系。比如说,我们需要搞清楚一件非常非常不确定的事,或者是我们一无所知的事,就需要了解大量的信息。相反,如果我们对某件事已经有了较多的了解,我们就不需要太多的信息就能把它搞清楚。所以,从这个角度,我们可以认为,信息量的度量就等于不确定性的多少。

那么如何量化信息的度量呢?来看一个例子。2010年举行了世界杯足球赛,大家都很关心谁会是冠军。假如我错过了看世界杯,赛后我问一个知道比赛结果的观众“哪支球队是冠军"?他不愿意直接告诉我,而让我猜,并且我每猜一次,他要收一元钱才肯告诉我是否猜对了,那么我需要付给他多少钱才能知道谁是冠军呢?我可以把球队编上号,从1到 32,然后提问:“冠军的球队在1一16号中吗?"假如他告诉我猜对了,我会接着问:“冠军在1一8号中吗?"假如他告诉我猜错了,我自然知道冠军队在9一16号中。这样只需要五次,我就能知道哪支球队是冠军。

所以,谁是世界杯冠军这条消息的信息量只值5块钱。

当然,香农不是用钱,而是用“比特" ( Bit )这个概念来度量信息量。一个比特是一位二进制数,计算机中的一个字节是8比特。在上面的例子中,这条消息的信息量是5比特。(如果有朝一日有64支球队进人决赛阶段的比赛,那么“谁是世界杯冠军"的信息量就是6比特,因为要多猜一次。)读者可能已经发现,信息量的比特数和所有可能情况的对数函数log有关。( 1 o g 2 32 = 5 , l o g 2 64 = 6 1og_232=5,log_264=6 1og232=5log264=6

有些读者此时可能会发现实际上可能不需要猜五次就能猜出谁是冠军,因为像西班牙、巴西、德国、意大利这样的球队得冠军的可能性比日本、南非、韩国等球队大得多。因此,第一次猜测时不需要把32支球队等分成两个组,而可以把少数几支最可能的球队分成一组,把其他队分成另一组。然后猜冠军球队是否在那几支热门队中。重复这样的过程,根据夺冠概率对剩下的候选球队分组,直至找到冠军队。这样,也许三次或四次就猜出结果“

因此,当每支球队夺冠的可能性(概率)不等时, 谁是世界杯冠军"的信息量比5比特少。香农指出,它的准确信息量应该是
H = − ( p ( 1 ) l o g p ( 1 ) + . . . + p ( 32 ) l o g p ( 32 ) ) H=-(p(1)logp(1)+...+p(32)logp(32)) H=(p(1)logp(1)+...+p(32)logp(32))

其中,Pi,P2,一p32分别是这32支球队夺冠的概率。香农把它称为“信息熵" (Entropy),一般用符号H表示,单位是比特。有兴趣的读者可以推算一下当32支球队夺冠概率相同时,对应的信息熵等于5比特。。对于任意一个随机变量x(比如得冠军的球队),它的熵定义如下:
H ( X ) = − ∑ x ∈ X n p ( x ) l o g p ( x ) H(X)=-\sum_{x\in X}^{n}p(x)logp(x) H(X)=xXnp(x)logp(x)

p i p_i pi=0,则定义为0log0=0。上式中的对数以2为底或以e为底(自然对数),这是熵的单位分别称做比特(bit)。由定义可知,熵只依赖于X的分布,而与X的取值无关,所以也可将X的熵记作H§,即

H ( p ) = − ∑ i = 1 n p i l o g p i H(p)=-\sum_{i=1}^{n}p_ilogp_i H(p)=i=1npilogpi

1.2信息熵公式的理解:

1信息量

假如说,一个事件A:你买了一本书,另一个事件B:你将《李宏毅机器学习》的内容全都搞懂了。你买了一本所需的信息量是非常少的,你将《李宏毅机器学习》的内容全都搞懂了这所需要的信息量是非常大的,如何度量这个事件的信息量呢?事件A的信息量表示为H(A),事件B的信息量表示为H(B)。两者比较为: H ( A ) &lt; H ( B ) H(A)&lt;H(B) H(A)<H(B)

我们想要在数学公式上跟我们的直觉相统一,假设X是一个事件或者一个信息的时候,它的信息量是跟概率有关的。

我们可以看到发生的几率越大,所需的信息量就越小,那我们就先假设信息量与概率的关系的为 H ( X ) H(X) H(X) 1 p ( x ) \frac{1}{p(x)} p(x)1有关系

两个事件的信息跟每个事件的信息量是什么样的关系
希望两者能够相加起来(有量纲的量), H ( x 1 , x 2 ) = H ( x 1 ) + H ( x 2 ) H(x_1,x_2)=H(x_1)+H(x_2) H(x1,x2)=H(x1)+H(x2)
信息量是大于等于0,肯定不可能是负的 H ( X ⩾ ) 0 H(X\geqslant) 0 H(X)0

构建一个函数,满足其上述的关系条件

  • H ( X ) = l o g 1 p ( x ) = − l o g p ( x ) H(X)=log\frac{1}{p(x)}=-logp(x) H(X)=logp(x)1=logp(x)
  • 对数函数的底数为2
  • 在信息学中,log的底数一般都为2。但是在机器学习中,底数经常是自然常数e。至于到底用哪一个,一般主要看哪个好用以及哪个好算(例如在下面进行证明的过程中,对数底数为e)
  • 该函数符合我们对信息量的直觉

2信息熵

请先在脑海里先记住信息熵是信息量的数学期望

我们想求关于 H ( X ) H(X) H(X)在以 p ( x ) p(x) p(x)分布下的 H ( X ) H(X) H(X)的数学期望
E n t r o p y ( X ) = − ∑ x p ( x ) l o g H ( X ) Entropy(X)=-\sum_xp(x)logH(X) Entropy(X)=xp(x)logH(X)

1.3证明 0 ⩽ H ( p ) ⩽ l o g n 0\leqslant H(p)\leqslant logn 0H(p)logn

利用拉格朗日函数证明

  • 目标函数

    H ( p ) = − p ( 1 ) l o g p ( 1 ) − p ( 2 ) l o g p ( 2 ) . . . − p ( n ) l o g p ( n ) H(p)=-p(1)logp(1)-p(2)logp(2)...- p(n)logp(n) H(p)=p(1)logp(1)p(2)logp(2)...p(n)logp(n)

  • 限定条件

    p ( 1 ) + p ( 2 ) + . . . + p ( n ) = 1 p(1)+p(2)+...+p(n)=1 p(1)+p(2)+...+p(n)=1

  • 构建拉格朗日函数

    L ( p ( 1 ) , p ( 2 ) , . . . p ( n ) , λ ) = − p ( 1 ) l o g p ( 1 ) − . . . − p ( n ) l o g p ( n ) + λ ( p ( 1 ) + . . . p ( n ) − 1 ) L(p(1),p(2),...p(n),\lambda)=-p(1)logp(1)-...-p(n)logp(n)+\lambda(p(1)+...p(n)-1) L(p(1),p(2),...p(n),λ)=p(1)logp(1)...p(n)logp(n)+λ(p(1)+...p(n)1)

    对p(1)偏导等于0

    λ − l o g ( e ∗ p ( 1 ) ) = 0 \lambda-log(e*p(1))=0 λlog(ep(1))=0

    对p(n)偏导等于0

    λ − l o g ( e ∗ p ( n ) ) = 0 \lambda-log(e*p(n))=0 λlog(ep(n))=0

    对其 λ \lambda λ偏导等于0

    p ( 1 ) + p ( 2 ) + . . . + p ( n ) − 1 = 0 p(1)+p(2)+...+p(n)-1=0 p(1)+p(2)+...+p(n)1=0

    求得:

    p ( 1 ) = p ( 2 ) = . . . = p ( n ) = 1 n p(1)=p(2)=...=p(n)=\frac{1}{n} p(1)=p(2)=...=p(n)=n1

    代入目标函数得到极值

    f ( 1 n , 1 n , . . . , 1 n ) = − ( 1 n l o g 1 n + . . . + 1 n l o g 1 n ) f(\frac{1}{n},\frac{1}{n},...,\frac{1}{n})=-(\frac{1}{n}log\frac{1}{n}+...+\frac{1}{n}log\frac{1}{n}) f(n1,n1,...,n1)=(n1logn1+...+n1logn1)
    = − l o g ( 1 n ) =-log(\frac{1}{n}) =log(n1)

    = l o g n =logn =logn

信息量是对信息的度量,若没有信息时就为0,不可能出现负数的情况,得证为

0 ⩽ H ( p ) ⩽ l o g n 0\leqslant H(p)\leqslant logn 0H(p)logn

2 条件熵(Conditional entropy)

2.1公式理解

设有随机变量(X,Y),其联合概率分布为 P ( X = x i , Y = y j ) = p i j , i = 1... n , j = 1... m P(X=x_i,Y=y_j)=p_{ij},i=1...n,j=1...m P(X=xi,Y=yj)=pij,i=1...n,j=1...m

条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵(conditional entropy)H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望

“相关的”信息能够消除不确定性
H ( Y ∣ X ) = ∑ I = 1 m p i H ( Y ∣ X = x i ) H(Y|X)=\sum_{I=1}^{m}p_iH(Y|X=x_i) H(YX)=I=1mpiH(YX=xi)
这里 p i p_i pi=P(X= x i x_i xi),i=1,2,…n

2.2条件熵的定义式:

( X , Y ) (X,Y) (X,Y)发生所包含的熵,减去X单独发生包含的熵:在X发生的前提下,Y发生“新”带来的熵

H ( X , Y ) − H ( X ) H(X,Y)-H(X) H(X,Y)H(X)
= − ∑ x , y l o g ( x , y ) p ( x , y ) + ∑ x p ( x ) l o g p ( x ) = -\sum_{x,y}log(x,y)p(x,y)+\sum_xp(x)logp(x) =x,ylog(x,y)p(x,y)+xp(x)logp(x)
= − ∑ x , y l o g ( x , y ) p ( x , y ) + ∑ x ( ∑ y p ( x , y ) ) l o g p ( x ) =-\sum_{x,y}log(x,y)p(x,y)+\sum_x(\sum_yp(x,y))logp(x) =x,ylog(x,y)p(x,y)+x(yp(x,y))logp(x)
= − ∑ x , y l o g ( x , y ) p ( x , y ) + ∑ x , y p ( x , y ) l o g p ( x ) =-\sum_{x,y}log(x,y)p(x,y)+\sum_{x,y}p(x,y)logp(x) =x,ylog(x,y)p(x,y)+x,yp(x,y)logp(x)
= − ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) =-\sum_{x,y}p(x,y)log\frac{p(x,y)}{p(x)} =x,yp(x,y)logp(x)p(x,y)
= − ∑ x , y p ( x , y ) l o g p ( y ∣ x ) =-\sum_{x,y}p(x,y)logp(y|x) =x,yp(x,y)logp(yx)

H ( X , Y ) − H ( X ) = − ∑ x , y p ( x , y ) l o g p ( y ∣ x ) H(X,Y)-H(X)=-\sum_{x,y}p(x,y)logp(y|x) H(X,Y)H(X)=x,yp(x,y)logp(yx)
= − ∑ x ∑ y p ( x , y ) l o g p ( y ∣ x ) =-\sum_x\sum_yp(x,y)logp(y|x) =xyp(x,y)logp(yx)
= − ∑ x p ( x ) ( ∑ y p ( y ∣ x ) l o g p ( y ∣ x ) ) =-\sum_xp(x)(\sum_yp(y|x)logp(y|x)) =xp(x)(yp(yx)logp(yx))
= ∑ x p ( x ) H ( Y ∣ X = x ) =\sum_xp(x)H(Y|X=x) =xp(x)H(YX=x)

3 联合熵:

对服从联合分布为 p ( x , y ) p(x,y) p(x,y)的一对离散随机变量 ( X , Y ) (X,Y) (X,Y),其联合熵 H ( X , Y ) H(X,Y) H(X,Y)可表示为
H ( X , Y ) = − ∑ x ∈ X ∑ y ∈ Y p ( x , y ) l o g p ( x , y ) H(X,Y)=-\sum_{x\in X}\sum_{y\in Y}p(x,y)logp(x,y) H(X,Y)=xXyYp(x,y)logp(x,y)

4 边缘概率

当X和Y都是离散型随机变量时,X和Y的联合概率分布列了一定义为 p ( x , y ) p(x,y) p(x,y)

  • 利用 p ( x , y ) p(x,y) p(x,y)可得 X X X的分布列

    p X ( x ) = P ( X = x ) = ∑ y p ( x , y ) p_X(x)=P(X=x)=\sum_{y}p(x,y) pX(x)=P(X=x)=yp(x,y)

  • 利用 p ( x , y ) p(x,y) p(x,y)可得 Y Y Y的分布列

p Y ( y ) = P ( Y = y ) = ∑ x p ( x , y ) p_Y(y)=P(Y=y)=\sum_{x}p(x,y) pY(y)=P(Y=y)=xp(x,y)

5 互信息:

5.1公式理解

两个随机变量X,Y的互信息,定义为X,Y的联合分布和独立分布乘积的相对熵

  • 度量两个随机变量的“相关性”
  • 互信息就是随机事件X的不确定性或者说熵H(X),以及在知道随机事件Y条件下的不确定性(条件熵)的差异
    I ( X , Y ) = D ( P ( X , Y ) ∣ ∣ P ( X ) P ( Y ) ) I(X,Y)=D(P(X,Y)||P(X)P(Y)) I(X,Y)=D(P(X,Y)P(X)P(Y))
    I ( X , Y ) = ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I(X,Y)=\sum_{x,y}p(x,y)log\frac{p(x,y)}{p(x)p(y)} I(X,Y)=x,yp(x,y)logp(x)p(y)p(x,y)
    I ( X , Y ) = H ( X ) − H ( X ∣ Y ) I(X,Y)=H(X)-H(X|Y) I(X,Y)=H(X)H(XY)
5.2 互信息的定义式:

I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X,Y)=H(X)+H(Y)-H(X,Y) I(X,Y)=H(X)+H(Y)H(X,Y)
= − ∑ x p ( x ) l o g p ( x ) + ( − ∑ y p ( y ) l o g p ( y ) ) − ( − ∑ x , y p ( x , y ) l o g p ( x , y ) ) =-\sum_xp(x)logp(x)+(-\sum_yp(y)logp(y))-(-\sum_{x,y}p(x,y)logp(x,y)) =xp(x)logp(x)+(yp(y)logp(y))(x,yp(x,y)logp(x,y))
= ( − ∑ x ( ∑ y p ( x , y ) l o g p ( x ) ) + ( − ∑ y ( ∑ x p ( x , y ) l o g p ( y ) + ∑ x , y p ( x , y ) l o g p ( x , y ) =(-\sum_x(\sum_yp(x,y)logp(x))+(-\sum_y(\sum_xp(x,y)logp(y)+\sum_{x,y}p(x,y)logp(x,y) =(x(yp(x,y)logp(x))+(y(xp(x,y)logp(y)+x,yp(x,y)logp(x,y)
= − ∑ x , y p ( x , y ) l o g p ( x ) − ∑ x , y p ( x , y ) l o g p ( y ) + ∑ x , y l o g p ( x , y ) =-\sum_{x,y}p(x,y)logp(x)-\sum_{x,y}p(x,y)logp(y)+\sum_{x,y}logp(x,y) =x,yp(x,y)logp(x)x,yp(x,y)logp(y)+x,ylogp(x,y)
= ∑ x , y p ( x , y ) ( l o g p ( x , y ) − l o g p ( x ) − l o g p ( y ) ) =\sum_{x,y}p(x,y)(logp(x,y)-logp(x)-logp(y)) =x,yp(x,y)(logp(x,y)logp(x)logp(y))
= ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) =\sum_{x,y}p(x,y)log\frac{p(x,y)}{p(x)p(y)} =x,yp(x,y)logp(x)p(y)p(x,y)

6 相对熵:

相对熵又称交叉熵,KL散度等
如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异

p(X),q(X)的比值取对数之后,在p(X)的概率分布上求期望
D ( p ∣ ∣ q ) = ∑ x p ( x ) l o g p ( x ) q ( x ) = E p l o g p ( x ) q ( x ) D(p||q)=\sum_{x}p(x)log\frac{p(x)}{q(x)}=E_plog\frac{p(x)}{q(x)} D(pq)=xp(x)logq(x)p(x)=Eplogq(x)p(x)
说明:相对熵可以度量两个随机变量的“距离”

7 交叉熵:

由相对熵公式变形得:
D ( p ∣ ∣ q ) = ∑ x p ( x ) l o g p ( x ) q ( x ) D(p||q)=\sum_xp(x)log\frac{p(x)}{q(x)} D(pq)=xp(x)logq(x)p(x)
= ∑ x p ( x ) l o g p ( x ) − ∑ x p ( x ) l o g q ( x ) =\sum_xp(x)logp(x)-\sum_xp(x)logq(x) =xp(x)logp(x)xp(x)logq(x)
= − H ( p ) + ( − ∑ x p ( x ) l o g q ( x ) ) =-H(p)+(-\sum_xp(x)logq(x)) =H(p)+(xp(x)logq(x))

等式的前一部分就是p的熵,等式的后一部分,就是交叉熵

H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=-\sum_xp(x)logq(x) H(p,q)=xp(x)logq(x)

在机器学习中,我们需要评估 y y y y ^ \hat{y} y^之间的差距,使用KL散度刚刚好,即 D ( y ∣ ∣ y ^ ) D(y||\hat{y}) D(yy^)(也就是 p ( x ) p(x) p(x), q ( x ) q(x) q(x)),由于KL散度中的前一部分$−H(y)4不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。

8 回顾LR中的交叉熵

LR交叉熵公式
$$L(\theta)=\sum_{i=1}{m}[-yilogh_{\theta}(xi)+(1-yi)log(1-h_{\theta}(x^i))]

上式中的 y i y^i yi是真实数据, h θ ( x i ) h_{\theta}(x^i) hθ(xi)是预测出来的数据分布(模型),我们一直想要做的是训练数据上学到的模型与真实数据分布越接近越好,即loss function最小,所以我们需要交叉熵越小越好。

综上所述,我们一直想要做的就是最小化误差(训练数据与模型上的分布的差异),即最小化相对熵。又因为前一部分-H(y)不变,最小化相对熵也就是最小化交叉熵。

得证,交叉熵可以用来计算模型分布与真实数据分布之间的差异

9计算给定数据集的香农熵:

写code之前,请查看公式

import numpy as np
def cancShannonEnt(dataSet):
    '''
    :param dataSet: dataSet
    :return: shannonEnt
    '''
    # 计算公式前,注意数据的格式(array)
    numEntries = len(dataSet)   # 获取数据的行数
    labelCounts = { }    # 设置字典数据格式,想要存储的数据格式为:类别:频数
    for featVec in dataSet:   # 获取数据集每一行的数据
        currentLabel = featVec[-1]   # 获取特征向量的最后一列
        # 检查字典中key是否存在
        # 如果key不存在
        if currentLabel not in labelCounts.keys():
            # 将当前的标签存于字典中,并将频数置为0
            labelCounts[currentLabel] = 0
        # 如果key存在,在当前的键值上+1
        labelCounts[currentLabel] +=1
    
    # 数据已准备好,计算熵
    shannonEnt = 0.0          # 初始化信息熵
    for key in labelCounts:   # 遍历出数据中所的类别
        pro = float(labelCounts[key]) /numEntries   
        shannonEnt -= pro * np.log2(pro)  # 计算信息熵
    return shannonEnt                       # 返回信息熵

参考书籍:

  1. 《数学之美》
  2. 《机器学习实战》
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

熵的概念理解 的相关文章

随机推荐

  • Transformer的稳健性更好吗?

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 本文作者 Greene 来源 知乎 已获作者授权 https zhuanlan zhihu com p 361105702 最近 Transformer 在计算机视觉遍
  • Spring七大组件

    一 Spring七大组件 1 核心容器 Spring core Spring core相当于一个创建并管理bean的容器 创建 底层使用反射技术创建bean的实例 管理 容器中的每个bean spring容器默认按照单例模式管理 设计 使用
  • Unity-网络开发(一)

    网络基本概念 网络 网络的作用 在没有网络之前 每个人的设备 电脑等 都是彼此孤立的 网络的出现让设备之间可以相互通信 网络是由若干设备和连接这些设备的链路构成 各种设备 间接或者直接通过介质相连 设备之间想要进行信息传递时 将想要传递的数
  • idea中Git设置(http/ssh)方式

    最近用IDEA上的git功能出现了可以commit但无法push和pull的问题 测试发现原因是Could not read from remote repository 在Stack Overflow上发现了解决方法 在Settings
  • python构建发布_Python代码的构建与发布(Windows环境)

    1 首先将写好注释的代码保存在一个文件夹nester下 2 在这个文件夹下创建一个文件setup py 用来编辑模块的元数据 from distutils core import setup 从发布工具导入setup函数 setup nam
  • 什么叫持久化? 为什么持久化?(转)

    1 应用程序层次结构演变 这里本来应该有张描述应用程序结构演变的图 可是CSDN在这里上传不了 所以没有传上来 纵观几十年的计算机应用软件的演变过程 应用程序逐渐由单层体系结构发展为多层体系结构 最初应用软件只是在大型机上的单层应用程序 大
  • quill实现上传文件

    1 首先工具栏配置加上upload 如图 这时会发现上传图片没有显示出来 需要自定义一个上传的图标 在阿里云矢量图标库下载一个就可以了 2 图标样式修改 deep ql upload background url assets img up
  • JavaScript undeclared 与 undefined 的区别

    undefined 声明了变量 但是没有赋值 undeclared 没有声明变量就直接使用 如上图 num 就是undefined arr 则是 undeclared
  • 蓝桥杯Python初级测试题之省赛题1

    蓝桥杯Python初级测试题之省赛题1 1 统计成绩及格率和优秀率 题目描述 小L给学生们组织了一场考试 卷面总分为 100 分 每个学生的得分都是一个 0 到 100 的整数 如果得分至少是 60 分 则称为及格 如果得分至少为 85 分
  • C++实现矩阵乘法

    本贴分享用C 实现矩阵乘法计算的功能 具体内容请看代码和注释 这里单独说一明一部分代码块 1 采用vector lt vector
  • 【操作系统】王道考研 笔记总结目录(完结)

    写在前面 视频链接 是为了期末考和以后就业的笔记 第一章 操作系统 王道考研 p1 操作系统的概念 功能和目标 操作系统 王道考研 p2 操作系统的四个特征 操作系统 王道考研 p3 操作系统的发展与分类 操作系统 王道考研 p4 操作系统
  • Ruby简介 完全面对象 脚本 从人的角度编程(强大反射)

    Ruby 一种为简单快捷面向对象编程而创的脚本语言 在20世纪90年代由日本人松本行弘开发 遵守GPL协议和Ruby License 1 它的灵感与特性来自于Perl Smalltalk Eiffel Ada以及Lisp语言 由Ruby语言
  • 启动IDEA发现我的项目模块/代码没了

    依次点击 文件 项目结构 模块 导入模块
  • 【C++】基本数据类型

    C 基本数据类型是程序中最基本的数据类型 它们是构建复杂数据类型的基础 C 中的基本数据类型包括整型 浮点型 字符型和布尔型等 目录 基本数据类型 整型 浮点型 字符型 转义字符 字符串 布尔类型 sizeof 基本数据类型 整型 作用 用
  • 算法学习笔记——动态规划:不连续取值的前提下求最大总和

    LeetCode 198 打家劫舍 一排房屋 某房屋内的金额数为nums i 相邻房屋内的钱不能被同时取出 求最多能取出多少钱 nums 1 1 3 4 返回5 选择取出1 4 5 dp i 代表对于0 i号房屋 能取走的最大金额 依次考虑
  • python高级7.多任务--协程-迭代器

    迭代器 迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问完结束 迭代器只能往前不会后退 可迭代对象 iterable object 我们已经知道可以对list t
  • define()和defined()

    define 用来定义一个常量 define IN ADMIN true 定义一个IN ADMIN常量 defined 用来检测定义的常量是否存在 defined IN ADMIN 检测IN ADMIN是否存在 用处很大 比如你在一个页面上
  • 【数据库 Mysql查询系列】在sc表 中查询平均成绩高于75分的学生。

    和之前发的博文中涉及到的sc 表一样 本文不再展示表内容 直接上代码 select sno 学号 avg ifnull grade 0 平均成绩 from sc group by sno having avg ifnull grade 0
  • vue封装axios实现

    axios很多前端都应该是非常熟悉了 前端访问后端很多都是使用的它 今天我们使用vue来封装一个axios 首页我们新建一个request js文件并引入axios的依赖 import axios from axios 接着创建axios的
  • 熵的概念理解

    Author 修远 说明 本文为Datawhale下开源项目 李宏毅机器学习 决策树的补充内容 作者水平有限 还望学习者批评指正 Datawhale 学习目标 学习信息量计算 原理 学习信息熵 证明 0 H p