面经题总结 第1篇
推导完毕。
线性回归:
懒得推了,很简单的,最终的梯度的形式是一样的:
从上面的梯度计算公式可以看出来了,特征两个不一样,则W权重中的每一个wi的梯度更新量差异很大,量纲大的特征对应的权重w的梯度更新的量纲也大。导致梯度中的偏导差异极大,使得模型收敛很慢甚至无法收敛。
1/N(N表示样本数量)可以融合到learning xxxe里去理解,torch的损失函数里面也设计了 对loss进行平均和对loss进行求和,平均不求和的差异就在于每一个step对参数w的梯度更新量的差异为N(样本数量)倍,数据量很大时,会导致梯度更新量非常大,权重的变化会非常的剧烈,收敛困难,所以用1/N,不过其实learning xxxe缩小n倍达到的效果是一样的。
梯度表达式前面的以乘数的形式存在的常数项对梯度下降法的收敛没有任何的影响,本质上可以理解为learning xxxe的变化。
1、达到最大迭代次数
2、所有的权重的梯度更新量的值都小于预先设定的阈值
3、早停等.
这个地方很有意思,这涉及到我们怎么去定义线性还是非线性(1.根据模型的决策超平面来定义模型的线性和非线性,一般比较难,很难画出高维超平面;2.模型的参数是否是线性组合的,tree和nn的参数都是非线性组合的形式),如果从输出的角度来看,逻辑回归输出的是非线性的数据,经过sigmoid映射之后的输出值是非线性的:
但是如果我们从他的决策面来说,它又是超平面而不是曲面:
上述现象的原因是:
sigmoid函数就是一个纯粹的数学变换没有任何的可学习参数,我们的决策是直接根据右边的式子得到的,sigmoid只是负责映射成非线性的输出罢了,直观的说就是我们的逻辑回归的输出在进入sigmoid函数之前是图2这样的线性的值,经过sigmoid之后称为非线性的值,所以从决策平面的来说逻辑回归是线性模型,从输出来看逻辑回归是非线性模型,不过一般是从决策平面来定义线性和非线性的,所以我们还是将逻辑回归视为线性模型。
严格的定义:模型的参数是否是线性组合的
lr之所以能衍生出很多面试的问题,主要在于逻辑回归这个模型可以从很多角度解释,每个角度所代表的领域知识各不相同,是一个非常好的考察面试者的机器学习基础的问题,所以这种题目基本上不会断。
极xxx估计是一种参数估计的方法,它是频率学派最经典的方法之一,认为真实发生的结果的概率应该是最大的,那么相应的参数,也应该是能让这个状态发生的概率最大的参数。简单说就是如果事件发生了被我们观测到了,那么这个事件对应发生的概率一定是最大的才能被我们观测到否则就不会被我们观测到,所以当前的状态是这个事件发生概率最大的结果。
逻辑回归假设数据服从伯努利分布,则P(y|X)——在已知x的情况下y服从伯努利分布,通过极大化似然函数的方法,运用梯度下降或者拟xxx法等最优化方法来求解参数,以达到将数据二分类的目的。
逻辑回归与线性回归的区别(因为项目中有用到逻辑回归)、p值、假设检验、参数估计、方差和标准差的区别(自己平时如何使用他们)
LR为什么用sigmoid函数。这个函数有什么优点和缺点?为什么不用其他函数?sigmoid函数由那个指数族分布,加上二项分布导出来的。损失函数是由最xxx估计求出的。
为什么LR需要归一化或者取对数,为什么LR把特征离散化后效果更好
(1) 为什么可以用 Sigmoid 函数定义了逻辑回归的条件概率,
(2) 为什么要用:指数分布具有最大熵的性质,即在满足前提假设下的分布,分布越均匀越好.在逻辑回归中认为P(Y|x)服从伯努利二分布,并且P(y|x)=f(wx),可根据最大熵的性质推出sigmoid函数。
L0 范数:向量中非0元素的个数。
L1 范数 (Lasso Regularization):向量中各个元素绝对值的和。
L2 范数(Ridge Regression):向量中各元素平方和再求平方根。
L0 范数和 L1 范数都能够达到使参数稀疏的目的,但 L0 范数更难优化求解,L1 范数是 L0 范数的最优凸近似,而且它比 L0 范数要容易优化求解。
L2 范数不但可以防止过拟合,提高模型的泛化能力,还可以让我们的优化求解变得稳定和快速。L2 范数对大数和 outlier 更敏感!
面经题总结 第2篇
可以看到,是非常类似的,根号2pi部分取n次方,方差用协方差矩阵代替,代数的乘法转化为矩阵乘法;多元高斯分布的期望就是观测样本的(样本向量-所有特征向量的均值构成的均值向量)进行和自身的向量乘计算;
协方差矩阵:
协方差矩阵是一个nXn的矩阵,n代表了多元的大小,对于协方差矩阵中的每一个元素,计算公式如下:
具体展开来看就是:
协方差矩阵和相关系数的关系:
可以看到,相关系数的计算过程中,已经对变量做了均值方差的标准化处理了,所以对两个特征计算相关系数不需要考虑量纲大小的问题;
现实世界中,不同的特征(多个特征=多元)很难完全独立,因此我们也会使用非独立的多元高斯分布,公式写作:
面经题总结 第3篇
消费者以组的名义订阅主题,主题有多个分区,消费者组中有多个消费者实例: 1. 同一时刻,一条消息只能被组中的一个消费者实例消费 2. 如果分区数大于等于消费者,可根据消费者分区分配策略,一个消费者同时消费多个分区 如果分区数小于消费者,首先要知道,kafka在设计时要保证分区下消息的顺序,要做到这点首先消费者应该主动拉取(pull)数据,其次还要保证一个分区只能由一个消费者负责. 当两个消费者同时消费一个分区时,由于消费者自己可以控制读取消息的offset,就可能C1才读取到2,而C2读取到1,C1还未处理完,C2已经读到3了. 这就相当于多线程读取同一个消息,会造成消息的重复,且不能保证消息的顺序,跟主动推送(push)无异 3. 消费者分配策略: range 分配策略是基于每个主题的 - 首先,将分区按数字顺序排行序,消费者按消费者名称的字典序排好序 - 然后,用分区总数除以消费者总数。如果能够除尽,则皆大欢喜,平均分配;若除不尽,则位于排序前面的消费者将多负责一个分区 roundrobin(轮询) - 轮询分配策略是基于所有可用的消费者和所有可用的分区的 - 与前面的range策略最大的不同就是它不再局限于某个主题
kafka ==> kafka 分两步提交 jobmanager会协调每个TaskManager进行checkpoint操作, checkpoint默认数据保存在StateBackend中,默认StateBackend是内存级别的,也可以选择保存在外部存储系统(HDFS)中. 当checkpoint启动时,JobManager会通过RPC的方式将检查点分界线barrier发送到各个算子中,barrier会在算子间传递下去,只要算子接收到barrier,就会将算子当前的状态做快照然后持久化到Statebackend中. 当所有的SubTask都完成了checkpoint操作,会想jobmanager进行ack响应(0,1,-1). jobmanager集齐了所有SubTask的应答,会向实现了checkPointListener的SubTask(也就是Sink)发送RPC消息,让其提交事务. Sink中的状态是这段时间产生的数据,它会将这段时间的数据作为state保存到StateBackend中,如果checkpoint成功但是commit(提交事务)失败,这样子虽然数据已经在kafka中了,但是仍属于脏数据,不可以读,这样在任务重启时,会从StateBackend中偏移量以及之前的数据取出来,偏移量以及时最新的了,但是数据还没有提交完成,那么他就会将之前未提交成功的数据取出再提交. source sink都可以保存状态,source可以记录偏移量,sink可以记录在这段时间产生的数据
先提交offset,后消费,优酷嫩恶搞造成数据的重复
LEO:每个副本的最后条消息的offset HW:一个分区中所有副本最小的offset
可以增加 bin/ --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 3
负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作
kafka --> kafka 分两步提交 jobmanger 会协调每个TaskManager进行checkPoint操作, checkPoint 默认数据保存在StateBackend中, 默认StateBackend是内存级别的, 也可以选择保存在外部存储系统(hdfs)中 . 当chegkpoint启动时,JobManager会通过RPC的方式将检查点分界线barrier发送到各个算子中, barrier会在算子间传递下去, 只要算子接收到barrier, 就会将算子当前的状态做快照然后持久化到stateBackEnd中 . 当所有的subtask都完成了checkPoint操作, 会向jobManager进行ack响应 . jobManager集齐了所有subtask的应答 , 会向实现了checkPointListener的subtask(也就是sink)发送RPC消息, 让其提交事务 . sink中的状态是这段时间的产生数据, 它会将这段时间的数据作为state保存到stateBackend中, 如果checkPoint成功但是在commit(提交事务)失败, 这样子虽然数据已经在kafka中了但是属于脏数据, 不可以读, 这样在任务重启时, 会从stateBackend中偏移量以及之前的数据取出来, 偏移量已经是最新的了, 但是数据还没有提交成, 那么他就会将之前未提交成功的数据取出在提交 . source sink都可以保存状态 , source 可以记录偏移量 , sink可以记录在这段时间产生的数据
分区对于kafka集群的好处是: 实现负载均衡. 分区对于消费者来说,可以提高并发度, 提高效率.
kafka架构分为一下几个部分:
解析器将sql字符串转化成抽象的语法树,遍历语法树生成逻辑执行计划,优化器对执行计划进行优化,然后执行器将优化后的逻辑计划翻译成MapReduce任务
数据倾斜的本质就是数据分配的不均匀,那么造成不均匀的原因有很多,比如热点key,非热点key分布不均匀等问题,那么需要定位到具体位置,发生原因才能对症下药. 从技术层面来说,首先怀疑是否是数据存在热点key的问题. 这里可以使用采样统计来判断是否有部分key记录过多,如果存在热点key,则可以采用单独处理或者二次聚合的方式来处理;如果不是热点key,那么有可能就是key的本身分配存在问题,那么可以选择增加随机前缀,使用group代替Distinct MapJoin的空值等一些手段,将key进行随机分区, 如果是业务层面来说,可能是提供计算口径有问题导致的数据倾斜,比如订单表和支付关联,正常100w从结果来看却是1000w或者更多,这样就需要考虑是否逻辑口径有问题了,以上两种方案,然后在结合一些参数优化就可以解决倾斜问题
Hive在使用MR或Spark时的原理和影响是有所不同的。下面是它们的具体差别和影响:
容易产生数据倾斜,解决的话,就是将空值的key用随机值代替, 也可以将热点数据和非热点数据分开处理,最后在进行合并,然后也可以使用group by代替disitnct
可以在Map输入时合并小文件,这里可以配置在Reduce输出时合并小文件 Hive会在正常job结束后起一个Task来判断是否需要合并小文件,如果满足就会另外启动一个map-only job或者mapred job来完成小文件合并,这就需要配置一些参数
三者均为自定义函数 udf简化来说就是一对一的关系 就是用户自定义函数,是输入一行数据返回也是一行数据的自定义算子 Udaf简化来说就是多对一关系 ,就是用户自定义聚合函数,是输入多行函数返回一行数据 Udtf简化来说就是一对多的关系,就是用户自定义生成函数,是输入一行返回多行函数又被称为表生成函数 具体实现方式均需要继承对应的接口后实现里面的方法:
Hive元数据有三种方式保存元数据,分别为内嵌式,本地式,远程式 内嵌式则是将元数据保存到内嵌的Derby数据库当中,每次只能访问一个数据文件,不支持多会话连接 本地式则是将数据存入到本地独立的数据库当中,可支持多会话连接, 远程式则是将数据保存到远程独立的数据库当中,这样就避免每个客户端都去安装MqSQL
内部表和外部表都是基本表,不同点就是数据的位置,在Hive中进行表的删除时内部表的数据会被一并删除。当外部表删除时,其所对应的数据文件不会被删除。故生成环境下一般都使用外部表,这样 并不会删除数据 分区表是将数据按照分区字段拆分存储的表,在hdfs中以文件夹的形式分别存放不同的分区数据 分桶表则是将分桶字段hash值分组拆分数据的表,在HDFS中表现为将单个数据拆分多个文件 分桶和分区的区别;表现形式的话分桶是文件,分区是文件夹,创建语句上的话分区是partition by 分桶是cluster by 数量上分区可增长,而分桶不可增长,作用上的话,分区只是避免全局扫描,分桶表会保持分桶查询结果到桶结构,进行join可以提高效率. 两者可结合使用,来方便数据的查询效率
Insert into只是单纯的插入数据,返回会将历史数据和新插入的一起返回 Override write 会将历史数据remove后再插入数据;
If 返回结果为true或者False nvl:判断两值那个不为空 case when 类似于if else的多重判断 coalesce返回第一个非null值;如果所有值都为null,则返回null值 Is null判断是不是空值 Is not null判断否不是空值
建表语句的话有三种, 第一种:基础的创表语句也就是直接建表法,create table 表名(列名 属性 )row format delimited fields terminated by’分隔符’ 第二种:like方式,create table 表 like表 复制表格式不包含数据 第三种:子查询方式(抽取原表的部分字段分析数据) create table 表 as select 列名from原表名
我司通常使用snappy算法,原因是Hive的话会比较支持ORC的格式存储,因为orc的格式也是列式存储的,然后两者结合起来会更好一些,后面我了解到可以使用lzo这个因为该压缩算法可以切分,比率高,解压快非常适合日志
union 去掉重复数据 union all 不去掉重复数据
一方面可以根据存储进行优化,这里的话可以将压缩格式改变一下,也可以将小文件进行优化,另一方面就是计算方面的优化,这里的话可以进行本地化执行,JVM重用,调解MAP和Reducer个数,并行度的设置,再或者就是优化一些sql,或者是调解一下内存的分配问题
delete 删除行数据和整个表数据进行删除 drop 删除表内容和定义以及表结构也会删除 Truncate 摧毁表结构并重建
Order by 全局排序 需要shuffle Sort by 部分排序(及每个reducer内排序 全局不一定有序) Distribute by 分区排序类似MR中的partition 后使用Sort by Cluster by 当distribute by 和 sort by 所指定的字段相同时,即可以使用cluster by。 Group by 按照指定字段进行分组,相同的key到相同reduce 后续是聚合操作
Hive默认字段的分隔xxxascii码中的控制符\001,建表时用fields terminated by ‘\001’,遇到\t的情况自定义InputForamt,替换其他分隔符在处理
大概流程就是:当发生MapJoin的时候,小表会被复制分发到Map端,并加载到内存当中,然后顺序扫描大表根据key在内存中依次进行关联join,避免shuffle过程,但是需要注意map join没有reduce,所有文件的数量和map的数量有关,这里要注意小文件的问题
row_number() over( partition by 分组的字段 order by 排序的字段) row_number() over( distribute by 分组的字段 sort by 排序的字段) 注意: partition by 只能和order by 组合使用 distribute by 只能和 sort by 组合使用
存储格式问题Parquet不支持Date 数据过滤的问题 sql做left join 操作时,on两边都是null值时,所有数据被过滤 当做join操作时,如果出现null值,可能会导致没有数据,此时需要将null字段设置为默认值 小文件的问题,需要将其合并会在控制小文件的产生,以及有可能查收中文乱码的问题
函数的话可以分为两大类,一类为内置函数,一类为自定义函数:其中内置函数又分为数学函数,收集函数,类型转换函数,日期函数,条件函数,字符函数 内置的聚合函数,内置的表生成函数, 其中常用的有: size 返回map或者数组中的数据类型 Cast 类型转换以免后续计算出现异常 Datediff 时间差 Date_add 添加时间 Date_sub 减少时间 Uninx_timestamp 返回日期的毫秒值 If 判断是否满条件 Cocat 字符串的合并 Count 返回条数 Sum 求和 Avg 求平均值 Hive 列转行,把某一列的数据,在一行中展示。 lateral view explode select *from 表 lateral view explode(split(列,‘切分’)) 表名 as 列名 Hive 行转列 使用函数:concat_ws(’,’,collect_set(column)) 说明:collect_list 不去重,collect_set 去重。 column 的数据类型要求是 string select 列,concat_ws(’拼接符’,collect_list(列名)) as 别名 from 表名 group by 字段;
– 第二段 根据登陆时间减去排列顺序 得出用户连续登陆的分组 SELECT user_id,date_sub(login_time,rank) as login_group,min(login_time) as start_login_time ,max(login_time) as end_login_time,count(1) as continuous_days FROM ( – 第一段首先根据用户分组,登陆时间排序,结果按照登陆时间升序排列 SELECT user_id,login_time,row_number() OVER(PARTITION BY user_id order by login_time) as rank FROM ) a GROUP BY user_id,date_sub(login_time,rank)
Left semi join只显示左表的信息,在select后面不能出现查询右表的字段,否则报错,where条件中也不可以有右表字段出现 而left join 可以显示右表字段,并且where条件中也可以有右表字段出现 并且where中出现了右表字段则等同于join 和inner join Left semi join 如果右边有重复的数据,对应的左表没有重复数据,那么就不会有重复的数据产生,如果两表都有则会和左表一样 而 left join 的右表有重复的数据对应左表没有则会产生重复数据,如果两表都有重复则查出的结果为两边的乘积 Left join 时where没有右表字段,那么当右表的数据不存在而左表存在,那么之后返回左表的信息 Left semi join 当右表中不存在时,不显示任何信息
Spark的话是基于内存进行计算的,效率会略快 而MR是基于磁盘进行计算的效率会略慢一些,但是对于大量数据Hive on spark 可能会出现内存溢出的问题
Join的话分为两种join一种是mapjoin这种只适合与一张小表去join一张大表的情况下,而且还会有一定的优化,大体分为两步先是将小表的数据缓存到内存中的哈希表中,读完后会将哈希表序列化为哈希文件,然后会分发的到每个Mapper的本地磁盘上进行join,这样就会减少shuffle以及reduce的操作,但是局限于只支持小表join大表的情况.
common join这种就是在没有更改配置文件以及不符合上述规则情况下进行join,整个过程包含map shuffle 以及reduce阶段.在map端输出的时候以 join on条件中的列为key,如果join多个关联键则以这些关联键组合为key map输出的value为join 之后关系的列;同时在value 中还包含tag信息,用于标明value对应那个表,按照key进行排序,shuffle阶段是将key进行哈希值后分发给不同的reduce,reduce阶段根据key进行join,并且通过tag的信息标明数据来源.
数据在本地的话:load data local inpath本地路径 into table 表名 数据在hdfs的话:load data inpath hdfs路径+文件 into表名
查询语言的区别:HiveSQL是HQL语言,传统SQL是SQL语句: 数据存储的位置不同:HIVE的数据存储在Hdfs中,而传统数据库存储在块设备或者是本地文件 数据格式的不同:hive数据格式可以用户自定义,而传统sql有系统自己的定义格式 数据更新:hive不支持数据的写操作,而sql可以支持数据更新 索引区别:hive中没有索引,而sql有索引 延迟性区别:Hive延迟性率高,而mysql延迟性低 数据规模区别:hive存储规模超级大,而mysql存储一些少量数据 底层执行原理区别:HIve底层是mr 而mysql是excutor执行器 可拓展性:hive高于传统数据库
本地导入:load data local inpath本地路径 into table 表名 hdfs导入:load data inpath hdfs路径+文件 into表名 查询导入:create table表 as select * from 查询结果导入:insert into 表 select * from
可以通过substr来进行截取字符串后将数字输出 格式1: substr(string string, int a, int b); 格式1: 1、string 需要截取的字符串 2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取) 3、b 要截取的字符串的长度 格式2:substr(string string, int a) ; 格式2: 1、string 需要截取的字符串 2、a 可以理解为从第a个字符开始截取后面所有的字符串。
只适合进行小表join 大表,并不是很灵活
提高效率.因为此时可以对两张大表的字段进行分桶,那join的话就是按照一个一个桶来join的 这样就完美解决了,但是两表必须确保分桶数量为倍数关系,否则会改变join条件,影响最终结果
我知道大概如下几种方法.group by distinct row_number 可以取出为一的值以及collect__set是将某列转一个数组返回,并且去重
大概分为三种情况:
随机抽样实现的话需要使用rand()函数来进行抽取, 数据块的需要使用tablesample()函数来进行取样,可以指定大小,行数. 分桶的话和数据块函数一样.但是参数会略多一些,是将rand()和tablesample 组合使用
三者虽然都是对分过组的数据排序加序号,三个函数都是按照分组内从1开始排序 其中,ROW_NUMBER() 是没有重复值的排序(即使两条记录相同,序号也不重复的),不会有同名次。 DENSE_RANK() 是连续的排序,两个第二名仍然跟着第三名。 RANK() 是跳跃排序,两个第二名下来就是第四名。
Array(1,2,3,4) 装的数据类型是一样的 Map(‘a’,1,‘b’,c) key的类型一样 Struct(‘a’,1,2,34,4)装的数据是完全混乱的 什么情况下只会产生一个reduce任务而没有maptask? 使用了udtf聚集函数却没带group by 用来order by.
其本质是因为数据分布不均匀,我工作的时候出现过数据倾斜,印象比较深刻的有: 前端埋点出了问题:出现大量的空key,大量的null值,选择丢弃掉。 当时的解决办法有2种,都试过: 第一种:先使用粒度比较,细的先聚合,比如先市,区聚合,然后再聚合一次,分多次聚合(直接在hive里搞就行)。 第二种:用spark代码,先把北京的取出来,在北京的前面加随机数,分到不同的task里面去,做完一次聚合后,然后再把随机数丢掉,再来一次聚合,这样速度提高10几倍,最后存到hive表里。缺点要写spark代码,略微有点麻烦。
用case when给空值分配随机的 key值,使用指定字符串加随机值
用的地方不一样.where用于增删改查的所有情况,但是having只能用于查询,执行顺序也不一样 where在聚合之前起作用,但是不能放在group by 之后,而having不能放在group by之前, 然后子句也有区别,where子句的条件表达式Having都可以跟,而反之不可以;
分区: 是将表的数据在物理上分成不同的文件夹,以便于在查询时可以精准指定所要读取的分区目录,从而来降低读取的数据量 分桶: 是将表数据按置顶列的hash散列后分在了不同的文件中, 将来查询时, hive可以根据分桶结构, 快速定位到一行数据所在的分桶娃儿进件,从而来提高读取的效率
主要表现: 任务进度长时间维持在99% ,查看任务监控页面,发现只有少量(1个或几个) reduce子任务未完成. 因为其处理的数据量和其他reduce差异过大. 原因: 某个reduce的数据输入量远远大于其他reduce数据的输入量
hive这个的Join可分为两种情况: - Common Join (Reduce阶段完成join) - Map Join (Map阶段完成join)
Common Join: 如果没有开启或者不符合MapJoin的条件,那么Hive解析器会将join擦欧洲哦转换成Commin Join, 在Reduce阶段完成join. 并且整个过程包含Map, Shuffle, Reduce阶段.
在sort by 之前我们还有配置属性: //配置reduce数量 set ;
(因此,distribute by经常和sort by配合使用. 并且hive规定distribute by语句要写在sort by 语句之前) 注意: 当distribute by和sort by所指定的字段相同时,即可以使用cluster by.(cluster by置顶的列只能是升序,不能指定asc和desc.)
hive中的MapJoin简单来说就是在Map阶段将小表数据从HDFS上读取到内存的哈希表中,读完后将内存的哈希表文件,在下一个阶段,当MapReduce任务启动时,会将这个哈希表文件上传到Hadoop分布式缓存中,该缓存会将这些文件发送到每个Mapper的本地磁盘上. 因此,所有Mapper都可以将此持久化的哈希表文件加载回内存,并像之前一样进行Join. 顺序扫描大表完成Join. 减少昂贵的shuffle操作及reduce操作 MapJoin分为两个阶段:
left semi join : 只展示a表的字段,因为left semi join 只传递表的join key 给map阶段
结果:
hive默认的字段分隔xxxASCII码的控制符\001,建表的时候用fields terminated by ‘\001’ 遇到过字段里有\t的情况,自定义InputFormat,替换为其他分隔符再做后续处理
row_number() over( partition by 分组字段 order by 排序字段 ) as rn row_number() over( distribute by 分组字段 sort by 排序字段 ) as rn 注意: partition by 只能和order by组合使用 distribute by 只能和sort by 使用
大致可以分为两类, 一类为Transformation 变换/转换算子这种并不会触发提交作业并且是lazy模式,延迟执行的, xxxion算子在RDD上运行计算,并返回结果给Driver或写入文件系统
Transformation算子:map 将数据做函数运算 reducebykey聚合 groupbukey分组 sortbykey排序 union求并集 join xxxion算子:count返回所有元素 collect将rdd的数据转换为数组 first第一条 max最大值 min最小 foreach
窄依赖: 父RDD中, 每个分区内的数据, 都只会被子RDD中特定的分区所消费 宽依赖: 父RDD中, 分区内的数据, 会被子RDD内多个分区所消费
之前使用 hashShuffle , 之后使用SortShuffle 在进行shuffle时不会生成更多的小文件
启动spark context,后向资源管理器申请资源运行Executor并启动Standalone Executor Backend ,Executor向Spark context申请task,spark context将任务分发给executor,spark context构建dag,将dag划分为stage,将taskset发送给Taskscheduler最后由scheduler将task发送给executor运行,运行结束后释放资源
本地的local模式,standalone模式,spark on yarn模式,以及spark on mesos模式其中standalone和spark on Yarn模式,spark on mesos为集群模式
Sort by是对标准的RDD以及KV的RDD进行排序,并且他是在之后引入的,而sort by key只是对KV的RDD 进行排序
Map的话是RDD中的每一个元素进行操作 Map partition,是对RDD的每一个分区的迭代器进行操作,返回是迭代器
Partition 那个? 使用for each partition map,map partitions的话是转换类型有返回值 for each的话只可以迭代一个元素, 而使用for each partition的话他每一次迭代一个分区并且该方法没有返回值
Reduce by key会传一个聚合函数相当于group by key+map Values,并且会有一个分区聚合,而group by key并没有
两者虽然都是持久化,但是cache是将公用的或者重复使用的RDD按照持久化级别进行优化 Check point就是将业务非常长的逻辑计算的中间结果优先缓存HDFS上, 为了效率我们可以在check point之前cache一下
Map是对每一条函数进行指定操作,然后返回为每一条输入返回一个对象,而Flat Map函数则是两个操作的集合,即是”先映射后压平”操作和map一样,对每一条输入进行指定的操作,然后每一条返回一个对象,最后将所有对象合并为一个对象
面经题总结 第4篇
可以看到,公式层面上,独立多元高斯分布和非独立(相关)多元高斯分布的形式是一样的,只不过协方差矩阵不同:
独立多元高斯分布除对角线之外其它元素的值均为0,相关多元高斯分布则其它元素的值为特征之间的协方差的计算结果;
高斯混合模型:
高斯混合模型GMM是多元高斯分布之上的概念,他认为现实世界的数据是由多个不同参数的相关多元高斯模型以不同的权重累积求和构成的(单元,独立多元高斯模型可以看作相关多元高斯模型的特例);
其中:
是第个子模型的相关多元高斯分布,是观测数据属于第个子模型的概率;因此对于GMM而言,其参数,即每个子模型的均值向量、协方差矩阵以及在GMM中该子模型的权重;
对于相关多元高斯混合模型,其参数仅包含均值向量和协方差矩阵,可以直接通过极xxx法写出极xxx函数,然后通过求导进行参数估计,具体的通过极xxx法可以直接推导出均值向量和协方差矩阵关于输入向量X的计算公式,带入数据集X可以直接求解;
而GMM的极xxx函数较为复杂:
由于存在(观测数据属于第个子模型的概率)这个隐变量,无法直接求导得到参数的估计结果,因此通过EM算法来进行迭代式的求解;
首先需要了解em算法,em算法和梯度下降法一样,都可以用来优化极xxx函数,当极xxx函数中存在隐变量时,EM算法是一种常用的优化算法;
EM算法是一种迭代优化策略,由于它的计算方法中每一次迭代都分两步,其中一个为期望步(E步),另一个为极大步(M步),所以EM算法被称为EM算法(Expectation-Maximization Algorithm)
jensen不等式:
如果f是凸函数,X是随机变量,那么:。当且仅当X是常量时,该式取等号。其中,E(X)表示X的数学期望。Jensen不等式应用于凹函数时,不等号方向反向。当且仅当x是常量时,该不等式取等号。
如上图,实线f表示凸函数,X是随机变量,有的概率是a,有的概率是b。X的期望值就是a和b的中值,从图中可以看到成立。
优点:基于集成异常检测的思路,鲁棒性强;不涉及距离和密度计算,计算速度很快;每棵树独立生成可并行或分布式;
iforest的算法流程:
(1)底层是极限随机树,随机选择一个特征,随机选择部分样本(bagging),每次分裂随机选择一个分裂节点,最大深度是 log2(bagging的样本数量)
(2)整合所有极限随机树的结果,使用score function打分:
h(x) 为 样本x 在每棵树的高度(其实就是x在这棵树上分裂了几次),对样本x在所有树上的分裂次数进行平均得到分子项目,c(Ψ) 为给定样本数 Ψ 时路径长度的平均值,用来对样本 x 的路径长度 h(x) 进行标准化处理。
(3)score function的计算结果在0~1之间,
如果异常得分接近 1,那么一定是异常点;
如果异常得分远小于 ,那么一定不是异常点;
如果异常得分所有点的得分都在 左右,那么样本中很可能不存在异常点。
详细的可见:
isolation forest:
isolation forest的score function公式到底是个啥?:
直观上来看,m个特征,我们用m个极限随机树分别进行完全分裂,分裂到叶子节点的样本特征值完全相同,得到n个样本在m个极限随机树上的分裂次数,即得到n个样本在m个特征上的分裂次数,然后取平均就可以满足我们的预测目标了。本质上通过分裂次数代替聚类或密度的计算,分裂越少,则样本在这个特征上的异常程度越高,然后综合考虑样本在多个特征上的异常程度;
但是这么做的问题有:
1.计算复杂度太高了,树的完全分裂的时间复杂度为O(n),上述做法的总的时间复杂度为O(mn);
2.本质上做的是基于集成学习的无监督学习,鲁棒性强,但是单纯用1个极限随机树分裂1个特征,随机因素影响太大,重新训练的结果差异可能会很大。解决的方法是每个特征用多个极限随机树来拟合,则计算复杂度进一步扩大为O(mnk),k为树的数量;
3.无监督的核心缺陷,无法自动特征选择,所有特征的重要性一视同仁,则如果存在大量无用特征或者噪声特征,会严重影响计算结果;
iforest针对上述问题做了改进:
1.针对问题1,树的最大深度限制为log2(bagging的样本数量),之所以对树的高度做限制,是因为我们只关心路径长度较短的点,它们更可能是异常点,而并不关心那些路径很长的正常点。之所以使用log2的底数,是为了和score function的公式对应起来,为了计算score fuction上的便利性:
2-log2(2)=1/2,2log2(2)=2(指数和log计算公式)
总结一下, log2(bagging的样本数量)和服务xxxore function的设计的,计算上提供了便利性,;
2.仍旧是针对问题1,树每次使用的样本默认为 min(采样的样本数,256),这么做主要避免了太大数量的样本上分裂次数过多计算复杂度高的问题,然后通过集成提高整个模型的鲁棒性。(精度和效率之间的一种折衷,根据论文和实际的应用结果,效果还ok);
3.针对问题2,仍旧是精度和效率上的折衷,k个极限随机树通过采样,最终一共使用k个特征,每一轮随机选择一个特征生成一棵树;
4.针对问题1和2的不精确分裂的问题(实质上也没有办法做精确分裂),tree分裂上的不精确在实践中可以被认为提高了算法的鲁棒性,类似于lgb直方图;
5.针对问题3,特征的随机采样某些情况下缓解了无效特征的问题(大部分特征有效少部分特征无效的情况),但是本质上没有解决(大部分特征无效,少部分特征有效的情况),最终的特征工程还是要基于业务经验来进行;
一步一步拆解来看:
1.指数函数形式的设计
我们希望iforest输出的结果能够在一个有限的范围内,例如像auc的取值范围为一般,有界的评估指标便于比较(高度必然为正数,因此分子部分可以保证为负数,2**-x必然是大于0小于1的);
2.分子的设计:
h(x)部分,并不是简单的直接计算样本在tree上的分裂次数,观察上述公式,其中e表示的才是样本在tree上的分裂次数,后面额外多了一项c()的修正项,表示的样本所在叶子节点中所有样本的数量。
c(n)表示样本数量为n的情况下,生成随机二叉树的期望高度:
3.分母部分的设计:
分母部分使用的仍旧是上述的C(n)的公式,只不过分母部分的n指的是每一棵极限随机树使用的全部样本数量,即bagging得到的样本数量,默认是256个样本。这里的分母也是作为修正项存在的。
1.分子部分的修正项:
主要目的在于将样本落在的叶子节点中的样本数量大小这一因素考虑进来,假设某个样本A落入了叶子节点1,叶子节点1中有5个样本;某个样本B落入了叶子节点2,叶子节点2中有5000个样本,并且假设A和B的树的深度e都是3,则如果我们不引入修正项c(),计算结果是完全相同的。但实际上很明显,A的异常程度是要高于B的,因为B所在的叶子节点的样本数量很大,其实是可以继续分裂很多次,然而考虑到性能的问题,我们对树的高度做了限制,因此会引发这样的误差。
修正项的引入可以很好的解决这个问题 ,C(n)代表了给定n个叶子节点,所能生成的随机二叉树的平均高度,显然,叶子节点数量越多,则平均高度越大,则score function的计算结果越小,从而巧妙地缓解了上述存在的问题;
2.分母部分的修正项:
主要目的在于将每个tree所训练的bagging的样本数大小这一因素考虑进来,假设bagging的样本大小为64和256,则根据iforest的设计,max_depth分别为5和8,显然,bagging的样本数量越大则树可以生成的树的深度大概率越深,因此在分母部分引入给定bagging样本数量下,所能生成的随机二叉树的平均高度,显然,bagging样本数越多,平均高度越大,则score function计算的结果越大。
无,knn是一种懒惰学习(lazy learning)的算法,对应的有eager learning:
lazy learning:
只存储数据集而不从中学习,不需要模型训练
收到测试数据后开始根据存储数据集对数据进行分类或回归;
eager learning:
1.从收集到的数据中学习,需要模型训练;
2.受到测试数据后直接完成分类或回归
将采样后的预测的类别按照采样比例进行相应的增大或减少,例如对类别A下采样了50%,则预测结果中类别A的预测数量为m,令m=m/,然后计算分类准确率;
这种处理方式是不准确的,合理的方式应该是直接对原始数据进行评估指标的计算;
问:解决难样本问题的方法(hard sample problem),ohem与focal loss的相同点和不同点
roc曲线对类别数量的变化不敏感,因此auc的计算结果整体不会发生明显变化;
通过下采样平衡后,变相增大了正样本数量,分类决策边界远离正样本,预测概率整体变大;
class_weight对应的简单加权法是代价敏感学习最简单的一种方法,思想就是小类样本加权,使其在loss中比重变大;
目前主流的不均衡学习主要是关于分类问题的不均衡。所谓不均衡分类,指的是样本不同类别的数量差异越来越大的情况下,模型越来越偏向于预测大类样本的现象,因此,模型分类性能越来越差。
单纯从样本不均衡的角度出发(不考虑分布变化,小样本学习,分类问题的困难程度等其它问题),不均衡的类别对模型造成影响的原因:
1.目标函数优化的方法,使用梯度下降法优化目标函数的模型对于不均衡问题更敏感;而tree模型纯粹基于贪心策略进行分裂的方法则对此并不敏感;
2.目标函数的使用,hinge loss和交叉熵对于不均衡的敏感度不同;
不均衡是一个现象,是分类模型效果差的潜在原因之一;
上采样不一定是生成样本,例如简单的repeat式的上采样,通过repeat不涉及样本生成的过程,但生成样本一定是一种上采样;
sse很简单
轮廓系数:
轮廓系数是为每个样本定义的,由两个分数组成:
a:样本与同一cluster中所有其他点之间的平均距离。
b:样本与_下一个最近cluster_中的所有其他点之间的平均距离。
对于单个样本而言,轮廓系数的计算公式如下:
对于模型评估而言,取所有样本的轮廓系数的均值作为模型聚类效果的评估指标;
其它评估方式可见:
1.不同分类阈值下准确率会发生变化,评估起来比较麻烦;
2.对样本不均衡问题特别敏感,例如当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率;
公式:分类正确的样本数/总样本数
TP,FP,TN,FN,都是英文缩写很好记忆
准确率=(tp+tn)/total
精确率=tp/(tp+fp) 分子为正确预测的正样本的样本数量,分母为预测为正样本的样本数量
召回率=tp/(tp+fn) 分子为正确预测的正样本的样本数量,分母为所有正样本的样本数量
误杀率=fp/(fp+tn) 分子为错误预测的正样本数量,分母为所有负样本的样本数量
极度不均衡情况下,模型将所有样本预测为大类则准确率就能很高了;
分类阈值接近0,则模型将所有样本预测为正样本则召回率接近100%;
分类阈值接近1,则模型将极少样本预测为正样本则精确率接近100%(例如就预测一个样本为正样本并且这个样本恰好为正样本则精确率为1);
召回和精确率都受到分类阈值的影响较大;
pr曲线,以召回率为横坐标,精确率为纵坐标
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可认为后者的性能优于前者,例如上面的A和B优于学习器C;
一般使用平衡点来评估无法直接比较的情况例如上图的A和B模型,平衡点(BEP)是P=R时的取值,如果这个值较大,则说明学习器的性能较好。而F1 = 2 * 召回率 * 精确率 /( 召回率 + 精确率 ),同样,F1值越大,我们可以认为该学习器的性能较好。
roc曲线,和pr曲线一样,纵坐标是精确率,但是横坐标是误杀率。
其中第一行ab均为原数据的图,左边为ROC曲线,右边为P-R曲线。第二行cd为负样本增大10倍后俩个曲线的图。可以看出,ROC曲线基本没有变化,但P-R曲线确剧烈震荡。因此,在面对正负样本数量非常不均衡的场景下,ROC曲线会是一个更加稳定能反映模型好坏的指标,
roc曲线对于正负样本比例不敏感,因为roc曲线的纵坐标是精确率=预测正确的正样本/预测为正样本的样本数量,横坐标是误杀率=预测错误的负样本/所有负样本数量,改变了标签中类别的分布之后,预测正确的正样本/预测为正样本的样本数量 会同时发生同向的变化,预测错误的负样本/所有负样本数量 也会发生同向的变化,即roc的横纵坐标的计算结果是独立的,分别是针对正样本和针对负样本独立计算的,两个坐标的计算不会发生互相影响,因此类别比例发生变化的情况下,roc也不会产生剧烈的变动;
pr曲线的纵坐标是精确率=预测正确的正样本/预测为正样本的样本数量,横坐标是召回率=预测正确的正样本/所有正样本的数量,即pr的横纵坐标的计算结果是存在相互关系的,他们都是针对正样本进行计算,两个坐标的计算发生互相影响,从而使得pr曲线对类别的变化很敏感;
roc聚焦于二分类模型整体对正负样本的预测能力,所以适用于评估模型整体的性能;如果主要关注正样本的预测能力而不care负样本的预测能力,则pr曲线更合适;
auc是roc的曲线下面积,但是auc的实际意义仅仅从roc的曲线下面积不好理解,这里可以先了解一下auc的计算公式有哪些:
直接根据roc曲线进行计算,计算roc曲线下面积,缺点是计算误差较大,我们需要确定非常大量的分类阈值才能毕竟auc的真实计算结果;
的实际意义:正负样本对中预测结果的rank值的比较,假设正样本有x1个,负样本有x0个,则统计正样本*负样本的样本对中,正样本的预测概率大于负样本的预测概率的样本数量z,然后用z/x0*x1就可以得到auc了,这种计算方式的时间复杂度为O(n^2),这里的n指的是样本总数量
3.在2的基础上改进,先对预测的结果进行rank,预测概率越大则rank值越大,
这里的公式写的比较简略,详细解释一下:
首先, 假设某个样本 S 的rank值为k,则意味着有k-1个样本的预测概率小于样本S,即对于这k-1个样本中的每一个样本s来说,他们分别和样本S 构成的 sample pair (S,s)都是S的rank大而s的rank小的 ,则我们可以先得到:
然后, 对于M个正样本而言,两个正样本构成的pair是没有意义的,我们在xxx的计算不涉及到正样本之间的匹配,因此这部分需要减掉,则M个正样本两两配对的组合数量为
最后, 对于rank值而言,例如样本S的rank值为10,则实际上是有9个样本的预测值小于样本S的,但是我们前面的求和部分实际上将样本S和自身的sample pair(S,S)都考虑进去了,所以这里减掉和自身匹配的情况,一共是M种;
最终,我们就得到了:
时间复杂度取决于使用了排序算法,使用快排则计算复杂度为O(nlog(n))
因此,auc的实际意义是任意选定一个正负样本对,正样本的预测结果大于负样本的预测结果的概率;
预测值取rank然后套上面公式就行了;
woe是一种用于类别特征编码的编码方法,公式为:
简单来说,就是某个类别的好坏比/全量数据的好坏比;
iv是对woe值的修正,主要是考虑类别中包含的样本数量大小不同从而导致相同woe计算结果下,统计特征不明显的问题,不同样本数量下计算出来的woe是具有不同意义的,简单来说,woe计算结果相同的情况下,类别中包含的样本数量越多,woe的显著性越明显;
woe因为存在上述的问题,所以从整个特征的层面来看不能直接求和,但iv可以
roc曲线的对角线,表示一个随机预测模型的性能,如果模型的roc曲线在对角线下方,则该模型比随机模型还差,高于对角线则表示模型比随机模型好,模型是有意义的;
具体的,可以从auc的物理意义上去理解,roc的对角线下方面积为,意味着对角线的随机模型的auc为,结合auc的物理意义:任意选择一个正负样本对,正样本的预测结果高于负样本的预测结果的概率,则说明对角线代表的随机模型对于正负样本对的相对大小的判定是随机的;
多分类问题中,在二分类指标的基础上需要进行一些处理才能适配多分类的评估,整体有两种计算策略:
基于macro的策略:ovr的划分方式,分别计算每个类别的metrics然后再进行平均
基于micro的策略:所有类放在一起算metrics;
micro的评估方式,当类别非常不均衡时,micro的计算结果会被样本数量多的类别主导,此时需要使用macro
fbeta是f_metrics系列的最终定义式,公式如下:(f系列的可以统一用这个公式来记忆)
当beta=1时,Fbeta=F1,当beta=n时,Fbeta=fn;
beta用于定义召回率和精确率的相对重要性,越大,则recall越重要,当beta趋于无穷大时,Fbeta=recall,越小,则precision越重要,当beta**2趋于0时,Fbeta=precision
ks曲线的横坐标是分类的阈值,纵坐标代表了精确率或者误杀率,一个分类阈值对应的一个精确率和一个误杀率,而ks曲线就是用每个分类阈值下的精确率-误杀率,ks值则是指ks曲线上的最大值;
psi:
psi就是对称的kl散度的平均,kl散度的公式如下:
用来衡量两个离散随机变量的分布的差异
点预测问题:
0-1损失函数:
非凸,直接优化困难
logloss(交叉熵)(多分类),
最常用,相对hinge loss对噪声敏感(无意义的hard sample);
Cross-entropy(二元交叉熵)(logloss在二分类的特例):
当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质。
exponential loss
对噪声敏感,adaboost中使用过,其它情况很少接触
hingeloss,
对噪声健壮性强;
mse,mae,rmse,mape,smape:
mse,mae,rmse对标签y取值特别大的样本鲁棒性都较差,mae和rmse相对有所缓解,
mape:范围[0,+∞),MAPE 为0%表示完美模型,MAPE 大于 100 %则表示劣质模型。
可以看到,MAPE就是mae 多了个分母。
注意点:当真实值有数据等于0时,存在分母0除问题,需要做平滑
mape对标签y取值特别大的样本的鲁棒性较强,因为通过除以真实标签(即分母项),对单个异常样本的loss进行了放缩;缺陷在于对标签y取值接近0的样本鲁棒性很差,一点点的偏差就会使得单个样本的mape的loss的计算结果很大,
smape:smape是针对mape的对异常小样本的鲁棒性很差的问题进行了修正,可以较好的避免mape因为真实值yi小而计算结果太大的问题;同时对异常大的样本的鲁棒性也较好;
mape和smape都可以作为loss function进行优化;
区间预测问题:
直接估计参数的分布的参数,xxx深度学习这部分内容里有,之前看的deepar也是用的这种,称为distribution loss,这块儿研究的不多,后续应该找个时间好好系统性的看一下回归中的区间预测问题;
1、如果异常样本无意义,则对异常样本进行平滑等方式处理成正常样本,如果异常样本很稀少,直接删除也可以;
2. 如果异常样本有意义,例如双十一销量,需要模型把这些有意义的异常考虑进来,则从模型侧考虑使用表达能力更强的模型或复合模型或分群建模等;
function层面选择更鲁棒的损失函数例如smape;
原因:sigmoid对模型输出进行压缩到(0,1)区间的条件下,根据二元交叉熵得到的梯度更新公式中不包含sigmoid的求导项,根据mse的得到的梯度更新公式则会包含。
使用mse推导出的梯度更新量:
因为sigmoid的性质,导致在取大部分值时会很小(如下图的两端,几乎接近于平坦),这样会使得很小,导致参数和更新非常慢。
根据二元交叉熵推导出来的梯度更新公式:
不包含sigmoid的求导项,没这个问题
mse
没有sigmoid或其它的转换,则公式中求导项为1,
二元交叉熵(带sigmoid,求导过程中用到sigmoid的导数公式,否则到第二张图的第二步就可以停止了):
信息量用来度量一个事件的不确定性程度,不确定性越高则信息量越大,一般通过事件发生的概率来定义不确定性,信息量则是基于概率密度函数的log运算,用以下式子定义:
这里的p(x)可以是离散数据的概率,也可以是连续数据的概率密度函数
信息熵,衡量的是一个事件集合的不确定性程度,就是事件集合中所有事件的不确定性的期望,公式定义如下:
相对熵(kl散度):kl散度,从概统角度出发,表示用于两个概率分布的差异的非对称衡量,kl散度也可以从信息理论的角度出发,从这个角度出发的kl散度我们也可以称之为相对熵,实际上描述的是两个概率分布的信息熵的差值:
对于离散和连续的随机变量分布都可以使用kl散度进行定义
kl散度和余弦距离一样,不满足距离的严格定义;
kl散度的性质:
非负性(用Jenson‘s inequality 证明)
不对称性,即KL(P||Q)≠KL(Q||P)
js散度公式如下:
js散度的范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更准确;同时,js散度满足对称性 JS(P||Q)=JS(Q||P)
交叉熵:
可见,交叉熵就是真值分布的信息熵与KL散度的和, 而真值的熵是确定的,与模型的参数θ 无关,所以梯度下降求导时,优化交叉熵和优化kl散度(相对熵)是一样的;
联合熵:
联合熵实际上衡量的是两个事件集合,经过组合之后形成的新的大的事件集合的信息熵;
条件熵:
事件集合Y的条件熵=联合熵-事件集合X的信息熵,用来衡量在事件集合X已知的基础上,事件集合Y的不确定性的减少程度;
互信息:
互信息=事件集合X的信息熵-事件集合X在已知事件集合Y下的条件熵=事件集Y的信息熵-事件集合Y在已知事件集合X下的条件熵;
kl散度,js散度,以及迁移学习里的许多更advanced的评估方式例如mmd,交叉熵=真实的标签分布的信息熵+相对熵(kl散度)
距离的定义:在一个集合中,如果每一对元素均可唯一确定一个实数,使得三条距离公理(正定性,对称性,三角不等式)成立,则该实数可称为这对元素之间的距离。
1:正定性,d(x,y)>=0,仅当x=y则不等式等号成立,说白了就是如果样本A和样本B的距离为0,则样本A和样本B可以看作同一个样本;
2:对称性:d(x,y)=d(y,x),即样本A到样本B的距离等于样本B到样本A的距离;
3:d(x,y) 余弦距离不满足三角不等式,kl散度不满足对称性,因此二者都不是严格意义上的距离的定义; 优化交叉熵等价于优化kl散度, 这里的 是真实分布,它的信息熵 是一个定值,对于模型来说是一个不可优化的常数项,你可以把它替换成包括1、 在内的任何常数,对优化都没有影响。在这种问题中优化交叉熵和优化KL散度是等价的。. 在多分类的问题中,这两者是完全一致的,因为对于one hot标签来说: 所以交叉熵实际上就是希望模型的预测结果能够尽量和标签的分布保持一致; 通过引入超参数sigma,huber loss可以灵活动态的调整模型使用的loss function是mse还是mae, 这确保了损失函数不会受到异常值的严重影响,同时不会完全忽略它们的影响。 这里问的是梯度下降的一般性的表达式: 不知道这种问题有什么好问的。。 xxx法的收敛速度,是不是一定比梯度下降快(举反例),Hessian矩阵的求逆与计算量问题(正则化,Hessian矩阵的近似),xxx下降的几个phase,KKT的仔细描述。拟xxx法和xxx法的关系,拟xxx法解决了xxx法哪个问题?推导下xxx法。xxx法在什么时候只需要迭代一次就能求解,什么时候xxx法不能适用 凸函数的严格定义为,函数_L_(·) 是凸函数当且仅当对定义域中的任意两点_x_,_y_和任意实数_λ_∈[0,1]总有 该不等式的一个直观解释是,凸函数曲面上任意两点连接而成的线段,其上的任 意一点都不会处于该函数曲面的下方,如下图所示。(注意,这只是一种判定方法,实际上还有许多其它的判定方法,因为比较超纲所以不多介绍了)