牛客笔试题之顺丰机器学习真题

昨天做了一套顺丰人工智能和机器学习的真题,下面是对其中一些知识点的总结。

Java中的String


解析:

链表

链表的特性,使其在某些操作上比数组更加高效。

  1. 增删不必挪动元素。当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。
  2. 无需实现估计空间。链表在内存中不是连续存储的,所以可以充分利用内存中碎片空间。

UDP与TCP

TCP 面向有连接 可靠 面向字节流 数据无边界 速度慢 一对一
UDP 无连接 不可靠会丢包 面向报文 有边界 速度块 一对一或一对多

死锁

产生必要条件:

  1. 互斥
  2. 请求与保持
  3. 循环等待
  4. 非剥夺

OSI七层模型

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。它定义了网络互连的七层框架:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

TCP/IP五层协议和OSI的七层协议对应关系如下,在每一层都工作着不同的设备:

在每一层实现的协议也各不同,即每一层的服务也不同:

数据库索引

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  2. 当用户查询索引字段时,索引可以快速地执行检索操作,借助索引,在执行查询的时候不需要扫描整个表就可以快速地找到所需要的数据。
  3. 创建索引和维护索引要耗费时间、空间,当对表中的数据进行增加、删除和修改的时候,会降低数据的维护速度

Numpy


解析:

import numpy as np
''' numpy.repeat(a, repeats, axis=None) 将a重复b次 >>> x = np.array([[1,2],[3,4]]) >>> np.repeat(x, 2) array([1, 1, 2, 2, 3, 3, 4, 4]) >>> np.repeat(x, 3, axis=1) array([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]]) >>> np.repeat(x, [1, 2], axis=0) array([[1, 2], [3, 4], [3, 4]]) '''
a = np.repeat(np.arange(5).reshape([1,-1]),10,axis = 0)+10.0
b = np.random.randint(5, size= a.shape) # 生成[0,5)随机矩阵,大小和矩阵a相同
c = np.argmin(a*b, axis=1) #矩阵a和b乘积,返回每行最小值位置
b = np.zeros(a.shape) #与矩阵a相同大小的全零矩阵
print("b变之前:",str(b))
print("c的值:",str(c))
b[np.arange(b.shape[0]), c] = 1 #将b中每一行的c位置处赋值为1
print("b变之后:",str(b))
print(b.shape)

输出结果:

