文章目录

  • 基础概念
    • 条件熵
  • 信息增益
  • 信息增益比
  • 决策树生成
    • ID3生成算法
    • 决策树剪枝
    • C4.5生成算法

基础概念

离散型变量X的概率分布是P(X)。它的H(X)orH(P){H(X) \; or \; H(P)}H(X)orH(P)越大,代表越均匀、越混乱、越不确定。熵的公式如下:
H(P)=−∑x∈XP(x)log⁡P(x){H(P)} = {- \sum_{x \in X}P(x) \log P(x)} H(P)=−x∈X∑​P(x)logP(x)
定义0log⁡0=00\log0=00log0=0,熵是非负的。熵只与XXX的分布有关,与XXX取值无关。当X服从均匀分布时,熵最大。

假设随机变量X只取两个值,如0和1。此时X的分布为:
H(p)=−plog2p−(1−p)log2(1−p)H(p)=-plog_2p-(1-p)log2(1-p) H(p)=−plog2​p−(1−p)log2(1−p)
此时,H§随着概率p的变换曲线如下图所示:

当p=0或者1时,随机变量完全是个确定值。所以熵达到了最小值,即H(p)=0H(p) = 0H(p)=0。但是当p0=p1=0.5p_0=p_1=0.5p0​=p1​=0.5时,不确定性最大,熵达到了最大值1。

条件熵

条件熵H(Y|X)类似于条件概率,它度量了我们的Y在知道X以后剩下的不确定性,即给定X的条件下,Y的条件概率分布的熵对X的数学期望。表达式如下:
H(Y∣X)=∑j=1np(xj)H(Y∣xj)=−∑i=1np(xi,yi)logp(yi∣xi)H(Y|X) = \sum\limits_{j=1}^{n}p(x_j)H(Y|x_j) = -\sum\limits_{i=1}^{n}p(x_i,y_i)logp(y_i|x_i) H(Y∣X)=j=1∑n​p(xj​)H(Y∣xj​)=−i=1∑n​p(xi​,yi​)logp(yi​∣xi​)
当熵和条件熵中的概率p由数据估计(常见的是用极大似然估计)得到的时,对应的熵和条件熵成为经验熵和经验条件熵。

信息增益

特征A对数据集D的信息增益g(D|A)定义为:集合D的经验熵H(D)与特征A给定的条件下DDD的经验条件熵H(D∣A)H(D|A)H(D∣A)之差:
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
一般的熵与条件熵的差也称为互信息。表示给定特征A使得数据集D不确定性减少的程度。显然不同的特征有不同的信息增益,使得信息增益最大的特征具有更强的分类能力。

信息增益算法:

输入:训练数据集DDD和特征AAA

输出:特征AAA对训练数据集DDD的信息增益g(D,A)g(D,A)g(D,A)

  1. 数据集DDD的经验熵H(D)=−∑k=1K∣Ck∣∣D∣log⁡2∣Ck∣∣D∣H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|}H(D)=−∑k=1K​∣D∣∣Ck​∣​log2​∣D∣∣Ck​∣​
  2. 特征AAA对数据集DDD的经验条件熵H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)=−∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log⁡2∣Dik∣∣Di∣H(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|}H(D∣A)=∑i=1n​∣D∣∣Di​∣​H(Di​)=−∑i=1n​∣D∣∣Di​∣​∑k=1K​∣Di​∣∣Dik​∣​log2​∣Di​∣∣Dik​∣​
  3. 信息增益g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)

其中,|D|表示样本个数。假设有K个类,每个类用CkC_kCk​表示,|CkC_kCk​|表示属于第k个类别的样本个数。特征A有n个不同的取值{α1,α2,...,αn\alpha_1, \alpha_2,..., \alpha_nα1​,α2​,...,αn​},那么用DiD_iDi​表示特征A取第i个值的样本集合,DikD_{ik}Dik​用于表示DiD_iDi​中属于第k个类别的样本集合。

举个例子:

