知乎上有一个问题,内容是已知空间三个点的坐标,求三个点所构成的圆的圆心坐标(编程实现)?
根据圆的定义,这道题的核心就是找到一个点,到已知的三个点的距离相等,利用数学知识可以求解如下:
1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:
2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;
C1=x2^2+y2^2-x1^2-y1^2;
当然,我们今天不是来学习数学公式和数学推导的。Tensorflow是google开源的一款深度学习的工具,其实我们可以利用Tensoflow提供了强大的数学计算能力来求解类似的数学问题。
这道题,我们可以利用梯度下降算法,因为圆心是一个最优解,任何其它点都不满条件。(前提是这三个点不在一条直线上,否则是没有解的)
好了,我们先看代码先,然后在解释。
运行以上的python代码,结果如下:
经过900多次的迭代,圆心位置是(6.0,5.75),半径是3.25。
X,Y是计算的输入,在计算过程中我们会使用训练数据输入X,Y
cx,cy是我们想要找的圆心点,初始值设置为(3,3),一般的学习算法会使用随机的初始值,这里我选了三角形中的一个点,这样做一般会减少迭代的次数。
这几行代码是算法的核心。
原题目是空间上的点,我的例子是平面上的点,其实没有本质差别。可以加一个Z轴的数据。这个题,三维其实是多余的,完全可以把空间上的三个点投影到平面上来解决。
我用JS实现过另一个算法,但是不是总收敛。大家可以参考着看一看:
其中,绿色三个点条件点,红色的圆是最终的学习结果,黄色的中心点学习的轨迹。
利用这个例子,我想说的是: