【神经网络】6.1 神经网络基础

6.1 神经网络基础

发展历程

在这里插入图片描述

1 三层神经网络
  • 输入层(红色表示)
  • 隐藏层(紫色表示)
  • 输出层(绿色表示)
    在这里插入图片描述

图中最左边的一层(红色表示)称为输入层,位于这一层的神经元称为输入神经元。最右边的一层(绿色表示)称为输出层,它包含了2个输出神经元。中间紫色部分的那一层称为隐藏层。
一个神经网络的隐藏层可以有很多,可以简单地理解为,如果一个层既不是输入层也不是输出层,那么就可以称其为隐藏层。如图所示的神经网络中只包含了一个隐藏层(单层神经网络),也有些网络拥有许多隐藏层(多层神经网络),比如下图所示的四层网络结构,其包含了两个隐藏层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaAvbcs4-1649210431034)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406081023670.png)]

2 神经元模型

在神经网络中,神经元模型是一个包含输入、输出与计算功能的模型。输入可以类比为神经元的树突,输出可以类比为神经元的轴突,而计算则可以类比为细胞核。图示的是一个典型的神经元模型:包含3个输入,1个输出,以及2个计算功能。注意中间的箭头线,这些线称为“连接”,每条连接线上都有一个“权重值”。

在这里插入图片描述

如图所示,一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测(或者分类)效果最好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pPdwHG8m-1649210431036)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406082155006.png)]

神经元数量对分类结果的影响
  • 过拟合

过拟合(和机器学习的概念一样)

训练数据(这里就是神经元)过多带来的过拟合现象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3jQxmZl-1649210431038)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406082537107.png)]

一般来说更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能会造成对训练数据的过拟合。
过拟合(Overfitting)是指网络对数据中的噪声有很强的拟合能力,而没有重视数据之间潜在的基本关系。过拟合就是学到了很多没必要的特征,学习的太过了,(举个例子:一个男人穿着蓝色的衣服,神经网络可能把是否穿蓝色衣服作为区分男人女人的特征,这就是过拟合)遇到了新样本这些错误的特征就没有什么用了。所以过拟合就是表现为训练的时候效果很好(因为神经网络已经学到了很多有用没用的特征),但是在测试样本上的效果就很差。至于为什么会产生过拟合,一般是因为参数过多,为了降低loss(神经网络的任务就是为了最小化loss),后者样本过少。总之就是参数/样本的比太大。

  • 神经元数量太少–效果不佳
3 激活函数
线性可分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KP2BIdyX-1649210431041)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406083507975.png)]

比如说,我们有4个圆圈,其中两个圆圈是红色,另外两个圆圈是黑色,如图所示。这样的布局是非常容易使用一条线来进行划分的。

线性不可分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e25DIXaA-1649210431043)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406083642998.png)]

但是在现实中,往往存在非常复杂的线性不可分的情况,
比如现在有一个二分类问题,我们要将下面的绿色圆点和红色圆点进行正确的分类,从如图所示的情形来看,很明显这是一个线性不可分的问题,也就是说,在这个平面里,找不到一条直线可以将图中的绿色圆点和红色圆点完全分开

激活函数的表达能力----解决线性不可分的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZPYNRGR-1649210431045)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406083757478.png)]

激活函数的作用就是,在所有的隐藏层之间添加一个激活函数,这里的激活函数我们使用的是Sigmoid函数(稍后篇章中,我们会详细介绍几个常见的激活函数)。这样输出的就是一个非线性函数了,有了这样的非线性激活函数以后,神经网络的表达能力更加强大了。
此时是否能够解决我们一开始提出的线性不可分问题呢?接下来我们验证一下。首先,我们观察下绿色圆点和红色圆点的分布,绿色圆点主要集中在中间位置,与此同时,红色圆点主要分布在四周。我们这里使用有2个隐藏层的神经网络,如果我们不使用激活函数,那么看到的效果将如左图所示,如果使用激活函数,那么看到的效果将如右图所示。

Sigmoid函数又称平滑函数和压缩函数。

每一层的输出通过这些激活函数之后,就会变得比以前复杂很多,从而提升了神经网络模型的表达能力。
对于隐藏层到输出层是否需要激活函数,则还需要根据经验来进行判断,一般来说,输出层最主要的任务是将输出结果与真实结果进行比较,然后通过反向传播更新权重。因为数据经过激活函数的输出之后区间是有范围的,所以一般情况下不会考虑在隐藏层与输出层之间使用激活函数(分类问题除外,如果面对的是二分类的问题,则可以考虑使用Sigmoid函数作为隐藏层和输出层之间的激活函数;如果面对的是多分类的问题,则可以考虑使用Softmax作为隐藏层和输出层之间的激活函数)。

