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=1∑n[(xi−a)2+(yi−b)2+(zi−c)2−R2]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] ∂a∂L=−4i=1∑n(xi−a)[(xi−a)2+(yi−b)2+(zi−c)2−R2]
∂ 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] ∂b∂L=−4i=1∑n(yi−b)[(xi−a)2+(yi−b)2+(zi−c)2−R2]
∂ 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] ∂c∂L=−4i=1∑n(zi−c)[(xi−a)2+(yi−b)2+(zi−c)2−R2]
∂ 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] ∂R∂L=−4i=1∑nR[(xi−a)2+(yi−b)2+(zi−c)2−R2]
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=ai−lr∗∂a∂L
b i + 1 = b i − l r ∗ ∂ L ∂ b b_{i+1}=b_{i}-lr*\frac{∂L}{∂b} bi+1=bi−lr∗∂b∂L
c i + 1 = c i − l r ∗ ∂ L ∂ c c_{i+1}=c_{i}-lr*\frac{∂L}{∂c} ci+1=ci−lr∗∂c∂L
R i + 1 = R i − l r ∗ ∂ L ∂ R R_{i+1}=R_{i}-lr*\frac{∂L}{∂R} Ri+1=Ri−lr∗∂R∂L
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=∫dz∫f(x,y,z)dxdy
2.6.3 三角剖分求体积
3. 后记
仅分享自己的想法,有意见和指点非常感谢