算法学习记录1102
- [[#RANSAC|RANSAC]]
- [[#稀疏矩阵存储|稀疏矩阵存储]]
- [[#稀疏矩阵存储#CSC|CSC]]
- [[#稀疏矩阵存储#CSR|CSR]]
- [[#B样条曲线|B样条曲线]]
- [[#增广加软约束初次尝试|增广加软约束初次尝试]]
- [[#增广添加软约束|增广添加软约束]]
RANSAC
RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
RANSAC算法不依赖于特定的模型或数据集,只要能够定义出模型和内外点的判断标准,就可以使用RANSAC算法。
RANSAC算法的实现步骤如下:
- 随机选择一定数量的样本点。
- 使用这些样本点拟合一个模型。
- 计算所有数据点到该模型的误差,将误差小于阈值的数据点视为内点。
- 如果内点数量足够多,则认为找到了一个好的模型,否则继续随机选择样本点进行下一次迭代。
- 重复上述步骤,直到达到最大的迭代次数或找到一个满意的模型
![[ransac.pdf]]
稀疏矩阵存储
CSC
CSC(Compressed Sparse
Column)格式是一种稀疏矩阵存储格式,主要用于存储稀疏矩阵的列压缩形式
- 值(values):存储非零元素的值,按照列的顺序排列,即
[1, 4, 3, 2, 5]。
- 列指针(column
pointers):表示每一列第一个非零元素在值数组中的索引位置,对于这个 的矩阵,有三列,列指针数组为
[0, 2, 3, 4]。解释如下:
- 第 0 列第一个非零元素(1)在值数组中的索引为 0,所以第一个数是
0。
- 第 1 列第一个非零元素(3)在值数组中的索引为 2,所以第二个数是
2。
- 第 2 列第一个非零元素(2)在值数组中的索引为 3,所以第三个数是
3。
- 最后一个数是值数组的长度,表示最后一列之后的位置,这里值数组长度为
5,所以最后一个数是 4。
- 行索引(row
indices):存储非零元素所在的行索引,按照列的顺序排列,即 [0,
2, 1, 0, 2]。对应值数组中的元素,分别表示它们所在的行。 ### CSR
CSR(Compressed Sparse
Row)格式是另一种稀疏矩阵存储格式,主要用于存储稀疏矩阵的行压缩形式。对于给定的 的核矩阵 :
- 值(values):存储非零元素的值,按照行的顺序排列,即
[1, 2, 3, 4, 5]。
- 行指针(row
pointers):表示每一行第一个非零元素在值数组中的索引位置,对于这个 的矩阵,有三行,行指针数组为
[0, 2, 3, 5]。解释如下:
- 第 0 行第一个非零元素(1)在值数组中的索引为 0,所以第一个数是
0。
- 第 1 行第一个非零元素(3)在值数组中的索引为 2,所以第二个数是
2。
- 第 2 行第一个非零元素(4)在值数组中的索引为 3,所以第三个数是
3。
- 最后一个数是值数组的长度,表示最后一行之后的位置,这里值数组长度为
5,所以最后一个数是 5。
- 列索引(column
indices):存储非零元素所在的列索引,按照行的顺序排列,即 [0,
2, 1, 0, 2]。对应值数组中的元素,分别表示它们所在的列。
B样条曲线
https://zhuanlan.zhihu.com/p/144042470 贝塞尔 P(t)=Σi=0n−1piBi,n(t),t∈[0,1] B样条
P(t)=Σi=0n−1piBi,d(t),t∈[tmin,tmax],2≤d≤n
- P(t) 表示曲线上的点坐标向量。
- n 为控制点 pi 数量。
- pi→为控制点坐标( i 从 0 开始)。
- Bi,n(t) 为控制点坐标影响权重的多项式系数(式中 i 代表坐标的索引, n 代表多项式最高的幂数)。
- d 影响 B 样条曲线的次数: d−1 就是曲线的次数。
- t 是绘制曲线时的取值。
一般来讲,tmin=0,tmax=n+p−1,这里很像是我们代码中的num_of_control_points。n是num_of_knots_,p是spline_order_。t不一定是整数,可以是区间tmin,tmax内的任何数值。
Cox-de Boor https://zhuanlan.zhihu.com/p/680031028
均匀B样条的矩阵表达,对于5阶B样条,k=0,1,2,3,4,矩阵列数1,2,3,4,5 均匀B样条曲线的表达式
c(t)=[1t...tk]Mk⎣⎡Pi−kPi−k+1...Pi⎦⎤, t∈[0,1],t=ui+1−uiu−ui∈[0,1]
这是从ui ui+1段曲线上关于参数t的曲线表达式,即第i段
Mk=⎣⎡m0,0..mk,0m0,1mk,1......m0,kmk,k⎦⎤
Mk的size为k+1 * k+1 mi,j=(k−1)!1ckk−iΣs=jk(−1)s−jCk+1s−j(k−s)k−i b样条在第i-1~i个knots上时,在order
= 5 的b样条上 ci(t)=[1t...t5]M5⎣⎡PiPi+1...Pi+5⎦⎤ 当 B
样条曲线的一个节点重复度为k次,且该节点的两侧各有 k个不同的节点时,对应的
B 样条曲线段可以被看作是一个 k次贝塞尔曲线。
贝塞尔曲线在该段内
b(t)=[1t...t5]A⎣⎡Q0Q1...Q5⎦⎤
此时我想要求的贝塞尔曲线的6个控制点,应有 ⎣⎡Q0Q1...Q5⎦⎤=A−1M5⎣⎡PiPi+1...Pi+5⎦⎤
增广加软约束初次尝试
min [XY]T[H00D][XY]
Y=⎣⎡x0x1...xny0y1...yn⎦⎤
再来一遍xy,然后 P=⎣⎡A000A000A.........000100010001.........000⎦⎤ 有n行,2n列 (PY)T(PY)=YTPTPY=YTDY
调整primal_warm_start为原来的两倍长度,将x和y复制一遍
调整osqp的kernel dim 为 4 * num_of_control_points_
如何使X与Y保持一致? 调整约束限制Y的x0和X的x0相等
A[XY]≤b
⎣⎡A0,0...An,01−10.........001...............A0,nAn,n00000−110......00−1...............00000⎦⎤⎣⎡xx0...xxnyx0...yxnxy0...xynyy0...yyn⎦⎤≤b
约束矩阵的增广——列数增加num_of_variables,行数增加num_of_variables,同时使用upper
bound和lower bound的话下面两个矩阵可以缩小 [AM0N] M=⎣⎡10......010000......0001⎦⎤
对角阵 N=−M
填充新矩阵时,稀疏矩阵,0就不必填了,主要填写后面的两个对角阵。
![[Pasted image 20241029105829.png]]
如果添加散点约束该如何实现?
对每一个point计算一下在某两个散点之间,如果投影在某两个散点间,就用该两个散点的直线约束✅
增广添加软约束
重新来考虑一个问题,假设我们在规划路径时,要让每个路径点都在一个直线的左侧
设给出直线上的两个点为 A:x0,y0,B:x1,y1 曲线上的某个散点为
P:pxi,pyi
可以使用叉乘来判断 AB×AP<0 (x1−x0)(pyi−y0)−(pxi−x0)(y1−y0)<0 等价于约束
(x1−x0)pyi−(y1−y0)pxi<y0(x1−x0)−x0(y1−y0) 写为向量形式则为 [y0−y1x1−x0][pxipyi]<[y0(x1−x0)−x0(y1−y0)] 对于原数据 ⎣⎡px0px1px2px3...pxnpy0py1py2...pyn⎦⎤
而言,约束所有点的表达式应该为 ⎣⎡y0−y100...00y0−y10...000y0−y1.....................000...y0−y1x1−x000...00x1−x00...000x1−x0.....................000...x1−x0⎦⎤⎣⎡px0px1px2...pxnpy0py1py2...pyn⎦⎤<⎣⎡y0(x1−x0)−x0(y1−y0)y0(x1−x0)−x0(y1−y0)y0(x1−x0)−x0(y1−y0)...y0(x1−x0)−x0(y1−y0)⎦⎤ 即为AnewX<bnew
其中Anew的行数等于点数,列数等于点数的二倍(因为有x和y两个坐标)
接下来调整一下原问题 原问题为 min XTHX, st A0X<b0 现在将目标函数增广为
[XY]T[H00I][XY]=XTHX+YTY
约束条件增广为
[A0Anew0I][XY]<[b0bnew]
即 A0X<b0,AnewX+Y<bnew 一般情况下,目标函数最小时,Y=0
此时约束条件等效于新约束为硬约束。
当新约束无法满足时,目标函数被惩罚,Y值不为零,使得新约束被满足。