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. 后记
仅分享自己的想法,有意见和指点非常感谢