B  数学篇  

涉及概率,矩阵,数值计算,优化等。

又见数学,过来过去,不是数学就是编程,要想在SLAM领域做出点好的贡献,两者一个比一个难,有时候编程比数学更难………


目录

1. 一层楼共有n级台阶,一次可以上至少一级但不超过m级台阶,求有多少种不同的上楼方案数。由于结果可能很大,你只需要输出结果对10007取模的值即可

2. 拟合二维平面中的带噪声直线,其中有不超过20%的样本点远离了直线,另外80%的样本点可能有高斯噪声的偏移,要求输出为ax+by+c=0的形式,其中a>0且a^2+b^2=1

3. 切比雪夫不等式、协方差与相关系数、各种分布、多元高斯分布

4. 线性回归推导回归系数(y=kx,y=kx+b)

5. 甲乙两人约好在某地碰面,时间段为10点到11点。若甲先到,最多会等待10分钟,10分钟内乙未出现则离开;若乙先到,最多会等待15分钟,15分钟内甲未出现则离开,请问两人见面的概率是多少?

6. ABCDE5个人互相传球,由A开始第一次传球,经5次传球最后回到A的手上,其中A与B不会互相传球,C只会传给D,E不会传给C,共有多少种传球方法?

7. 平均要取多少个(0,1)中的随机数才能让和超过1?

8. MLE、MAP和贝叶斯估计

9. MLE,MAP,EM 和 point estimation 之间的关系是怎样的?

10. 如何求解Ax=b (非迭代Cholesky分解、QR分解,迭代)

11. 最小二乘封闭解与迭代解的取舍

12. 梯度下降法、牛顿法、GN、LM,推导、优缺点

13. 如何判断点在多边形内

14. 一阶、二阶优化,Jacobian、hessian矩阵

15. 1000个数的阶乘,求有多少个0

16. 递推法求数学期望,反证法,数学归纳法等


1. 一层楼共有n级台阶,一次可以上至少一级但不超过m级台阶,求有多少种不同的上楼方案数。由于结果可能很大,你只需要输出结果对10007取模的值即可

用到递归! 等同于剑指offer上青蛙跳台阶问题(第77页)

f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(n - m)

递归一般是用来分析,自上而下,逻辑清楚;但是实现的话,因为递归的写法经常会出现重复调用的情况,效率不高,一般改用循环的写法,自下而上,效率高。 

此处省略实现代码。

2. 拟合二维平面中的带噪声直线,其中有不超过20%的样本点远离了直线,另外80%的样本点可能有高斯噪声的偏移,要求输出为ax+by+c=0的形式,其中a>0且a^2+b^2=1

请见我的另一篇博客:  算法 | 专题解析之商汤2018校招

https://blog.csdn.net/weixin_43795395/article/details/89600060

其中第8题同。 按理说会用到ransac算法,具体你可以看代码。这里我就不贴了。

3. 切比雪夫不等式、协方差与相关系数、各种分布、多元高斯分布

概率论基础,学好数学不仅要逻辑好,记忆力也要好啊……

切比雪夫不等式是这么写的:

其中  , 是期望, 是标准差。

我们还是通过  的正态分布来感受一下切比雪夫不等式:可见,越远离平均值,概率越低。

4. 线性回归推导回归系数(y=kx,y=kx+b)

参考博客https://blog.csdn.net/u013820053/article/details/81358651

线性回归实际上也是最小二乘问题,其对应的解法有两种:解析法和迭代法(梯度下降法)

解析法推导——

求解目标函数如下,其中XX为所有样本的所有特征,是一个M(M个样本)行N(N个特征)列的矩阵,Y是M个样本的真实值,是M行的列向量,ω是回归系数,是N行的列向量:

minJ(ω)=||Y−Xω||2

注:矩阵求导用到了分母布局,如果不清楚你可以看我的第一篇博客https://blog.csdn.net/weixin_43795395/article/details/84498269

5. 甲乙两人约好在某地碰面,时间段为10点到11点。若甲先到,最多会等待10分钟,10分钟内乙未出现则离开;若乙先到,最多会等待15分钟,15分钟内甲未出现则离开,请问两人见面的概率是多少?

几何概率的一道题目,高中数学知识。

6. ABCDE5个人互相传球,由A开始第一次传球,经5次传球最后回到A的手上,其中A与B不会互相传球,C只会传给D,E不会传给C,共有多少种传球方法?