首先计算经验熵H(D):
H(D)=−(915log2915+615log2615)=0.971H(D) = -(\frac{9}{15}log_2\frac{9}{15} + \frac{6}{15}log_2\frac{6}{15}) = 0.971 H(D)=−(159​log2​159​+156​log2​156​)=0.971
分别用A1,A2,A3,A4A_1,A_2,A_3,A_4A1​,A2​,A3​,A4​表示年龄、有工作、有房子、贷款情况4个特征,则有:
H(D∣A1)=515H(D1)+515H(D2)+515H(D3)=−515(35log235+25log225)−515(25log225+35log235)−515(45log245+15log215)=0.888\begin{aligned} H(D|A_1) &= \frac{5}{15}H(D1) + \frac{5}{15}H(D2) + \frac{5}{15}H(D3) \\ &= -\frac{5}{15}(\frac{3}{5}log_2\frac{3}{5} + \frac{2}{5}log_2\frac{2}{5}) - \frac{5}{15}(\frac{2}{5}log_2\frac{2}{5}\\ & \quad+ \frac{3}{5}log_2\frac{3}{5}) -\frac{5}{15}(\frac{4}{5}log_2\frac{4}{5} + \frac{1}{5}log_2\frac{1}{5})\\ &= 0.888 \end{aligned} H(D∣A1​)​=155​H(D1)+155​H(D2)+155​H(D3)=−155​(53​log2​53​+52​log2​52​)−155​(52​log2​52​+53​log2​53​)−155​(54​log2​54​+51​log2​51​)=0.888​
于是得到特征A1A_1A1​的信息增益为:
g(D∣A1)=H(D)−H(D∣A1)=0.083g(D|A_1) = H(D)-H(D|A_1) = 0.083 g(D∣A1​)=H(D)−H(D∣A1​)=0.083
同理可以得到:
g(D∣A2)=H(D)−H(D∣A2)=0.324g(D∣A3)=H(D)−H(D∣A3)=0.420g(D∣A4)=H(D)−H(D∣A4)=0.363g(D|A_2) = H(D)-H(D|A_2) = 0.324 \\ g(D|A_3) = H(D)-H(D|A_3) = 0.420 \\ g(D|A_4) = H(D)-H(D|A_4) = 0.363 g(D∣A2​)=H(D)−H(D∣A2​)=0.324g(D∣A3​)=H(D)−H(D∣A3​)=0.420g(D∣A4​)=H(D)−H(D∣A4​)=0.363
发现A3A_3A3​的信息增益最大,因此A3A_3A3​为最优特征。

信息增益比

以信息增益来筛选最优特征,会导致取值个数多的特征信息增益很大。例如我们把每条记录的唯一标识ID作为特征的话,那么每个ID的值都能唯一区分一条记录的类别,这样肯定会造成过拟合从而达不到我们预期的效果。

为此,我们引入了信息增益比来校正这一问题,用gR(D,A)g_R(D,A)gR​(D,A)表示:
gR(D,A)=g(D,A)HA(D)HA(D)=−∑i=1n∣Di∣∣D∣log2∣Di∣∣D∣g_R(D,A)= \frac{g(D,A)}{H_A(D)} \\ H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} gR​(D,A)=HA​(D)g(D,A)​HA​(D)=−i=1∑n​∣D∣∣Di​∣​log2​∣D∣∣Di​∣​
即信息增益比为 特征A的信息增益 与 D关于特征A各个取值的熵 之比。

决策树生成

前面提到的信息增益和信息增益比,可以用来衡量某个特征对样本的划分能力。基于之前讲到的内容,接下来介绍的ID3生成算法和C4.5生成算法。

ID3生成算法

输入:训练数据集DDD, 特征集AAA,阈值ϵ\epsilonϵ
输出:决策树TTT

  1. 如果DDD属于同一类CkC_kCk​,TTT为单节点树,类CkC_kCk​作为该节点的类标记,返回TTT
  2. 如果AAA是空集,置TTT为单节点树,实例数最多的类作为该节点类标记,返回TTT
  3. 计算ggg, 选择信息增益最大的特征AgA_gAg​
  4. 如果AgA_gAg​的信息增益小于ϵ\epsilonϵ,TTT为单节点树,DDD中实例数最大的类CkC_kCk​作为类标记,返回TTT
  5. AgA_gAg​的不同特征取值可以划分出若干非空子集DiD_iDi​,
  6. DiD_iDi​训练集,A−AgA-A_gA−Ag​为特征集,递归调用前面步骤,得到TiT_iTi​,返回TiT_iTi​

举个例子,由于特征A3A_3A3​的信息增益最大,所以选择对应的特征“有房子”作为决策树的根节点。根据A3A_3A3​取值的不同,导致树形成了“是”(D1D_1D1​)与“否”(D2)两个分支。对于两个分支,还需要继续对分支后的数据D1,D2D_1, D_2D1​,D2​分别找新的划分特征。对于D1D_1D1​中的样本而言,他们都是一个类别,所以作为叶节点。