b变之前: [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
c的值: [0 3 4 3 1 3 4 2 2 0]
b变之后: [[1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]]
(10, 5)

RF GBDT XgBoost

RF、GBDT、XgBoost 三者都是集成学习中的方法,其中RF属于Bagging方法,GBDT和XgBoost属于Boosting方法。过段时间会专门写一篇有关Bagging和Boosting介绍的博文。

  1. RF(Random Forest)

随机森林主要运用到的方法是bagging,采用Bootstrap的随机有放回的抽样,抽样出N份数据集,训练出N个决策树。然后根据N个决策树输出的结果决定最终结果(离散型的输出:取最多的类别,连续型的输出:取平均数)。

优势:

  • 容易理解和解释
  • 不需要太多的数据预处理工作
  • 隐含地创造了多个联合特征,并能够解决非线性问题
  • 随机森林模型不容易过拟合
  • 自带out-of-bag (oob)错误评估功能
  • 并行化容易实现

劣势:

  • 不适合小样本,只适合大样本
  • 精度较低
  • 适合决策边界是矩形的,不适合对角线型的
  1. GBDT

通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。一般选择cart tree且树的深度不会很深。

优势:

  • 精度高
  • 能处理非线性数据
  • 能处理多特征类型
  • 适合低维稠密数据
  • 模型可解释性好
  • 不需要做特征的归一化,可以自动选择特征
  • 能适应多种损失函数

劣势:

  • 不太适合并发执行
  • 计算复杂度高
  • 不适用高维稀疏特征
  1. XgBoost

简单来说XgBoost是GBDT的一种高效实现,主要具有以下几个优势:

  • 显式的把树模型复杂度作为正则项加到优化目标中
  • 实现了分裂点寻找近似算法。
  • 可以并行执行

RF和GBDT的比较:

相同点:

  • 都是由多棵树组成
  • 最终的结果都是由多棵树一起决定

不同点:

  • 组成RF的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
  • 组成RF的树可以并行生成;而GBDT只能是串行生成
  • 对于最终的输出结果而言,RF采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
  • RF对异常值不敏感,GBDT对异常值非常敏感
  • RF对训练集一视同仁,GBDT是基于权值的弱分类器的集成
  • RF是通过减少模型方差(variance)提高性能,GBDT是通过减少模型偏差(bias)提高性能

Boosting和Bagging的差别

过拟合的模型,通常variance比较大,这时应该用bagging对其进行修正。
欠拟合的模型,通常bias比较大,这时应该可以用boosting进行修正。使用boosting时, 每一个模型可以简单一些。

  1. bagging中的模型是强模型,偏差低,方差高。目标是降低方差(variance)。在bagging中,每个模型的bias和variance近似相同,但是互相相关性不太高,因此一般不能降低bias,而一定程度上能降低variance。典型的bagging是random forest (RF)

  2. boosting中每个模型是弱模型,偏差高,方差低。目标是通过平均降低偏差(bias)。boosting的基本思想就是用贪心法最小化损失函数,显然能降低偏差,但是通常模型的相关性很强,因此不能显著降低variance。典型的Boosting是Adaboost,另外一个常用的并行Boosting算法是GBDT(gradient boosting decision tree)。这一类算法通常不容易出现过拟合

全部评论

相关推荐

1. 自我介绍2. 项目都是自己写的吗?3. 我看你用 koa2 写后端,为什么选择它,能讲讲吗?4. 那你提到 koa2 它是不提供中间件的,你是怎么解决的?5. 中间件的原理是什么?(洋葱模型)6. 你刚刚说碰到 next() 就进入下一个中间件,那 next 只能执行同步,如果是异步的话,你是怎么处理的?(async/await,但是我发现,有的中间件需要在异步中间件之前执行,所以我用 try/catch 来处理异步中间件的异常)7. JS 异步发展史,以及它们的优缺点说一下 (回调函数--Promise--Generator--async/await)8. 你刚刚说 Promise 状态不能更改,那如果我要设计一个能修改 Promise 状态的函数,你会怎么设计?9. CSS 水平垂直居中的方法(flex、grid、绝对定位 + margin:auto、绝对定位 + 负 margin、绝对定位 + transform、table-cell)10. 你刚刚说到 flex 布局,那 flex:1 是什么意思?(flex: flex-grow  flex-shrink  flex-basis;等价 flex:1 1 0%表示元素可以均分剩余空间,可拉伸、可压缩,不依赖内容宽度,自动自适应填充布局。)11. 父容器宽是 500px,然后它左右各有两个子容器是 100px,如果设置 flex: 1,那它的宽度是多少?(500-100-100=300px)12. 说说你对浏览器缓存的理解(强缓存、协商缓存)13. 如果一个用户,他怎么去刷新都无法刷到最新版的代码,你能说下可能的原因吗?(版本号、hash等)还有吗?(我说我不知道了,面试官说还有 CDN 没有同步,我说企业才会这么干,自己写项目一般不会,我知道 cdn 是用来解决高并发的手段)14. React你熟吗?说下 React 函数组件和类组件的区别15. 怎么避免 Hooks 导致组件重新渲染?(使用 useCallback、useMemo、React.memo、useRef等等)16. 谈一下我对 React 的状态管理的理解(Redux、Mobx、Zustand,我说 Zustand 用的最多)17. React 常见的 hooks 有哪些?(useState、useEffect、useRef、useCallback、useMemo、useReducer、useContext、useImperativeHandle、useLayoutEffect、useDebugValue)18. TS 你熟吗?我们引进 TS 的目的是为什么?19. interface 和 type 的区别20. 说下 TS 里的泛型21. 我现在有十个字段,比如十个字段就要 A B C D E F G 这种。那我现在另有另外一个方法,这个方法接受的参数呢,必须是这个 interface A 里面的这个 K。就比如说你可以是 A B C 可以 A B C D 任何组合都可以,但是必须是这个 interface 里面的 A 里面的定义的。这个 K 这种类型的话是怎么去定义呢?(说实话我有点不太理解啥意思,反正我说了 keyof)``` TypeScriptinterface Obj {A: stringB: stringC: stringD: stringE: string// 其他字段...}```22. vite 用过吗?说说和 webpack 的区别。vite 的优缺点是什么23. 说说 Tree shaking(树摇) 和 Code Splitting (代码分割)的区别24. Git 你熟吗?说说 git merge 和 git rebase 的区别,什么时候用 git merge,什么时候用 git rebase?25. web3 你熟吗?(不太熟,听说过而已)26. 我看你自我介绍说了 AI,你是怎么用的?27. 除了提示词,还有什么能让 AI 更聪明?28. AI 的优缺点你说一下29. AI 发展这么快,你觉得我们以后会扮演什么角色?30. 反问基本都答上来了。面了我80分钟,我还以为稳过的
查看29道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务