1.激活函数,表达式,及其图像
- Sigmoid函数:也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
特点: 它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1. - Tanh / 双曲正切激活函数:在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层
- ReLU 激活函数:深度学习中较为流行,不存在梯度饱和问题且计算速度快。
- Leaky ReLU函数(PReLU)
- ELU (Exponential Linear Units) 函数
应用中如何选择合适的激活函数? 这个问题目前没有确定的方法,凭一些经验吧。 1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。 2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout. 3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
2.为什么在机器学习中引入激活函数,例如在房价预测中加入激活函数
- 什么是激活函数
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。 - 激活函数的用途(为什么需要激活函数)?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。 - 激活函数的作用:增加非线性因素,解决线性模型表达能力不足的缺陷。
3.简述随机梯度下降,批梯度下降的区别和各自优点
- 随机梯度下降(SGD, stochastic gradient descent):名字中已经体现了核心思想,随机选取一个店做梯度下降,而不是遍历所有样本后进行参数迭代。因为梯度下降法的代价函数计算需要遍历所有样本,而且是每次迭代都要遍历,直至达到局部最优解,在样本量庞大时就显得收敛速度比较慢了,计算量非常庞大。
随机梯度下降仅以当前样本点进行最小值求解,通常无法达到真正局部最优解,但可以比较接近。属于大样本兼顾计算成本的折中方案。 优点: ??(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。 - 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
优点: ??(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。 ??(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。 ?? 参考文章
4.线性判别分析(LDA)中,我们最想要优化的两个数值是什么(聚类算法也是以这两个数据为目标进行优化)
类内距离和类间距离 LDA的思想为画一条线,经所有样本点作垂线,而不同类的样本之间的垂足距离有着明显区别,从而实现分类效果,故我们最应该优化的数值为最小化类内样本垂足的距离,最大化类间样本垂足的距离,即优化类内距离和类间距离
5.请写出交叉熵损失函数
6.关于MLE(最大似然估计),下面哪一项或几项说法是正确的
MLE可能不存在/MLE总是存在/如果MLE存在,可能不是唯一的/如果MLE存在,肯定是唯一的 MLE可能不存在
如果MLE存在,可能不是唯一的
什么是似然什么是概率?
概率是不知道结果的情况下预测可能出现的结果,比如抛硬币猜哪面朝上
似然是在确定的结果下去推测产生这个结果的可能环境,比如拿到一枚正面朝上的硬币推测如何抛出。
用 θ 表示环境对应的参数,x 表示结果,那么概率可以表示为:P(x|θ)
首先有些分布不一定存在似然函数,其次似然函数不一定有最大值,比如非连续的分布。
8.下面回归模型哪个步骤/假设最能影响过拟合和欠拟合之间的平衡因素()
A.多项式的阶数
B.是否通过矩阵求逆或梯度下降学习权重
C.使用常数项
选择合适的多项式阶数非常重要。如果阶数过大,模型就会更加复杂,容易发生过拟合;如果阶数较小,模型就会过于简单,容易发生欠拟合。
9.以下关于线性回归和逻辑回归描述错误的是() A.线性回归要求因变量是连续性数值变量,而逻辑回归要求因变量是分类型变量 B.线性回归直接分析因变量与自变量的关系,而逻辑回归分析因变量取某个值的概率与自变量的关系 C.线性回归要求因变量是分类型变量,而逻辑回归要求因变量是连续性数值变量 D.逻辑回归的因变量可以是二分类的,也可以是多分类的
利用大量的样本D = ( x i , y i ) i = 1 N D={(x_i,y_i)}_{i=1}^ND=(x i ,y i) i=1N ,通过有监督的学习,学习到由x到y的映射f ff,利用该映射关系对未知的数据进行预估,因为y为连续值,所以是回归问题。 C错误
10.类别不平衡会带来什么影响,如何有效处理类别不平衡的问题
样本不平衡会使得我们的分类模型存在很严重的偏向性,但是从一些常用的指标上又无法看出来。举一个极端一点的例子,如果正负样本比例为100:1,那岂不是把全部样本都判定为正样本就有99%+的分类准确率了。从测试结果上来看,就表现为有太多的False Positive。 解决方法 在机器学习中,处理样本不平衡问题,主要有3种策略:从数据角度、从算法层面和模型评价层面。 参考文章
11.我们知道信息量的多少由信息的不确定性来衡量,信息量越大,信息的不确定性越大,信息熵的值越大。信息量越少,信息的不确定性越小,信息熵的值越小。请写出信息熵的公式。
12.回归任务中最常用的性能量度
均方误差
13.画出分类结果的混淆矩阵,并写出查准率P和查全率R
14.什么是假设检验?
假设检验(hypothesis testing),又称统计假设检验,是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。 假设检验(test of bypothesis)是统计推断的一个重要内容,用于判断某个假设是否正确。在数据分析中,总体的参数始终是不可知的,只能由统计量推断总体的参数。在统计推断过程中,需要对参数提出一定的假设,然后对提出的假设进行假设检验。 假设检验与参数估计(包括点估计和区间估计)是建立在中心极限定理和抽样分布之上的推断统 计的两个重要基础方法,由这两个方法出发,生发出诸多有针对性的统计分析方法。
15.评价一个模型的好坏一般用什么来评价
当说到预测模型时,我们会想到有回归模型和分类模型。用于评价这两种模型的度量是不相同的。我们首先要说的是分类问题。 在分类问题中,我们用两种算法:分类输出型:算法像支持向量机和KNN那样,输出的是分类型数据。例如一个二分类问题,它的输出不是0就是1。概率输出型:这个有逻辑回归、随机森林、梯度提升、Adaboost等算法,都是以概率作为输出的。要想把概率型输出变为分类型输出,只要为其设立一个阈值即可。
16.完整机器学习项目主要步骤
1、抽象成数学问题 2、获取数据 3、 特征预处理与特征选择 4 、训练模型与调优 5 、模型诊断 6、 模型融合/集成 7、 上线运行
17.定义一个学生类 一.有下面的类属性:姓名 年龄 成绩(语文、数学、英语)每课成绩的类型为整数 二.类方法 1.获取学生的姓名:get_name() 返回类型:str 2.获取学生的年龄:get_age() 返回类型:int 3.返回3门科目中的最高分:get_course() 返回类型:int
class student:
def __init__(self,name,age,score):
self.name=name
self.age=age
self.score=score
def get_name(self):
return self.name
def get_age(self):
return self.age
def get_course(self):
a=list(self.score.values())
return max(a)
student_1=student("张三",20,{"语文":100,'数学':90,'英语':80})
print(student_1.get_name())
print(student_1.get_age())
print(student_1.get_course())
18.__init __方法有什么作用,如何定义
__init __()这个特殊的方法就可以方便地自己对类的属性进行定义,init()方法又被称为构造器(constructor) 我们通过实现init()方法来初始化对象。当一个对象被创建,Python首先创建一个空对象,然后为那个新对象调用init()方法。这个方法函数通常用来创建对象的实例变量并执行任何其他一次性处理。 def __init __()
19.定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
class Fruit:
pass
apple = Fruit()
apple.color = "红色"
orange = Fruit()
orange.color = "橙色"
watermelon = Fruit()
watermelon = "绿色"
|