例如对D2D_2D2​而言,需要从年龄、有工作、贷款情况中选择新特征:
g(D2∣A1)=H(D2)−H(D2∣A1)=0.251g(D2∣A2)=H(D2)−H(D2∣A2)=0.918g(D2∣A3)=H(D2)−H(D2∣A3)=0.474g(D_2|A_1) = H(D_2)-H(D_2|A_1) = 0.251 \\ g(D_2|A_2) = H(D_2)-H(D_2|A_2) = 0.918 \\ g(D_2|A_3) = H(D_2)-H(D_2|A_3) = 0.474 g(D2​∣A1​)=H(D2​)−H(D2​∣A1​)=0.251g(D2​∣A2​)=H(D2​)−H(D2​∣A2​)=0.918g(D2​∣A3​)=H(D2​)−H(D2​∣A3​)=0.474
于是,选择A2A_2A2​对应的特征“有工作”来继续划分数据集,由于“是”有工作的子集有3个样本,且这三个样本都属于同一个类别,于是这是一个叶节点。对于标记为“否”的分支的6个样本也都属于一个类别,所以也是一个叶节点。最终得到的决策树为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eweq9C8L-1589329455836)(F:\CSDN\树模型\决策树\assets\1589181996988.png)]

ID3算法不足之处:

  1. 容易过拟合
  2. 没有考虑连续特征的处理
  3. 没有考虑缺失值处理
  4. 偏好于将特征取值个数多的作为重要特征

决策树剪枝

越是复杂的决策树,越是容易过拟合,解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,这个过程称为剪枝。

剪枝往往通过极小化决策树整体的损失函数或者代价函数来实现。

树TTT的叶结点个数为∣T∣|T|∣T∣,ttt是树TTT的叶结点,该结点有NtN_tNt​个样本点,其中kkk类的样本点有NtkN_{tk}Ntk​个,Ht(T)H_t(T)Ht​(T)为叶结点ttt上的经验熵, α⩾0\alpha\geqslant 0α⩾0为参数,决策树学习的损失函数可以定义为
Cα(T)=∑i=1∣T∣NtHt(T)+α∣T∣C_\alpha(T)=\sum_{i=1}^{|T|}N_tH_t(T)+\alpha|T| Cα​(T)=i=1∑∣T∣​Nt​Ht​(T)+α∣T∣
其中
Ht(T)=−∑kNtkNtlog⁡NtkNtH_t(T)=-\sum_k\frac{N_{tk}}{N_t}\color{black}\log \frac{N_{tk}}{N_t} Ht​(T)=−k∑​Nt​Ntk​​logNt​Ntk​​

C(T)=∑t=1∣T∣NtHt(T)=−∑t=1∣T∣∑k=1KNtklog⁡NtkNtC(T)=\sum_{t=1}^{|T|}N_tH_t(T)\color{black}=-\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}\color{black}\log\frac{N_{tk}}{N_t} C(T)=t=1∑∣T∣​Nt​Ht​(T)=−t=1∑∣T∣​k=1∑K​Ntk​logNt​Ntk​​

这时有
Cα(T)=C(T)+α∣T∣C_\alpha(T)=C(T)+\alpha|T| Cα​(T)=C(T)+α∣T∣
其中C(T)C(T)C(T)表示模型对训练数据的误差,∣T∣|T|∣T∣表示模型复杂度,参数α⩾0\alpha \geqslant 0α⩾0控制两者之间的影响。

树的剪枝算法如下:

输入:生成算法生成的整个树TTT,参数α\alphaα

输出:修剪后的子树TαT_\alphaTα​

  1. 计算每个叶结点的经验熵

  2. 递归的从树的叶结点向上回溯
    假设一组叶结点回溯到其父结点之前与之后的整体树分别是TBT_BTB​和TAT_ATA​,其对应的损失函数分别是Cα(TA)C_\alpha(T_A)Cα​(TA​)和Cα(TB)C_\alpha(T_B)Cα​(TB​),如果Cα(TA)⩽Cα(TB)C_\alpha(T_A)\leqslant C_\alpha(T_B)Cα​(TA​)⩽Cα​(TB​)则进行剪枝,即将父结点变为新的叶结点:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjC6Z4fY-1589329455839)(F:\CSDN\树模型\决策树\assets\1589188171003.png)]

  3. 返回2,直至不能继续为止,得到损失函数最小的子树TαT_\alphaTα​

C4.5生成算法

对于ID3算法的第一个缺陷,C4.5算法可以通过剪枝的方式,增强了模型的泛化能力。

