选自medium
作者:Andre Ye
机器之心编译
机器之心编辑部
杀鸡用牛刀,我们用机器学习方法来算圆的面积。
询问任何人圆的面积是多少,他们都会告诉你不就是?r²吗。但如果你问他们为什么,他们很可能并不知道。
这是因为圆的面积公式的证明在大多数情况下要么不直观,不令人满意,要么充斥着积分等高级数学概念。
借鉴统计学习和机器学习的核心原理,我们可以使用蒙特卡罗模拟和多项式/二次回归来创建基于计算的方法,以找到圆的面积公式。
在不使用任何数学运算的情况下得出圆的面积,我们使用了蒙特卡罗方法。从探索不规则形状的面积到预测股票市场的情况,都用到了蒙特卡罗方法。该方法的核心思想是引入随机性,并测量系统对其作出的反馈,甚至可以在不了解系统原理的情况下获得有效信息。
在使用蒙特卡罗来近似圆的面积时,我们先生成一些随机坐标点 (x1,x2),这两个方向的坐标都是从负半径值到正半径值的均匀分布绘制得到的。我们在圆中放入 250,000 个这样的坐标点,如中心极限定理(或大数定律)所描述的,研究所用的真实随机样例点越多,得到的结果就会越准确。
对于圆内的每一个点,我们可以引入一个落入圆内的点的数目的计数变量。在所有随机点都被投入之后,圆内的点数除以总点数(该研究中为 250,000)的值就代表在正方形内圆的面积所占的分数。该正方形的边长是圆的半径的两倍,因此正方形的面积是 4r²,其中 r 是圆的半径。用 4r²乘之前得到的分数,就得到了圆的面积。通过蒙特卡罗方法,可以非常接近地得到圆的真实面积而无需数学计算公式。
道理很简单,结果几乎完全正确!
我们可以在给定半径 r 的情况下找到任何圆的面积,但此时此刻我们还没有归纳出圆的公式。为找到公式,我们需要创建一个二次方程式进行建模,该方程式需要一个半径并尝试输出面积。为了正确地拟合方程,我们必须为每个半径的蒙特卡洛近似面积收集数据。
import numpy as np
from tqdm import tqdm #Just a progress bar indicator
#Number of randomized points to generate for each approximation
num_points = 250_000
#Lists to store the radius and its corresponding area approximation
radii = []
areas = []
#For each of the 500 equally spaced values between 1 and 100 inclusive:
for radius in tqdm(np.linspace(1,100,500)):
#A counter for the number of points in the circle
in_circle = 0
for i in range(num_points):
#Generate an x and y coordinate from a uniform distribution bounded by a tangent box
xcoor = np.random.uniform(-radius,radius)
ycoor = np.random.uniform(-radius,radius)
#If the point is inside the circle, add one to in_circle
if xcoor**2 + ycoor**2 < radius**2:
in_circle += 1
#Get the fraction of the points that were inside the circle
area_frac = in_circle/num_points
#Append the approximated area and the radius
areas.append(area_frac*(4*(radius**2)))
radii.append(radius)
而下一步就是写一个拟合数据的二次项模型(回归模型),y =ax²。我们可以通过绘图验证数据为二次项,而不是三阶或四阶多项式。从本质上讲,这是一个基础的机器学习问题,因此再回顾一些基本术语:
有了这些变量,我们可以构建一个非常基础简单的程序,使得它对这些数据拟合:
通过对平均绝对误差的反复优化,模型最终将收敛出一个「最佳」的 coef 值(从而最大程度地降低平均绝对误差)。这一思路正是机器学习的核心原理——通过反复地推断、评估和修正,计算机可以「磨炼」出一套最优的参数。
coef = 0.1 #Initial coefficient value
learning_rate = 0.00001 #How fast the model 'learns'
iterations = 100000 #How many times we want the model to 'practice and correct'
for i in tqdm(range(iterations)): #note - tqdm is just a progressbar
#Propose two path for the coefficient:
up_coef = coef + learning_rate #Move up
down_coef = coef - learning_rate #Or move down
#Store the predictions for a model using parameters up_coef and down_coef
up_pred = []
down_pred = []
#For each radius value in the previously created list radii:
for r in radii:
#Append the model using up_coef's and down_coef's prediction (a*r^2)
up_pred.append(up_coef*(r**2))
down_pred.append(down_coef*(r**2))
#Find the MAE. Both are converted to NumPy arrays for easy operation.
up_coef_mae = np.abs(np.array([up_pred])-np.array([areas])).mean()
down_coef_mae = np.abs(np.array([down_pred])-np.array([areas])).mean()
#If moving the coefficient down yields a lower (better) MAE:
if down_coef_mae < up_coef_mae:
#Set it equal to down_coef
coef = down_coef
#Otherwise (moving the coefficient up yields a lower (better) or equal MAE:
else:
#Set it equal to up_coef
coef = up_coef
当我们查看训练的 coef 值时,可以看到它等于π:
print(str(coef)[:5]) #first four digits of coefficient (decimal point counts as a character)
[Output]: '3.141'
当然,计算圆面积的公式很好记就是?r²。无需使用微积分中的任何复杂的数学方法或其他证明,我们就能找到它的公式,并找到一种使用蒙特卡洛模拟和二次回归找到?值的方法。使用这种思路就可以找到计算圆面积的方法——当然也可以找到任何图形的面积计算公式——椭圆、心形、二维的乌龟形状——只要参数可以说明它的轮廓。
近年来,计算机已经接手开始解决复杂的高可变数学问题,计算圆面积只是其中的一个简单的示例。如果想要更复杂、更具开创性的,那当然是四色定理了(每个无外飞地的地图都可以用不多于四种颜色来染色,且不会有两个邻接的区域颜色相同)。这是第一个由计算机先生成证明,又被数学家广泛接受的成果。
借助计算机,人类可以探索以往无法尝试进入的,极其复杂的数学领域。
原文链接:https://medium.com/swlh/finding-the-formula-for-circle-area-without-using-any-math-898cbee70253