22. 传统算法

机器学习面试题汇总与解析——传统算法

本章讲解知识点

    1. 前言
    1. 傅里叶变换
    1. 边缘检测算法
    1. 牛顿法
    1. 插值算法
    1. SIFT
    1. SURF


  • 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。

  • 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。

  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵

  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。

  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。


  • 关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。

  • 关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。

  • B站机器学习视频:https://space.bilibili.com/10781175/channel/detail?cid=133301



1. 前言

除了机器学习、深度学习。在这之前,还存在着一些传统算法,其中非常经典的牛顿法、二项插值、傅里叶、滤波算法等等。考察不多,但有必要了解。


2. 傅里叶变换

傅里叶公式内涵丰富,是很伟大的数学公式,我们这里篇幅有限,无法深刻剖析其内涵,读者请查阅资料自行学习。推荐参考文章:https://www.matongxue.com/madocs/473


3. 边缘检测算法

3.1 Sobe 算子

Sobe 算子是一种常用的边缘检测算子,用于计算图像中的水平和垂直方向的梯度,进而检测边缘。它基于离散的卷积操作,通过对图像进行卷积操作来计算梯度。

Sobel 算子有两个卷积核,一个用于计算水平方向的梯度,另一个用于计算垂直方向的梯度。这两个卷积核的形状为 3x3,分别如下:

水平方向的卷积核:

-1  0  1
-2  0  2
-1  0  1

垂直方向的卷积核:

-1 -2 -1
 0  0  0
 1  2  1

Sobel 算子的计算过程如下:

  • 对原始图像进行灰度化处理,将彩色图像转换为灰度图像。
  • 对灰度图像分别使用水平方向和垂直方向的 Sobel 卷积核进行卷积操作。
  • 将水平方向和垂直方向的梯度计算结果进行合并,得到图像的边缘响应。

3.2 Canny 边缘检测

Canny 边缘检测是一种经典的边缘检测算法,它在图像中检测出具有明显强度变化的边缘,并以高质量的边缘定位和边缘细化而著称。Canny 边缘检测算法的步骤如下:

  • 噪声抑制(Noise Reduction):使用高斯滤波器对图像进行平滑处理,以降低噪声的影响。

  • 计算梯度(Gradient Calculation):通过应用 Sobel 等算子计算图像的梯度幅值和方向,得到每个像素点的梯度信息。

  • 非极大值抑制(Non-maximum Suppression):对梯度幅值图像进行非极大值抑制,去除非边缘像素,保留具有最大梯度幅值的像素点,以实现边缘细化。

  • 双阈值检测(Double Thresholding):根据预先设定的高阈值和低阈值对图像进行阈值分割,将像素点划分为强边缘、弱边缘和非边缘三个类别。

  • 边缘连接(Edge Tracking by Hysteresis):根据强边缘像素点的连接性质,将弱边缘中与强边缘连接的像素点也标记为强边缘,最终得到完整的边缘图像。

3.3 Laplace 算子

Laplace 算子,也称为拉普拉斯算子,是一种常用的二阶微分算子,用于图像处理中的边缘检测和特征提取。它可以检测图像中的灰度变化和边缘信息。

Laplace 算子在二维情况下的表达式为:

2 f = 2 f / x 2 + 2 f / y 2 ∇^2f = ∂^2f/∂x^2 + ∂^2f/∂y^2

其中, 2 f ∇^2f 表示 Laplace 算子应用于函数 f ( x , y ) f(x, y) 后的结果, 2 f / x 2 ∂^2f/∂x^2 表示函数 f ( x , y ) f(x, y) x x 方向上的二阶偏导数, 2 f / y 2 ∂^2f/∂y^2 表示函数 f ( x , y ) f(x, y) y y 方向上的二阶偏导数。

在离散化处理时,可以使用差分近似来计算 Laplace 算子的近似值。一种常用的离散 Laplace 算子是 3x3 的模板,如下所示:

0  1  0
1 -4  1
0  1  0

将该模板与图像进行卷积操作,可以得到图像中每个像素点的 Laplace 算子近似值。通过分析 Laplace 算子的结果,可以提取图像中的边缘信息。


4. 牛顿法

4.1 牛顿法