对于第二个缺陷:不能处理连续特征, C4.5的思路是将连续的特征离散化。比如特征A的连续特征值有n个,从小到大排列为a1,a2,...,an{a_1,a_2,...,a_n}a1​,a2​,...,an​,则C4.5取相邻两样本值的平均数,一共取得n-1个划分点,其中第i个划分点Ti表示T_i表示Ti​表示为:Ti=ai+ai+12T_i = \frac{a_i+a_{i+1}}{2}Ti​=2ai​+ai+1​​。对于这n-1个点,分别计算以该点作为二元分类点时的信息增益:
g(D,a)=H(D)−H(D∣a)g(D,a)=H(D)-H(D|a) g(D,a)=H(D)−H(D∣a)
选择n-1个信息增益中最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为ata_tat​,则小于ata_tat​的值为类别1,大于ata_tat​的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

对于第三个缺陷:没有考虑对缺失值的处理。C4.5主要解决两个问题:

(1)如何在属性值缺失的情况下进行划分属性选择?

(2)给定划分属性,若样本在该属性上缺失,如何对样本进行划分?

对于问题(1),给定训练集D和属性A,令D^\hat DD^ 表示D中在属性A上没有缺失值的样本子集。假定A的取值有v个:{a1,a2,…,av}\{a_1,a_2,\ldots,a_v\}{a1​,a2​,…,av​},令D^v\hat D^vD^v 表示在属性A上取值为ava_vav​ 的样本子集(如:是否有工作)。D^k\hat D_kD^k​ 表示D^\hat DD^ 中第k类样本子集。为每一个样本xxx赋予一个权重wxw_xwx​,定义:

对于属性A,无缺失样本所占的比例为:
ρ=∑x∈D^wx∑x∈Dwx\rho = \frac{\sum_{x\in\hat D} w_ \mathbf x}{\sum_{x\in D} w_ \mathbf x} ρ=∑x∈D​wx​∑x∈D^​wx​​
无缺失样本中第k类所占的比例为:
p^k=∑x∈D^kwx∑x∈D^wx\hat p_k =\frac{\sum_{x\in\hat D_k} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x} p^​k​=∑x∈D^​wx​∑x∈D^k​​wx​​
无缺失样本中在属性A上取值为ava_vav​ 的样本所占的比例为:
r^v=∑x∈D^vwx∑x∈D^wx\hat r_v =\frac{\sum_{x\in\hat D^v} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x} r^v​=∑x∈D^​wx​∑x∈D^v​wx​​
样本存在缺失值的情况下,采用以下的信息增益计算方式:
g(D,A)=ρ×g(D^,A)=ρ×(H(D^)−H(D^∣A))\begin{aligned} g(D,A)&=\rho \times g(\hat D,A) \\ &= \rho \times \left(H(\hat D)-H(\hat D|A)\right) \end{aligned} g(D,A)​=ρ×g(D^,A)=ρ×(H(D^)−H(D^∣A))​
其中:
H(D^)=−∑k=1kp^klog⁡2p^kH(D^∣A)=∑v=1vr^vH(D^v)H(\hat D)=-\sum_{k=1}^k\hat p_k\log_2\hat p_k\\ H(\hat D|A) = \sum_{v=1}^v \hat r_v H(\hat D^v) H(D^)=−k=1∑k​p^​k​log2​p^​k​H(D^∣A)=v=1∑v​r^v​H(D^v)
其实就是:第一步先计算无缺失值的样本的各个特征的信息增益,然后乘以该特征的无缺失样本的占比。再选择信息增益最大的特征作为划分特征。这也就回答了第一个问题。

对于问题(2),可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。

对于第四个缺陷:特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。即采用信息增益比来选择特征:
gR(D,A)=g(D,A)HA(D)HA(D)=−∑i=1nDiDlog2DiDg_R(D,A)=\frac{g(D,A)}{H_A(D)}\\ H_A(D)=-\sum_{i=1}^n\frac{D_i}{D}log_2\frac{D_i}{D} gR​(D,A)=HA​(D)g(D,A)​HA​(D)=−i=1∑n​DDi​​log2​DDi​​
C4.5 算法流程如下:

输入:训练数据集DDD,特征集AAA,阈值ϵ\epsilonϵ
输出:决策树TTT

  1. 如果DDD属于同一类CkC_kCk​,TTT为单节点树,类CkC_kCk​作为该节点的类标记,返回TTT
  2. 如果AAA是空集, 置TTT为单节点树,实例数最多的作为该节点类标记,返回TTT
  3. 计算ggg, 选择信息增益比最大的特征AgA_gAg​
  4. 如果AgA_gAg​的信息增益比小于ϵ\epsilonϵ,TTT为单节点树,DDD中实例数最大的类CkC_kCk​作为类标记,返回TTT
  5. AgA_gAg​划分若干非空子集DiD_iDi​,
  6. DiD_iDi​训练集,A−AgA-A_gA−Ag​为特征集,递归调用前面步骤,得到TiT_iTi​,返回TiT_iTi​