7. 平均要取多少个(0,1)中的随机数才能让和超过1?

这个题目很有意思,参考博客: https://blog.csdn.net/yahohi/article/details/7868668

直观的感觉,每次取出的随机数的期望为0.5,那是不是平均取两个随机数和就会超过1.  答案是: NO!

正确答案应该为e。

#define NUM 9999999int main()
{int sum=0;
srand(time(NULL));
for (int i=0;i<NUM;i++){double val=0;while(val <1){val+=(rand()/(double)RAND_MAX);sum++;}}
printf("%f\n",sum/(double)NUM);
return 0;
}

为了证明这一点,让我们先来看一个更简单的问题:任取两个 0 到 1 之间的实数,它们的和小于 1 的概率有多大?容易想到,满足 x+y<1 的点 (x, y) 占据了正方形 (0, 1)×(0, 1) 的一半面积,因此这两个实数之和小于 1 的概率就是 1/2 。类似地,三个数之和小于 1 的概率则是 1/6 ,它是平面 x+y+z=1 在单位立方体中截得的一个三棱锥。这个 1/6 可以利用截面与底面的相似比关系,通过简单的积分求得:
       ∫(0..1) (x^2)*1/2 dx = 1/6。 或者实际上就等于二维的结果再乘以1/3,也就是 1/2 * 1/3 = 1/6.

以此类推, 四个数的情况,和小于1的概率为 1/6 * 1/4 = 1/24;

五个数概率为 1/24 * 1/5 ......

 n 个随机数之和不超过 1 的概率就是 1/n! ,反过来 n 个数之和大于 1 的概率就是 1 - 1/n! ,因此加到第 n 个数才刚好超过 1 的概率就是
       (1 - 1/n!) - (1 - 1/(n-1)!) = (n-1)/n!    (第一部分为n个数和大于1的Prob,第二部分为n-1个数和大于1的Prob)
    因此,要想让和超过 1 ,需要累加的期望次数为
       ∑(n=1~∞) n * (n-1)/n! = ∑(n=0~∞) 1/n! = 1+1+1/2+1/6+..... = e   

      (这里是求期望的公式,原博客的这一步错误,我做了修改)

这里再贴一个常见泰勒展开公式,不然老是忘!

8. MLE、MAP和贝叶斯估计

网上有很多介绍,看我列出的博客足以,参考博客:

最大似然估计(MLE),最大后验概率估计(MAP),贝叶斯估计入门讲解

https://blog.csdn.net/lsldd/article/details/84488678

机器学习中的MLE、MAP和贝叶斯估计

https://cloud.tencent.com/developer/news/219953

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

https://blog.csdn.net/zdaiot/article/details/82912138

这里做简要概述(参考第一篇博客)—— 

1. MLE:    

2. MAP: 


上式的分母部分P(X)为已知的(称作证据),因此,我们只需要最大化分子部分:P(θ|X)P(θ)

3. 贝叶斯估计 :

贝叶斯估计与上述两类估计方法最大的区别在于:该类方法并不求出参数θ的具体值,而是求出θ的概率分布模型。

其实这是因为P(θ)使用的先验模型——贝塔分布,与P(θ|X)使用的伯努利分布是共轭关系。正是这种共轭关系,使得伯努利分布乘以贝塔分布,其结果是一个新的贝塔分布。可以这样理解贝叶斯方法:
(1)首先提出一个先验模型,该模型参数为θ;
(2)通过结合实验数据,最终得到一个新的模型,该模型参数为θ*。

分析(参考第二篇博客)—— 

  • 最大似然估计被人诟病之处是估计存在bias,在某些极端情况下,是违反经验与直觉的,例如样本很少的时候我们的观测结果很可能出现偏差。最大后验概率估计可以有效地减弱这种bias,但是最大后验概率需要引入先验概率分布P(θ) P(θ)P(θ), 所以最大后验概率估计的效果,也取决于先验概率的设定,一个糟糕的先验概率将会导致一个糟糕的后验概率估计。
  • 贝叶斯估计和MAP挺像的,都是以最大化后验概率为目的。区别在于:1)极大似然估计和MAP都是只返回了的预估值,就完事了       2)MAP在计算后验概率的时候,把分母P(X) 给忽略了,在进行贝叶斯估计的时候则不能忽略     3)贝叶斯估计要计算整个后验概率的概率分布
  • 这里有一个技巧,对于一个特定的likehood,如果我们选择了一个先验概率分布,通过上面两个公式的计算,得出的后验概率和先验概率是同分布的,这时候我们说这个先验分布是共轭先验。
  • 贝叶斯估计相对于最大后验估计的好处还在于,贝叶斯估计计算了整个后验概率的分布,从而也能求出其他一些比如分布的方差之类的值来供参考,比如计算出来方差太大的,我们可以认为分布不够好,从而把这个当做选择超参数的一个考虑因素。实际上,贝叶斯估计会比MAP把估计的结果往先验结果“拉”的程度还提高了一些,从而使估计结果更靠近先验结果。