激活函数必须使用非线性函数

如果继续使用非线性函数,那么原来的线性不可分的东西在通过了一个线性的函数之后那条线性的依然还是不能划分。

如果使用线性函数作为激活函数(通过增加隐藏层的层数,然后使用线性函数作为激活函数),那么是否可以达到非线性函数的效果,以此来解决线性不可分的问题?
答案肯定是不可以的,不管如何加深层数总会存在与之等效的“无隐藏层的神经网络”,这里我们考虑将线性函数 f ( x ) = w 1 ∗ x f(x)=w1*x f(x)=w1x作为激活函数(为了方便说明问题这里省略了bias),然后我们使用三层隐藏层,最后对应的结果就是 f ( x ) = w 3 ∗ ( w 2 ∗ ( w 1 ∗ x ) ) ) f(x)=w3*(w2*(w1*x))) f(x)=w3(w2(w1x))),稍加整理就是 f ( x ) = w 1 ∗ w 2 ∗ w 3 ∗ x f(x)=w1*w2*w3*x f(x)=w1w2w3x,这依然是一个线性函数。如果在三维空间里,则会变成一个超平面。因此激活函数必须使用非线性函数。

Sigmoid函数

1)Sigmoid的函数表达式具体如下:(一种压缩到0-1的Sigmoid函数)
p = 1 1 + e − z p = \frac{1}{1+e^{-z}} p=1+ez1
其中 z = θ 0 + θ 1 x 1 + θ 2 x 2 + … + θ n x n z=θ_0+θ_1x_1+θ_2x_2+…+θ_nx_n z=θ0+θ1x1+θ2x2++θnxn。该公式中,e约等于2.718,z是线性回归的方程式,p表示计算出来的概率,范围在0到1之间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vN1rrHmS-1649210431047)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406085035453.png)]

2)Sigmoid的变化

当x为0的时候,Sigmoid的函数值为0.5。

随着x的不断增大,对应的Sigmoid值将无限逼近于1;

随着x的不断减小,Sigmoid的值将不断逼近于0。所以它的值域是在(0,1)之间。

由于Sigmoid函数将实数范围内的数值压缩到了(0,1)之间,因此其也被称为压缩函数

3)Sigmoid的问题

Sigmoid函数之前曾被大量使用,但是近几年使用Sigmoid函数的人已经越来越少了,其主要原因是sigmoid函数会造成梯度消失;Sigmoid函数有一个非常不好的特点就是,其在靠近0和1这两端的时候,因为曲线变得非常的平缓,所以梯度几乎变为了0,我们在之前的篇章里曾提到过使用梯度下降法来更新参数(权重),因此如果梯度接近于0,那就几乎没有任何信息来更新了,这样会造成模型不收敛。
另外,如果使用Sigmoid函数,那么在初始化权重的时候也必须非常小心;如果初始化的时候权重太大,那么激活会导致大多数神经元变得饱和,从而没有办法更新参数了。

一般来说,人工神经网络是受大脑神经网络的启发提出的,但是这么简单说还是不清楚神经网络是怎么一回事。让我们从一个简单的数字识别谈起,看看神经网络到底是怎么一回事。

tanh双曲正切函数

双曲正切函数(hyperbolic tangent function)是双曲函数的一种。双曲正切函数在数学语言上一般写作 tan ⁡ h \tan h tanh,也可简写成th。

在这里插入图片描述

tan ⁡ h \tan h tanh是双曲正切函数 ,Tanh函数和Sigmoid函数的曲线是比较相近的。相同的是,这两个函数在输入很大或是很小的时候,输出都几乎是平滑的,当梯度很小时,将不利于权重更新
不同之处在于输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比Sigmoid要好。Tanh的直观效果如图所示。

函数公式:

函数导数:
优点: 函数输出以(0,0)为中点, 收敛速度相对于Sigmoid更快
缺点:

  • tanh并没有解决sigmoid梯度消失的问题-

  • 函数输出不是以 0 为中心的,这会降低权重更新的效率;

  • Sigmoid 函数执行指数运算,计算机运行得较慢。

ReLU函数

线性整流函数(Rectified Linear Unit,ReLU),又称为修正性线性单元,ReLU是一个分段函数,其公式为
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0x)
可视化显示如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n5f2lXfx-1649210431051)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406085659715.png)]

