选自medium
AndreYe
编译机器之心
机器之心部
用牛刀杀鸡,我们用机器学习方法来计算圆的面积。
问问任何人圆的面积是多少,他们会告诉你不是r2吗。但如果你问他们为什么,他们可能不知道。
这是因为在大多数情况下,圆面积公式的证明要么不直观,不令人满意,要么充满了高级数学概念,如积分。
借鉴统计学习和机器学习的核心原理,我们可以利用蒙特卡罗模拟和多项式/二次回归创建基于计算的方法,找到圆面积公式。
我们使用蒙特卡罗法,而不使用任何数学操作来获得圆形面积。蒙特卡罗法用于探索不规则形状的面积,预测股市。该方法的核心思想是引入随机性,测量系统的反馈,甚至在不了解系统原理的情况下获得有效的信息。
当蒙特卡罗被用来接近圆形区域时,我们先生会形成一些随机坐标点(x1,x2)这两个方向的坐标均匀分布是从负半径值到正半径值绘制的。我们在圆中放置2.5万个坐标点,如中心极限定理(或大数定律)所描述的,研究中使用的真实随机样本示例越多,结果就越准确。
对于圆内的每个点,我们可以引入一个落入圆内的点的计数变量。所有随机点投入后,圆内点除以总点(研究中为2.5万)的值,代表正方形内圆面积的分数。正方形的边长是圆半径的两倍,所以正方形的面积是4r二、其中r是圆的半径。用4r乘以前得到的分数,就得到了圆面积。在没有数学计算公式的情况下,通过蒙特卡罗法,圆的真实面积可以非常接近。
事实很简单,结果几乎完全正确!
在给定半径r的情况下,我们可以找到任何圆的面积,但此时此刻我们还没有总结出圆的公式。为了找到公式,我们需要创建一个二次方程式进行建模,需要一个半径并尝试输出面积。为了正确拟合方程,我们必须收集每个半径的蒙特卡洛近似区域的数据。
importnumpyasnp
fromtqdmimporttqdm#Justaprogressbarindicator
#Numberofrandomizedpointstogenerateforeachroximation
num_points=250_000
#Liststostoretheradiusanditscorrespondingarearoximation
#Foreachofthe500equallyspacedvaluesbetween1and100inclusive:
forradiusintqdm(np.linspace(1,100,500)):
#Acounterforthenumberofpointsinthecircle
in_circle=0
foriinrange(num_points):
#Generateanxandycoordinatefromauniformdistributionboundedbyatangentbox
xcoor=np.random.uniform(-radius,radius)
ycoor=np.random.uniform(-radius,radius)
#Ifthepointisinsidethecircle,addonetoin_circle
ifxcoor**2 ycoor**2
in_circle =1
#Getthefractionofthepointsthatwereinsidethecircle
area_frac=in_circle/num_points
#endtheroximatedareaandtheradius
areas.end(area_frac*(4*(radius**2)))
radii.end(radius)
下一步是编写拟合数据的二次项模型(回归模型),y=ax2。我们可以通过绘图验证数据是二次项,而不是三阶或四阶多项式。我们可以通过绘图验证数据是二次项,而不是三阶或四阶多项。本质上,这是一个基本的机器学习问题,所以回顾一些基本术语:
模型参数:自动调整模型以找到最佳参数。在这种情况下,参数是a。若有n个参数,则该模型称为n维。我们使用的最基本的模型是一维的,对图像进行分类的深度神经网络可能有数百万个维度。
损失函数:损失函数是对当前模拟情况的评估,并希望找到能得到最低误差的参数集,从而使损失函数最小化。例如,如果参数值j的损失函数值为3,而参数值k的损失函数值为2,则应选择参数值k。
平均绝对误差(MAE):由于它易于使用和理解,我们将使用损失函数/错误测量。给出当前参数(a)和模型预测值,平均绝对误差是指预测值和真实值之间的平均差异,较低的MAE意味着模型更适合数据。
学习率:为了优化参数,模型将是特定的「方向」逐步调整参数。因为我们目前的模型只优化一个参数(a),因此,只需决定在一维平面上增加或减少参数值(任何变化都会产生较低的损失函数)。在调整过程中,模型的移动量称为学习率。较高的学习速度意味着模型可能会在短时间内获得一组有效的参数,但不能保证其准确性,较低的学习率可以获得非常好的参数和较高的准确性。唯一的一点是需要大量的训练时间。
有了这些变量,我们可以构建一个非常基本和简单的程序来拟合这些数据:
把参数coef(a)初始化为0.1。
训练周期中的每一次迭代:
提出两条coef路径;coef lr和coef-lr,其中lr是学习率。
对使用coef=coef lr模型及使用coef=coef-lr平均模型评估绝对误差。
将coef设置为等等coef lr和coef-lr中平均绝对误差值较小的数字。
通过反复优化平均绝对误差,模型最终将收敛「最佳」coef值(从而最大限度地减少平均绝对误差)。这个想法是机器学习的核心原理——计算机可以通过反复推断、评估和修正来实现「磨炼」制作一套最佳参数。
coef=0.1#Initialcoefficientvalue
learning_rate=0.00001#Howfastthemodel'learns'
iterations=100000#Howmanytimeswewantthemodelto'practiceandcorrect'
foriintqdm(range(iterations)):#note-tqdmisjustaprogressbar
#Proposetwopathforthecoefficient:
up_coef=coef learning_rate#Moveup
down_coef=coef-learning_rate#Ormovedown
#Storethepredictionsforamodelusingparametersup_coefanddown_coef
#Foreachradiusvalueinthepreviouslycreatedlistradii:
forrinradii:
#endthemodelusingup_coef'sanddown_coef'sprediction(a*r^2)
up_pred.end(up_coef*(r**2))
down_pred.end(down_coef*(r**2))
#FindtheMAE.BothareconvertedtoNumPyarraysforeasyoperation.
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()
#Ifmovingthecoefficientdownyieldsalower(better)MAE:
ifdown_coef_mae
#Setitequaltodown_coef
coef=down_coef
#Otherwise(movingthecoefficientupyieldsalower(better)orequalMAE:
else:
#Setitequaltoup_coef
coef=up_coef
当我们检查训练的coef值时,可见它等于π:
print(str(coef)[:5])#firstfourdigitsofcoefficient(decimalpointcountsasacharacter)
[Output]:'3.141'
当然,计算圆面积的公式很容易记住r2。我们可以找到它的公式,并找到一种使用蒙特卡洛模拟和二次回归找到值的方法,而无需使用微积分中任何复杂的数学方法或其他证据。我们可以找到它的公式,并找到一种使用蒙特卡洛模拟和二次回归找到值的方法,而无需使用微积分中任何复杂的数学方法或其他证据。用这个想法,你可以找到计算圆面积的方法——当然,你也可以找到任何图形的面积计算公式——椭圆形、心形和二维乌龟形状——只要参数能解释它的轮廓。
近年来,计算机已经接管并开始解决复杂的高可变数学问题,计算圆面积只是一个简单的例子。如果你想要更复杂、更开创性,那当然是四色定理(每张无外飞地的地图可以染色不超过四种颜色,两个相邻区域不会有相同的颜色)。这是计算机先生证明并被数学家广泛接受的第一个结果。
借助计算机,人类可以探索极其复杂的数学领域,这是过去无法尝试的。
毕业证样本网创作《椭圆形面积计算公式(不用微积分,如何计算圆面积)》发布不易,请尊重! 转转请注明出处:https://www.czyyhgd.com/825019.html