找到了一篇更好的知乎上的回答——

聊一聊机器学习的MLE和MAP:最大似然估计和最大后验估计   https://zhuanlan.zhihu.com/p/32480810

9. MLE,MAP,EM 和 point estimation 之间的关系是怎样的?

简书上的一篇文章: https://www.jianshu.com/p/2fc4a90d7e59

这个问题在知乎上被问过,所以这里把知乎上赞最多的答案搬上来——

https://www.zhihu.com/question/19894595/answer/13309335

看完这两篇介绍,我想这个问题已经讨论的比较深入了,接下来你可以用自己的话再精炼一下。

最大似然估计(MLE)和最小均方误差估计(MMSE)都属于点估计的estimator,前者使用了似然(Likelihood)的概念;最大后验概率估计(MAP)也一样,只是它是一种贝叶斯统计/贝叶斯点估计视角下的estimator,引入了贝叶斯定理、先/后验概率的概念。

10. 如何求解Ax=b (非迭代Cholesky分解、QR分解,迭代)

找到两篇关于Eigen库求解线性方程组的博客——

Eigen解线性方程组

https://blog.csdn.net/u013354805/article/details/48250547

使用Eigen解Ax=b线性方程组

https://blog.csdn.net/hanshihao1336295654/article/details/83512082

转自第一篇博客——

矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积,可分为三角分解、满秩分解、QR分解、Jordan分解和SVD(奇异值)分解等,常见的有三种:1)三角分解法 (Triangular Factorization),2)QR 分解法 (QR Factorization),3)奇异值分解法 (Singular Value Decompostion)。

  • LU三角分解:三角分解法是将原正方 (square) 矩阵分解成一个上三角形矩阵 或是排列(permuted) 的上三角形矩阵和一个 下三角形矩阵,这样的分解法又称为LU分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求 反矩阵,和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同 的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。MATLAB以lu函数来执行lu分解法, 其语法为[L,U]=lu(A)。
  • QR分解:QR分解法是将矩阵分解成一个正规正交矩阵与上三角形矩阵,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。MATLAB以qr函数来执行QR分解法, 其语法为[Q,R]=qr(A)。
  • 奇异值分解:奇异值分解 (singular value decomposition,SVD) 是另一种正交矩阵分解法;SVD是最可靠的分解法,但是它比QR 分解法要花上近十倍的计算时间。[U,S,V]=svd(A),其中U和V分别代表两个正交矩阵,而S代表一对角矩阵。 和QR分解法相同, 原矩阵A不必为正方矩阵。使用SVD分解法的用途是解最小平方误差法和数据压缩。MATLAB以svd函数来执行svd分解法, 其语法为[S,V,D]=svd(A)。
  • LLT分解:A=LL^TCholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的(LU三角分解法的变形)。
  • LDLT分解法:若A为一对称矩阵且其任意一k阶主子阵均不为零,则A有如下惟一的分解形式:A=LDL^T其中L为一下三角形单位矩阵(即主对角线元素皆为1),D为一对角矩阵(只在主对角线上有元素,其余皆为零),L^T为L的转置矩阵。LDLT分解法实际上是Cholesky分解法的改进,因为Cholesky分解法虽然不需要选主元,但其运算过程中涉及到开方问题,而LDLT分解法则避免了这一问题,可用于求解线性方程组。

一篇关于矩阵分解讲的比较好的博客 : https://blog.csdn.net/lixujie666/article/details/85010089

11. 最小二乘封闭解与迭代解的取舍

请转至 上面的问题: 线性回归推导回归系数。

12. 梯度下降法、牛顿法、GN、LM,推导、优缺点

请转至,我的博客:  SLAM / 3D Vision求职专题 | SLAM知识篇(D2)  问题四

https://blog.csdn.net/weixin_43795395/article/details/89916031

13. 如何判断点在多边形内