从图示的图形很容易就能理解的是,大于0的数将直接输出,小于0的数则输出为0,在0这个地方虽然不连续,但其也同样适合做激活函数。
ReLU是目前应用较为广泛的激活函数,其优点为在随机梯度下降的训练中收敛很快,在输入为正数的时候,不存在梯度饱和问题,ReLU函数只有线性关系,不管是前向传播还是反向传播都比Sigmoid函数要快很多Sigmoid要计算指数,计算速度会比较慢)。

Dead ReLU。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零,sigmoid 函数和 tanh 函数也具有相同的问题;

我们发现 ReLU 函数的输出为 0 或正数,这意味着 ReLU 函数不是以 0 为中心的函数。

4 前向传播

神经网络前向传递过程的四个关键步骤:
1)输入层的每个节点,都需要与隐藏层的每个节点做点对点的计算,计算的方法是加权求和+激活函数
2)利用隐藏层计算出的每个值,再使用相同的方法,与输出层进行计算(简单神经网络结构)。
3)隐藏层大量使用ReLU函数(之前广泛使用Sigmoid)作为激活函数,而输出层如果是二分类问题则一般使用Sigmoid函数;如果是多分类问题则一般使用Softmax作为激活函数。
4)起初输入层的数值将通过网络计算分别传播到隐藏层,再以相同的方式传播到输出层,最终的输出值将与样本值进行比较,计算出误差,这个过程称为前向传播。

例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j74W6Gkt-1649210431052)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406090508773.png)]

我们来举例说明,输入节点为两个,分别是X1和X2,其中X1=0.3、X2=-0.7,真实值Y为0.1,从图中,我们可以观察到输入层到隐藏层之间的神经元是相互连接的,想象一下,如果神经元过多,那么相互连接的链接将会非常的多,整个计算就会变得非常复杂,我们可能会有非常多的设计思路来改善连接方式,但是神经网络还是坚持了这种看似繁杂的设计架构,其主要原因是为了方便计算机的计算(矩阵运算),另一个原因是神经网络的学习过程将会慢慢弱化某些链接(即这些链接上的权重慢慢趋近于0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LG5He1Ys-1649210431054)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406090827129.png)]

下面再按照之前的步骤手动计算一下。对输入层到隐藏层的节点进行加权求和,结果分别如下。

  • 节点1的值为 X 1 ∗ W 1 + X 2 ∗ W 3 = 0.3 ∗ 0.2 + ( − 0.7 ) ∗ 0.8 = − 0.5 X1*W1+X2*W3=0.3*0.2+(-0.7)*0.8=-0.5 X1W1+X2W3=0.30.2+0.70.8=0.5
  • 节点2的值为 X 1 ∗ W 2 + X 2 ∗ W 4 = 0.3 ∗ ( − 0.7 ) + ( − 0.7 ) ∗ ( − 0.5 ) = 0.14 X1*W2+X2*W4=0.3*(-0.7)+(-0.7)*(-0.5)=0.14 X1W2+X2W4=0.3(0.7)+(0.7)(0.5)=0.14

接着对隐藏层的节点的值执行Sigmoid激活,结果分别如下。

  • sig节点1= 1 1 + e 0.5 = 0.378 \frac{1}{1+e^{0.5}}=0.378 1+e0.51=0.378

  • sig节点2= 1 1 + e 0.14 = 0.535 \frac{1}{1+e^{0.14}}=0.535 1+e0.141=0.535

    最后对隐藏层的输出到输出节点进行加权求和:
    0.378 ∗ 0.3 + 0.535 ∗ 0.5 = 0.381 0.378*0.3+0.535*0.5=0.381 0.3780.3+0.5350.5=0.381

    我们最后得到的Y的预测值为0.381,与真实值0.1存在一定的差距,那么,这个时候就需要使用反向传播来使预测值更接近真实值了(不断优化迭代,更新权重)

5 矩阵运算

之前的运算有点过于复杂,想象一下,如果层数比较多或者神经元比较多,那么通过上述这种方式来进行运算就非常耗时间了,所幸的是,有矩阵计算这样的方式来帮助我们快速运算。

在这里插入图片描述

下面再来看一个稍微复杂一点的例子,如图所示。对于节点1来说,其是通过 x 1 ∗ w 11 + x 2 ∗ w 21 + x 3 ∗ w 31 x1*w11+x2*w21+x3*w31 x1w11+x2w21+x3w31得到的,对于节点2是通过 x 1 ∗ w 12 + x 2 ∗ w 22 + x 3 ∗ w 32 x1*w12+x2*w22+x3*w32 x1w12+x2w22+x3w32得到,以此类推。如果结合矩阵运算知识,我们就可以写为如下这种形式:
在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74kevvtL-1649210431057)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406091246652.png)]

