选自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

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²。我们可以通过绘图验证数据为二次项,而不是三阶或四阶多项式。从本质上讲,这是一个基础的机器学习问题,因此再回顾一些基本术语:

模型参数:模型进行自动调整从而找到最佳参数,在这种情况下,参数为 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 #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

#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

java使用蒙特卡罗方法计算半径为r圆的面积_不用微积分,如何计算圆面积相关推荐

  1. Matlab仿真-蒙特卡罗方法求半径为1圆的面积

    试用蒙特卡罗方法求出半径为1的圆的面积,并与理论值对比. (1)数学模型.         设有两个相互独立的随机变量x,y,服从[0 2]上的均匀分布.那么,由它们所确定的坐标点(x,y)均匀分布于 ...

  2. java定义一个方法计算三角形,长方形,圆形面积和周长

    java定义一个方法计算三角形,长方形,圆形面积和周长 /*** 定义一个方法,返回一个圆的周长 半径* 定义一个方法,返回一个圆的面积 半径* 定义一个方法,返回一个矩形的周长 长 宽* 定义一个方 ...

  3. matlab蒙特卡罗方法求体积_实验二-蒙特卡罗方法计算三维体积

    班级: 学号: 姓名: 实验时间: 2014 年 月 日 实验 项目 实验二 蒙特卡罗方法计算三维体积 所属 课程 数学实验 实 验 目 的 了解蒙特卡罗方法的原理,掌握随机数使用技术. 实 验 内 ...

  4. Python每日一学 03——计算半径为r的圆的面积

    Python每日一学 03--计算半径为r的圆的面积 文章目录 Python每日一学 03--计算半径为r的圆的面积 一.计算半径为r的圆的面积 二.按IPO模式解决 三. 输入转数值 四.精度问题 ...

  5. Python用蒙特卡罗方法计算圆周率近似值

    实验目的: 1.理解蒙特Ÿ卡罗方法原理. 2.理解for循环本质与工作原理. 3.了解random模块中常用函数. 实验内容: 蒙特Ÿ卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的 ...

  6. python输入半径求圆的面积、保留三位小数_编写程序,输入圆的半径,求该圆的面积与周长(保留三位小数)。 /* 程序功能:输入圆的半径,计算圆的面积与周长*/_学小易找答案...

    [编程题]从字符串中删除指定的字符.同一字母的大小写按不同字符处理. 例如:若程序执行时,输入字符串为: turbo c and Borland c++ ,从键盘上输入字符: n ,则输出后变为: t ...

  7. 用python计算圆的面积_用Python计算大圆距

    用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...

  8. 【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享

    原文链接:http://tecdat.cn/?p=2687 在贝叶斯方法中,马尔可夫链蒙特卡罗方法尤其神秘(点击文末"阅读原文"获取完整代码数据). 它们肯定是数学繁重且计算量大的 ...

  9. Python项目实践:蒙特卡罗方法计算圆周率

    一.数学思维 # CalPi.py n = 100 Pi = 0 for k in range(n):Pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 ...

最新文章

  1. 强化学习在机器人装配工艺中的应用
  2. [译]Vulkan教程(05)Instance
  3. DEV express 对Gridview某行的元素赋值
  4. nssl1248-B【点分治,平衡树】
  5. 基于RobotFramework实现自动化测试
  6. win7系统还原失败怎么解决
  7. Java笔记-Semaphore简单应用实例
  8. scala编程第18章学习笔记——有状态的对象
  9. python fetchall()转化为数据框_python 操作mysql数据中fetchone()和fetchall()方式
  10. ccsa安学网小程序_适合微信小程序安装的SSL证书有哪些
  11. linux mbr转gpt分区,linux将GPT分区转换为MBR、RHEL GPT报错
  12. WTL自绘界面库(CQsStatic)
  13. FIL世界全新板块——DeFi震撼来袭
  14. 《Detecting Adversarial Examples through Image Transformation》和CW attack的阅读笔记
  15. outlook签名文件编辑_如何在Microsoft Outlook中创建,编辑和应用签名
  16. makefile(9) : fatal error U1052: 未找到文件Win32.Mak
  17. 谁会使用IEC61499
  18. 微型计算机键盘连接在,树莓派推出Pi 400型微型计算机 主机藏在键盘里连接显示器即可使用...
  19. iPhone计算机没有删除键,iphone备份相片没删除键怎么用电脑删除
  20. JS---event事件

热门文章

  1. 又见The request sent by the client was syntactically incorrect ()
  2. Swift的控制转移语句--continue语句
  3. 新工作 (2) : 准备
  4. php ado 建立注册,如何注册ADO与DAO [Access软件网]
  5. centos arm-linux-gcc,CentOS 5.5下arm-linux-gcc交叉编译环境的搭建
  6. k1658停运到什么时候_2021年春运就要开始啦!快来看看各大快递的停运时间吧
  7. oracle typehandler,Mybatis实现自定义的类型转换器TypeHandler
  8. 施工工期计算器在线_办公室装修工期要多久时间,办公室快速装修怎么做?
  9. 测试监控系列:使用vb批量统计nmon结果
  10. 剑指offer面试题[12]-打印1到最大的n位数