有三种方法可以实现:扫描法(适合任意多边形); 叉乘判断法(适合凸多边形);角度和判断法(适合任意多边形)

完整你可以参考https://blog.csdn.net/zhouzi2018/article/details/81737178

如果没时间,只看一种,那就是https://blog.csdn.net/u012138730/article/details/79927778。

以下来自于第二篇博客——

思路:
过这一点向右做一条水平射线,看这射线和多边形的几条边有交点。如果边的条数为奇数则说明点在多边形内。

(也可过这点向左,向上,向下做一条射线)

具体:
对每一条边和点进行如下判断,看是否满足下面两个条件,若均满足,则定义此边和射线有交点。设边为vj->vi,点为 pt :

1)点pt 的纵坐标是否满足式子: (vi[1] > pt[1])  !=  (vj[1] > pt[1])

即 pt 纵坐标是否满足[vj[1], vi[1]),如果 vj[1] > vi[1],那么[vi[1], vj[1]) ,即是否满足低闭高开。

2)再判断点pt 是否在 边所在的直线的 左边。

列出边的标准方程 x = ky + b ,把 pt的纵坐标带入,得到x的值, 如果是大于 pt 的横坐标,那么说明 点pt 在边所在的直线的 左边。【不需要考虑 y = b 的水平线的方程,因为如果边是水平线 和 点 在同一条直线上,上面的第一个条件就不满足】

如下图 有三个特殊点pt1 pt2 pt3,根据上面判断方法,均能正确得到在多边形内的结论,即满足条件的边为奇数个。

pt0是一个正常点, 满足条件的边为v0v1 v1v2 v2v3,3条。

pt1是一个特殊点,满足条件的边为v0v1 v1v2 v2v3,3条。pt1与v1点在同一条水平线上,v0v1 和 v1v2 均满足第一个条件(一个等于,一个大于,低闭高开),v2v3正常满足。

pt2是一个特殊点,满足条件的边为v2v3,1条。pt2与v3点 v4点在同一条水平线上,v3v4不满足第一个条件(均等于),v4v5不满足第一个条件(一个等于,一个小于)。

pt3是一个特殊点,满足条件的边为v4v5,1条。pt3与v5点在同一条水平线上,v5v6不满足第一个条件(一个等于,一个小于)。
--------------------- 
作者:ivy_0709 
原文:https://blog.csdn.net/u012138730/article/details/79927778

代码实现—— 

/// All points are projected onto the xz-plane, so the y-values are ignored.
bool dtPointInPolygon(const float* pt, const float* verts, const int nverts)
{// TODO: Replace pnpoly with triArea2D tests?int i, j;bool c = false;for (i = 0, j = nverts-1; i < nverts; j = i++){const float* vi = &verts[i*3];const float* vj = &verts[j*3];if (((vi[2] > pt[2]) != (vj[2] > pt[2])) &&(pt[0] < (vj[0]-vi[0]) * (pt[2]-vi[2]) / (vj[2]-vi[2]) + vi[0]) )c = !c;}return c;
}

14. 一阶、二阶优化,Jacobian、hessian矩阵

以最小二乘问题为例,

15. 1000个数的阶乘,求有多少个0

  • 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100...1000      1000 / 5 = 200    5的倍数        1个0

这些数和任意的偶数相乘,结尾就会产生0

  • 5*5 5*5*2 5*5*3 5*5*4 5*5*5 5*5*6 5*5*7 5*5*8 5*5*9 5*5*10...5*5*40       1000 / 25 = 40      25的倍数      2个0

第一次将会产生一个零的都统计了,但还有些数会产生两个0,去掉1个0还剩1个0.

  • 5*5*5 5*5*5*2 5*5*5*3 5*5*5*4 5*5*5*5 5*5*5*6 5*5*5*7 5*5*5*8               1000 / 125 = 8        125的倍数    3个0

去掉2个0还剩1个0.

  • 5*5*5*5                                                                                                       1000 / 625 = 1        625的倍数    4个0

去掉3个0还剩1个0.

总的个数为 = 200 + 40 + 8 + 1 = 249

如果用代码来实现上面的思路:

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{long total;long Integer;long i;scanf("%ld", &total);long count = 0;int flag = 0;for (i = 5; i <= total; i++){Integer = i;flag = Integer % 5;while(flag==0){Integer = Integer / 5;flag = Integer % 5;count = count + 1;}}printf("%ld\n", count);return 0;
}---------------------
原文:https://blog.csdn.net/yahohi/article/details/7528803