矩阵运算实例

矩阵运算更为简单,而且效果与我们手算的结果是一样的。
现在假设输入数据源是[0.9,0.1,0.8],顺便说一下,本例子只是一个简单的说明,里面的输入数据源以及权重都是无意义的,只是为了举例方便罢了,另外,不要去纠结为何对一个三分类使用的是Sigmoid激活函数,而不是使用Softmax,因为这里只是作为一个例子说明一下神经网络是如何进行前向传播计算的。示例代码具体如下:

import numpy as np
def _sigmoid(in_data):
    return 1 / (1 + np.exp(-in_data))
#输入层
x = np.array([0.9,0.1,0.8])
#隐藏层:需要计算输入到中间层每个节点的组合,中间隐藏层的每个节点都与输入层的每个节点相连所以w1是一个3*3的矩阵
#因此每个节点都得到输入信号的部分信息。
#第一个输入节点和中间隐藏层第一个节点之间的权重为w11=0.9,输入的第二个节点和隐藏层的第二节点之间的链接的权重为w22 = 0.8
w1 = np.array([[0.9,0.3,0.4],
               [0.2,0.8,0.2],
             [0.1,0.5,0.6]])
#因为输出层有3个节点,所以w2也是一个3*3的矩阵
w2 = np.array([
    [0.3,0.7,0.5],
    [0.6,0.5,0.2],
    [0.8,0.1,0.9]
])

Xhidden = _sigmoid(w1.dot(x))
print(Xhidden)
Xoutput = w2.dot(Xhidden)
print(Xoutput) #最终输出的结果
6 考虑bias

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sq3ObRTe-1649210431058)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406091554419.png)]

对于每一层的权重矩阵,又该如何确定其形状呢?第一层的W1的形状取决于输入层,本例中为2,输出为3,所以W1的形状为(2,3),以此类推,W2的形状为(3,2)、W3的形状为(2,2),bias的形状也比较容易确定,就是看输出层包含多少个神经元就是多少,比如第一层的bias就是(3,)。

  • 实例代码
import numpy as np
def _sigmoid(in_data):
    return 1 / (1 + np.exp(-in_data))
def init_network():
    network={}
    network['W1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
    network['b1']=np.array([0.1,0.2,0.3])
    network['W2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network['b2']=np.array([0.1,0.2])
    network['W3']=np.array([[0.1,0.3],[0.2,0.4]])
    network['b3']=np.array([0.1,0.2])
    return network

def forward(network,x):
    w1,w2,w3 = network['W1'],network['W2'],network['W3']
    b1,b2,b3 = network['b1'],network['b2'],network['b3']
    a1 = x.dot(w1) + b1
    z1 = _sigmoid(a1)
    a2 = z1.dot(w2) + b2
    z2 = _sigmoid(a2)
    a3 = z2.dot(w3) + b3
    y = a3
    return y

network = init_network()
x = np.array([1.0,0.5])
y = forward(network,x)
print(y)
7 输出层Softmax函数
7.1 基础

Sigmoid函数主要用于解决二分类问题,在图像分类问题上,大部分情况下,我们面对的还是多分类问题,对于多分类我们需要使用Softmax分类器Softmax分类器的输出是每个类别的概率。
在Logistic regression二分类问题中,我们可以使用Sigmoid函数将输入 W ∗ x + b W*x+b Wx+b映射到**(0,1)**区间中,从而得到属于某个类别的概率。这里我们将这个问题进行泛化;在处理多分类(C>2)的问题上,分类器最后的输出单元需要使用Softmax函数进行数值处理。Softmax函数的定义如下所示:
S i = e V i ∑ j c e V j S_i=\frac{e^{V_i}}{\sum_{j}^c e^{V_j}} Si=jceVjeVi

从输出其中,Vi表示的是分类器前级输出单元的输出。i表示类别索引,总的类别个数为C。Si表示的是当前元素的指数与所有元素指数和的比值。Softmax将多分类的输出数值转化为相对概率,因此更容易理解和比较。

将每一个类别求出的 除以类别总和,就可以得到概率,通过上式可以输出一个向量,其中,每个元素值均在0到1之间,且所有元素的概率之和为1。

实例

接下来看一下下面这个例子:一个多分类问题,C=4。线性分类器模型最后的输出层包含了4个输出值,分别是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EqTezVQF-1649210431060)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406092950203.png)]

经过Softmax处理后,数值转化为如下所示的相对概率:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHZtJvt7-1649210431060)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406092955343.png)]

