Fork me on GitHub

2021 年 4 月份 3 道伴鱼 AI 算法岗面试题

合并重叠区间,也就是那个最大不重叠区间的题目的变种。面试官会让你看题先整理思路,然后分析复杂度,最后面试官觉得你的思路OK就放你在远程连接上手撕代码

链接:https://leetcode-cn.com/problems/merge-intervals/

  1. 1.过拟合和欠拟合。
  2. 2.python多进程
  3. 3.python深浅拷贝

~ 文末有福利 ~

解题思路:

  • 先对输入数组按照区间左边的值进行升序排列
  • 初始化一个变量 res,用于存储合并直接的区间结果
  • 遍历排序后的所有区间,针对每个区间做如下的处理:

如果当前处理的区间是第一个区间的话,那么直接将区间加入到 res

比较当前处理区间左边的值 i[0] 和 res 中最后一个区间右边的值 res[-1][1]:

如果 res[-1][1] < i[0],说明没有重叠,那么直接将当前处理的区间加入 res

否则,说明有重叠,那么将 res 中最后一个区间的右边的值更新为:当前处理区间右边值 i[1] 和 res 中最后一个区间右边的值 res[-1][1] 的最大值.

1.过拟合和欠拟合?

  • 过拟合:是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。
  • 欠拟合:模型不能在训练集上获得足够低的误差。换句换说,就是模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律。
  • 如何解决欠拟合?

欠拟合基本上都会发生在训练刚开始的时候,经过不断训练之后欠拟合应该不怎么考虑了。但是如果真的还是存在的话,可以通过增加网络复杂度或者在模型中增加特征,这些都是很好解决欠拟合的方法。

  • 如何防止过拟合?

获取和使用更多的数据(数据集增强)、降低模型复杂度、L1\L2\Dropout正则化、Early stopping(提前终止)

  1. 现在有个模型欠拟合,增加模型深度能改善吗?

可以下判断神经网络的拟合能力是否足够:使用少量数据训练模型,让每个epoch或者每个batch都是相同的数据,然后观察训练的loss和accuracy,如果发现loss下降并且accuracy上升了,训练结束后可以正确预测训练数据,那么可以确定是模型的拟合能力不足,无法拟合全部的训练数据,此时可以增加模型的深度,增强网络的拟合能力。

2.python多进程

线程

是操作系统中进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以有多个线程,每条线程可以同时执行不同的任务。一个线程可以看作一个cpu执行时所需要的一串指令。

多线程

在Python的标准库中提供了两个模块:_thread和threading,_thread是低级模块不支持守护线程,当主线程退出时,所有子线程都会被强行退出。而threading是高级模块,用于对_thread进行了封装支持守护线程。在大多数情况下我们只需要使用threading这个高级模块即可。

进程:

进程指的是一个程序在给定数据集合上的一次执行过程,是系统进行资源分配和运行调用的独立单位。也就是每一个应用程序都有一个自己的进程。进程在启动时都会最先产生一个线程,这个线程被称为主线程,然后再有主线程创建其他子线程

多进程:

多进程是multiprocessing模块提供远程与本地的并发,在一个multiprocessing库的使用场景下,所有的子进程都是由一个父进程启动来的,这个父进程成为madter进程,它会管理一系列的对象状态,一旦这个进程退出,子进程很可能处于一个不稳定的状态,所以这个父进程尽量要少做事来保持其稳定性

线程与进程的区别

(1)线程必须在某个进程中执行。一个进程可包含多个线程,并且只有一个主线程。

(2)多线程共享同个地址空间、打开的文件以及其他资源。而多进程共享物理内存、磁盘、打印机以及其他资源。

(3)线程几乎不占资源,系统开销少,切换速度快,而且同个进程中的多个线程可以实现数据共享,而进程之间是不可共享的

(4)新线程的创建很简单而新进程的创建需要对父进程进行克隆

(5)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

参考:
https://www.php.cn/python-tutorials-416932.html

3.python深浅拷贝

不可变类型(字符串、数值型、布尔值)的深浅拷贝

对于不可变类型(字符串、数值型、布尔值):浅拷贝和深拷贝一样,对象的引用(内存地址)没有发生变化。

可变对象(列表、字典、集合)的浅拷贝

可变对象(列表、字典、集合)的深拷贝

对于可变对象(列表、字典、集合):浅拷贝在拷贝时,只会copy一层,在内存中开辟一个空间,存放这个copy的列表。更深的层次并没有copy,即第二层用的都是同一个内存;深拷贝时,会逐层进行拷贝,遇到可变类型,就开辟一块内存复制下来,遇到不可变类型就沿用之前的引用。因为不可变数据修改会从新开辟新的空间,所以,深拷贝数据之间的修改都不会相互影响。

总结如下:

  • 浅拷贝花费时间少,占用内存少,只拷贝顶层数据,拷贝效率高。
  • 对不可变对象拷贝时,浅拷贝和深拷贝的作用是一致的,不开辟新空间,相当于赋值操作。
  • 可变对象浅拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。
  • 可变对象深拷贝时,会逐层进行拷贝,遇到可变类型,就开辟一块内存复制下来。

FM是推荐系统工程师应该熟练掌握和应用的算法,主要解决稀疏数据下的特征组合问题,该模型预测的复杂度是线性的。FM不仅继承了过去协同过滤、矩阵分解、逻辑回归等算法的特点,而且是后来众多模型改进的基础。

七月在线开设【FM实战特训 第三期】课程, 从 FM的发展过程、原理剖析、代码实现和场景应用等多个方面实战 FM模型,而且还会有BAT技术大牛传授模型调优和相关的工作经验。

课程主要内容: 线性回归、二次回归、SVD、SVD++、FM、FFM、libfm;特征组合、数据重编码、AUC的提升、模型调参等,大部分时间都是讲师带着同学们一步步进行编程实战。除此之外,本课程还增加了一些提高性的内容:阿里的DIN模型探索和模型的分布式训练。

课程价格:限时1分秒杀

秒杀链接:https://www.julyedu.com/course/getDetail/371

开课时间:7月26日


本文地址:https://www.6aiq.com/article/1626719661164
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出