梯度下降 球体拟合

1. 前言

前端时间很久前, 学校数模校赛A题第2问有一个基于给定点求体积的小问题,因为题目中描述为近球体,所以可以做球体拟合。当时恰巧在学习深度学习方面内容,所以有了这个梯度下降方法做球体拟合。

2. 正文

2.1 损失函数 loss-function

理论值为:设球心和半径为(a,b,c,R)(解释:a,b,c分别为x,y,z坐标
目标函数设计为:
L = ∑ i = 1 n [ ( x i − a ) 2 + ( y i − b ) 2 + ( z i − c ) 2 − R 2 ] 2 L=\sum_{i=1}^n[(x_i−a)^2+(y_i−b)^2+(z_i−c)^2−R^2]^2 L=i=1n[(xia)2+(yib)2+(zic)2R2]2

2.2 求偏导

∂ L ∂ a = − 4 ∑ i = 1 n ( x i − a ) [ ( x i − a ) 2 + ( y i − b ) 2 + ( z i − c ) 2 − R 2 ] \frac{∂L}{∂a}=−4\sum_{i=1}^n(x_i-a)[(x_i−a)^2+(y_i−b)^2+(z_i−c)^2−R^2] aL=4i=1n(xia)[(xia)2+(yib)2+(zic)2R2]
∂ L ∂ b = − 4 ∑ i = 1 n ( y i − b ) [ ( x i − a ) 2 + ( y i − b ) 2 + ( z i − c ) 2 − R 2 ] \frac{∂L}{∂b}=−4\sum_{i=1}^n(y_i-b)[(x_i−a)^2+(y_i−b)^2+(z_i−c)^2−R^2] bL=4i=1n(yib)[(xia)2+(yib)2+(zic)2R2]
∂ L ∂ c = − 4 ∑ i = 1 n ( z i − c ) [ ( x i − a ) 2 + ( y i − b ) 2 + ( z i − c ) 2 − R 2 ] \frac{∂L}{∂c}=−4\sum_{i=1}^n(z_i-c)[(x_i−a)^2+(y_i−b)^2+(z_i−c)^2−R^2] cL=4i=1n(zic)[(xia)2+(yib)2+(zic)2R2]
∂ L ∂ R = − 4 ∑ i = 1 n R [ ( x i − a ) 2 + ( y i − b ) 2 + ( z i − c ) 2 − R 2 ] \frac{∂L}{∂R}=−4\sum_{i=1}^nR[(x_i−a)^2+(y_i−b)^2+(z_i−c)^2−R^2] RL=4i=1nR[(xia)2+(yib)2+(zic)2R2]

2.3 梯度下降(反向传播)

利用梯度下降法对每次迭代后的(a,b,c,R)进行更新

其中lr代表学习率
a i + 1 = a i − l r ∗ ∂ L ∂ a a_{i+1}=a_{i}-lr*\frac{∂L}{∂a} ai+1=ailraL
b i + 1 = b i − l r ∗ ∂ L ∂ b b_{i+1}=b_{i}-lr*\frac{∂L}{∂b} bi+1=bilrbL
c i + 1 = c i − l r ∗ ∂ L ∂ c c_{i+1}=c_{i}-lr*\frac{∂L}{∂c} ci+1=cilrcL
R i + 1 = R i − l r ∗ ∂ L ∂ R R_{i+1}=R_{i}-lr*\frac{∂L}{∂R} Ri+1=RilrRL

2.4 超参数

批大小(batch_size)
学习率(learning_rate)
训练代数(epoch_num)

2.5 关键伪码

# 对迭代次数做循环
for epoch in range(num_epochs):
    #对数据集按batch_size做访问
    for i in range(batch):
        #分批取出batch大小的数据
        x,y,z=data(i)
        
        # X和y的每个批损失(在L()中做平均可以避免loss损失值太大的问题
        l = L(x,y,z,a,b,c,R)
        
        # 反向传播,更新目标参数
        #lr是学习率
        a = a - lr * (dL/dx)
        b = b - lr * (dL/dy)
        c = c - lr * (dL/dz)
        R = R - lr * (dL/dR)

2.6 其他思路

2.6.1 最小二乘法拟合球体

2.6.2 积分法球体积

求一个不规则物体的体积可以用3重积分
V = ∭ Ω f ( x , y , z ) d v = ∭ Ω f ( x , y , z ) d x d y d z V=∭_\Omega f(x,y,z)dv=∭_\Omega f(x,y,z)dxdydz V=Ωf(x,y,z)dv=Ωf(x,y,z)dxdydz
求三重积分可以有两种方式:“先一后二”、“先二后一”

其中先二后一是对面积分,再按高积分,可以按照微分的思想,取一个很小的dz然后对z的范围按dz的间隔取平面,对每个面做遍历(面积*dz粗略估计为该段的体积),需要考量的是这个方法涉及到的误差。
V = ∭ Ω f ( x , y , z ) d v = ∫ d z ∫ f ( x , y , z ) d x d y V=∭_\Omega f(x,y,z)dv=\int dz\int f(x,y,z)dxdy V=Ωf(x,y,z)dv=dzf(x,y,z)dxdy

2.6.3 三角剖分求体积

3. 后记

仅分享自己的想法,有意见和指点非常感谢

猜你喜欢

转载自blog.csdn.net/qq_51204877/article/details/125494649