很明显,Softmax的输出表征了不同类别之间的相对概率。我们可以清晰地看出,S1=0.8390,其对应的概率最大,因此可以清晰地判断出预测为第1类的可能性更大。
Softmax将连续数值转化成相对概率,更有利于我们进行理解。当我们运算的值比较小的时候是不会有什么问题的,但是如果运算的值很大或很小的时候,直接计算就会出现上溢出或下溢出,从而导致严重问题。
举个例子,对于[3,1,-3],直接计算是可行的,我们可以得到(0.88,0.12,0)。但是对于[1000,1001,1002],却并不可行,我们会得到inf(这也是深度学习训练过程常见的一个错误);对于[-1000,-999,-1000],还是不行,我们会得到-inf。

7.2 实际应用改进

实际应用中,需要对V进行一些数值处理:即V中的每个元素减去V中的最大值。

D = m a x ( V ) S i = e V i − D ∑ j c e V j − D D=max(V) \\ S_i=\frac{e^{V_i-D}}{\sum_{j}^c e^{V_j-D}} D=max(V)Si=jceVjDeViD

相应的Python示例代码如下:

#x为输入的向量
def _softmax(x):
    c = np.max(x)
    exp_x = np.exp(x-c)
    return exp_x / np.sum(exp_x)
scores = np.array([123, 456, 789]) # example with 3classes and each having large scores
p = _softmax(scores)
print(p)
7.3 Softmax在图像中的应用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZqcHsJp-1649210431061)(C:\Users\Jun\AppData\Roaming\Typora\typora-user-images\image-20220406095001498.png)]

下面我们来举例说明,我们把猫分为类1,狗分为类2小鸡分为类3,如果不属于以上任何一类就分到“其他”(或者说,“以上均不符合”)这一类,我们将这一类称为类0,如图所示,从左往右第一个图是一只小鸡,所以我们将它归到类3,以此类推,猫是类1,狗是类2,最右边的图是考拉,所以属于“以上均不符合”,因此将其归到类0。

假设我们输入了一张猫的图片,其对应的真实标签是0100(类别已经转换成one-hot编码形式)。
真值y为KaTeX parse error: Undefined control sequence: \pmatrix at position 1: \̲p̲m̲a̲t̲r̲i̲x̲{0\\1\\0\\0}其中,yi=1是1,其余都是0,经过Softmax计算之后得到的是预测值y_predict, 假设预测值为KaTeX parse error: Undefined control sequence: \pmatrix at position 1: \̲p̲m̲a̲t̲r̲i̲x̲{0.3\\0.2\\0.1\…,它是一个包括总和为1的概率的向量,对于这个样本,神经网络的表现不佳,这实际上是一只猫但是猫的概率只分配到20%,那么需要使用什么损失函数来训练这个神经网络呢?在Softmax分类中,我们用到的损失函数一般是交叉熵(后续篇章我们会详细讲解交叉熵,本节我们将主要关注输出层本身)。
一般来说,神经网络是将输出值最大的神经元所对应的类别作为识别结果,而且即使使用Softmax函数也只会改变值的大小而不能改变神经元的位置;另外指数函数的运算也需要一定的计算机运算量,因此可以考虑在多分类问题中省去Softmax函数。

7.4独热编码

独热码,在英文中称作one-hot code,直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0这一种码制。
这里之所以要讲解独热码,是因为后续篇章中会将标签转为one-hotencoding方式。本节中,我们只是简单介绍下独热码。
假如只有一个特征是离散值:
s e x : m a l e , f e m a l e , o t h e r {sex:{male,female,other}} sexmalefemaleother
。该特征总共包含3个不同的分类值,此时需要3个bit位表示该特征是什么值,bit位为1的位置对应于原特征的值。此时得到的独热码分别为:
100 男 性 、 010 女 性 、 001 其 他 。 {100}男性、{010}女性、{001}其他。 100010001
假如多个特征需要独热码编码,那么按照上面的方法依次将每个特征的独热码拼接起来就是:
s e x : m a l e , f e m a l e , o t h e r g r a d e : 一 年 级 , 二 年 级 , 三 年 级 , 四 年 级 {sex:{male, female,other}} \\ {grade:{一年级,二年级,三年级,四年级}} sexmalefemaleothergrade
此时对于输入 s e x : m a l e ; g r a d e : 四 年 级 {sex:male;grade:四年级} sexmalegrade进行独热码编码,可以首先将sex按照上面的内容进行编码得到{100},然后按照grade进行编码得到{0001},那么两者连接起来就能得到最后的独热码{1000001}。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值