牛顿法(Newton's method)是一种用于求解方程或优化问题的迭代方法,它利用函数的一阶和二阶导数信息来逼近函数的零点或极小值点

对于方程的求解问题,牛顿法的基本思想是通过不断迭代逼近函数的零点。假设要求解方程 f ( x ) = 0 f(x) = 0 的根,初始时选择一个近似解 x 0 x_0 ,然后利用函数在 x 0 x_0 处的一阶导数 f ( x 0 ) f'(x_0) 和二阶导数 f ( x 0 ) f''(x_0) 的信息来构造一个切线,将切线与 x x 轴的交点作为新的近似解 x 1 x_1 。重复这个过程,直到近似解收敛到方程的真实解。

img

具体来说,牛顿法的迭代公式为:

x n + 1 = x n f ( x n ) f ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

其中, x n x_n 表示第 n n 次迭代的近似解, f ( x n ) f(x_n) 表示函数在 x n x_n 处的值, f ( x n ) f'(x_n) 表示函数在 x n x_n 处的一阶导数。

牛顿法在优化问题中也有广泛应用。对于优化问题,我们希望找到使目标函数取得极小值的解。牛顿法可以通过迭代来逼近目标函数的极小值点。在优化问题中,牛顿法的迭代公式变为:

x n + 1 = x n [ f ( x n ) ] 1 f ( x n ) x_{n+1} = x_n - [f''(x_n)]^-1 * f'(x_n)

其中, f ( x n ) f''(x_n) 表示函数在 x n x_n 处的二阶导数, [ f ( x n ) ] 1 [f''(x_n)]^-1 表示其逆矩阵。

牛顿法具有快速收敛速度的优点,尤其在接近极小值点时更为明显。然而,牛顿法也存在一些限制,如需要计算函数的一阶和二阶导数,以及需要选择合适的初始点等。

4.2 拟牛顿法

拟牛顿法(Quasi-Newton method)是一种优化算法,用于求解无约束优化问题,它是对牛顿法的一种改进。与牛顿法相比,拟牛顿法的主要优点是不需要计算目标函数的二阶导数,从而减少了计算复杂度。

在拟牛顿法中,通过利用目标函数的一阶导数信息来逼近目标函数的二阶导数。具体来说,拟牛顿法通过构建一个近似的 Hessian 矩阵(二阶导数的估计)来代替牛顿法中的精确 Hessian 矩阵。这个近似的 Hessian 矩阵可以根据目标函数的一阶导数的变化情况进行更新。

拟牛顿法的基本思想是通过迭代过程逼近目标函数的最优解。在每一次迭代中,通过近似的 Hessian 矩阵来更新当前的解,并计算新的搜索方向。常见的拟牛顿法算法包括DFP(Davidon-Fletcher-Powell)算法和BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法等。

与牛顿法相比,拟牛顿法具有以下优点:

  • 不需要计算目标函数的二阶导数,减少了计算复杂度。
  • 可以自适应地调整 Hessian 矩阵的估计,适应不同的目标函数形状。
  • 可以处理目标函数的非凸性问题,避免陷入局部最优解。

然而,拟牛顿法也有一些限制:

  • 对于目标函数的高阶导数信息不准确时,近似的 Hessian 矩阵可能不精确,影响算法的收敛性和效率。
  • 拟牛顿法对初始点的选择比较敏感,不同的初始点可能导致不同的收敛结果。

5. 插值算法

5.1 最近邻插值法(Nearest Neighbour Interpolation)

最近邻插值法是一种简单而直观的插值方法,用于在给定的数据点集合中找到距离待插值点最近的邻居点,并将其值作为待插值点的估计值。最近邻插值法假设邻居点的值对于待插值点的估计是最准确的。

最近邻插值法的步骤如下:

  • 根据给定的数据点集合,确定待插值点的位置。

  • 找到与待插值点最近的邻居点。通常使用欧氏距离或曼哈顿距离来衡量点之间的距离。

  • 将邻居点的值作为待插值点的估计值。

最近邻插值法的优点是简单易实现,计算速度快。它适用于离散的数据点集合,对于非均匀分布的数据点也能够提供较好的估计结果。

img

5.2 双线性插值

双线性插值是一种常用的图像插值方法,用于在离散的图像网格中估计非网格点的像素值。其公式如下:

假设有一个二维图像,需要在坐标 ( x , y ) (x, y) 处进行插值。首先找到坐标 ( x , y ) (x, y) 所在的四个最近的网格点,分别记为 P 1 ( x 1 , y 1 ) P_1(x_1, y_1) P 2 ( x 2 , y 1 ) P_2(x_2, y_1) P 3 ( x 1 , y 2 ) P_3(x_1, y_2) P 4 ( x 2 , y 2 ) P_4(x_2, y_2)

双线性插值公式为:

f ( x , y ) ( 1 u ) ( 1 v ) f ( P 1 ) + u ( 1 v ) f ( P 2 ) + ( 1 u ) v f ( P 3 ) + u v f ( P 4 ) f(x, y) ≈ (1 - u) * (1 - v) * f(P_1) + u * (1 - v) * f(P_2) + (1 - u) * v * f(P_3) + u * v * f(P_4)

其中, u = ( x x 1 ) ( x 2 x 1 ) u = \frac{(x - x_1)} {(x_2 - x_1)} 为水平方向上的插值权重, v = ( y y 1 ) ( y 2 y 1 ) v = \frac{(y - y_1) } {(y_2 - y_1)} 为垂直方向上的插值权重。

双线性插值的思想是根据待插值点周围的四个邻居点,通过加权平均的方式计算插值点的像素值。权重根据离插值点的距离进行插值,距离越近的邻居点权重越大。

5.3 多项式插值

多项式插值是一种常用的插值方法,用于在给定一组离散数据点的情况下,通过构造一个多项式函数来逼近这些数据点,并在数据点之间进行插值。

设给定 n + 1 n+1 个数据点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_0, y_0), (x_1, y_1), ..., (x_n, y_n) ,其中 x 0 < x 1 < . . . < x n x_0 < x_1 < ... < x_n 。多项式插值的目标是找到一个 n n 次多项式 P ( x ) P(x) ,使得 P ( x i ) = y i P(x_i) = y_i ,即通过多项式 P ( x ) P(x) 在数据点上与实际数据相等。

多项式插值的公式为:

P ( x ) = a 0 + a 1 ( x x 0 ) + a 2 ( x x 0 ) ( x x 1 ) + . . . P(x) = a_0 + a_1 * (x - x_0) + a_2 * (x - x_0) * (x - x_1) + ... + a_n * (x - x_0) * (x - x_1) * ... * (x - x_{n-1})

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

- 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 - 本专栏适合于算法、机器学习求职的学生或人士。 - 本专栏特点: - 本专栏囊括了深度学习、机器学习、NLP、特征工程等一系列知识点的讲解,并且最后总结出了高频面试考点(附有答案)共301道,知识点讲解全面,事半功倍,为大家春秋招助力。不仅如此,教程还讲解了简历制作、笔试面试准备、面试技巧等内容。

全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
点赞 4 评论
分享
牛客网
牛客企业服务