ID3和C4.5在生成上,差异只是准则不同。

C4.5 同样具有局限性,仍然有优化的空间:

  1. C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。

  2. C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。

  3. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

下一篇介绍的使用CART算法生成的决策树一定程度上解决了这些问题。

参考文章:

《统计学习方法 第二版》

决策树算法原理(上)

决策树算法原理(下)

基于ID3、C4.5算法的决策树相关知识相关推荐

  1. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

  2. 决策树Decision Tree+ID3+C4.5算法实战

    决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...

  3. R语言 CART算法和C4.5算法(决策树)

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 R版本:3.4.4 最新的R官网取消了mvpart包,有需要的可以留言或者加微信,我用R3.6.1版本的显示这个包不能使用. 还需要安装jav ...

  4. 基于蚁群优化算法的特征选择相关文献

    Dorigo等人在20世纪90年代初提出了蚁群优化算法(Ant colony optimization ,ACO).ACO是一种元启发式群智能算法,旨在解决组合优化问题.它利用了真实蚂蚁的觅食行为,由 ...

  5. 算法与程序设计相关知识

    编写计算机程序解决问题的基本过程 五步: 分析问题.设计算法.编写程序.调试运行.检测结果. 算法的概念,掌握算法的描述方法,能从简单问题出发,设计出解决实际问题的算法: 算法概念:一种解决问题的方法 ...

  6. 决策树 基于python实现ID3,C4.5,CART算法

    实验目录 实验环境 简介 决策树(decision tree) 信息熵 信息增益(应用于ID3算法) 信息增益率(在C4.5算法中使用) 基尼指数(被用于CART算法) 实验准备 数据集 算法大体流程 ...

  7. 决策树挑出好西瓜(基于ID3、C4.6、CART实现)

    文章目录 一.决策树介绍 利用信息增益选择最优划分属性 二.实现针对西瓜数据集的ID3算法代码,并输出可视化结果. 1.西瓜数据集 2. 代码实现 (1)建立决策树 (2)绘制决策树 三.C4.5方法 ...

  8. 决策树模型 - (ID3算法、C4.5算法) - Python代码实现

    目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...

  9. 决策树(1)——ID3算法与C4.5算法的理论基础与python实现

    1.前言   决策树是一种常用的机器学习算法,既可以做分类任务也可以做回归任务,本文主要讨论用于分类任务的决策树.决策树与数据结构中的树相同,也是由一个根结点.若干个内部结点和若干个叶结点构成.这里我 ...

最新文章

  1. 关于spring service层的mybatis缓存问题,待解决
  2. 解密jQuery事件核心 - 绑定设计(一)
  3. python中的1怎么用的_python中的[:-1]和[::-1]的具体使用
  4. Linux监听进程是否存在,并加入定时任务
  5. 深度学习已经取得的进展
  6. /sys/class/gpio 文件接口操作IO端口(s3c2440)
  7. 漫画:什么是MapReduce
  8. 网络设备巨头优倍快的客户数据遭泄露
  9. xilinx sdk文本编辑器显示行数
  10. 《Unity_5.X_3D游戏开发技术详解与典型案例》pdf
  11. python人脸比对算法_Python的人脸识别,欧式距离比对,机器训练,人脸采集,离线识别...
  12. Hulu热招 | ADI广告数据和算法团队
  13. cuba-platform和jmix框架
  14. 支付宝相关服务申请入口
  15. IBM副总裁胡世忠:数据是新的自然资源
  16. WIN10插上耳机还是声音外放
  17. linux之上运行Vxworks,在MPSoC上能同时运行VxWorks和Linux吗?
  18. UEFI 界面实例解析
  19. 面试必备--手写Promise.all与.race
  20. 浅析文本挖掘(jieba模块的应用)

热门文章

  1. 支持向量机的最大分类间隔(转)
  2. tensorflow学习笔记:tf.data.Dataset,from_tensor_slices(),shuffle(),batch()的用法
  3. python随机生成10个整数列表_python_随机产生10个整数后找出最小值,最大值。
  4. MySql---数据库笔记(功能齐全)
  5. grep命令---Linux学习笔记
  6. Base64加密---加密学习笔记(一)
  7. vivo9.0系统设备最简单激活XPOSED框架的步骤
  8. Centos 7 文件管理基础命令
  9. 《Debug Hacks》和调试技巧【转】
  10. tabBar颜色改动