16. 递推法求数学期望,反证法,数学归纳法等

此题略。




写博不易,您的支持让知识之花绽放得更美丽 ~_~

3D Vision、SLAM求职宝典 | 数学篇(B)相关推荐

  1. 3D Vision、SLAM求职宝典 | SLAM知识篇(D1,重点 )

    今日得空,开始愉快的解答!各位看官请指教. 第一部分,先来完成该专题最重要的内容,即笔试面试中所考察的SLAM专业知识. SLAM知识篇所准备的这些问题不一定全面,但是问题都是基于三位求职者的总结回忆 ...

  2. 单目3D物体级SLAM | CubeSLAM: Monocular 3D Object SLAM

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文由知乎作者原野寻踪授权转载,不得擅自二次转载.原文链接:https://zhuanlan.zhih ...

  3. [LiteratureReview]CubeSLAM Monocular 3-D Object SLAM

    [LiteratureReview]CubeSLAM: Monocular 3-D Object SLAM 出处:2019 IEEE Transactions on Robotics,(截止到2022 ...

  4. CubeSLAM: Monocular 3D Object SLAM 论文笔记

    CubeSLAM: Monocular 3D Object SLAM 论文笔记 摘要 提出了一种静态和动态环境下单幅图像3D长方体目标检测和多视点目标SLAM的方法,并证明了这两个部分是相互促进的. ...

  5. 3d激光SLAM:LIO-SAM框架—IMU预积分功能数据初始化

    前言 LIO-SAM的全称是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 从全称上可以看出,该算法是一个紧耦合的 ...

  6. 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!

    地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...

  7. nvidia 3d vision kit + opengl + 立体视觉程序开发

    近来一周一直在看opengl + 3d vision kit 的编程开发方法,国内基本没有,因为3d vision kit只支持d3d的全屏的程序.只有满足是D3D+FULLSCREEN,才会由红外发 ...

  8. 3D点云 (Lidar)检测入门篇 - PointPillars PyTorch实现

    3D点云 (Lidar)检测入门篇 - PointPillars PyTorch实现 完整代码:https://github.com/zhulf0804/PointPillars. 自动驾驶中基于Li ...

  9. 32线镭神雷达跑LeGO-LOAM:3D 激光SLAM

    32线镭神雷达跑LeGO-LOAM:3D 激光SLAM 安装LeGO-LOAM 镭神雷达的相关修改 LeGO-LOAM的修改 修改utility.h 修改imageproject.cpp Enjoy ...

最新文章

  1. window下python扩展包大全
  2. python3中unicode怎么写_详解python3中ascii与Unicode使用
  3. 13、 LEFT/RIGHT JOIN:外连接(左连接,右连接)
  4. pandas将表中的字符串转成数值型
  5. 机器学习基础-多元线性回归-02
  6. 金立云服务器维护,今天,咱们聊聊金立amigo的防盗功能!
  7. 2021北京民营企业百强榜单发布 美团、水滴等公司入选
  8. 微软测试新工具:让Windows 10和Android设备文件同步更方便
  9. MFC SetTimer函数的用法
  10. mac adb环境变量配置
  11. simulink中对powergui的使用
  12. 论用户体验测试:牛逼的功能千篇一律,好的用户体验万里挑一
  13. 我的MSN机器人终于有了自己的头像
  14. deepin恢复出厂_初始化 - deepin Wiki
  15. zookeeper--ClientCnxn
  16. puppy linux 版本,Puppy Linux 8.0 发布,轻量级发行版
  17. 第十三次ScrumMeeting博客
  18. 数据库产品-易用性问题
  19. C语言蓝桥杯刷题:成绩统计
  20. 多行显示和单行显示溢出部分为...

热门文章

  1. 程序员最常浏览的论坛和网站
  2. 经济学人翻译练习4.16期刊——美国国税局
  3. Python爬虫 - 爬取豆瓣读书TOP250电子书
  4. mysql数据库根据引擎备份_MySQL数据库备份的几种方式
  5. ubuntu20.04 镜像下载
  6. 大工计算机学硕多少分能上,大连理工大学考研难考吗?(大连理工大学考研难度分析)...
  7. C语言学生选课系统实现
  8. 非线性振动 matlab,非线性振动MATLAB仿真-期末总结分析
  9. 统计学和计算机联系大吗?
  10. 蓝桥 10 基础练习 十进制转十六进制 python