不用任何數(shù)學(xué)方法,如何計算圓面積
殺雞用牛刀,我們用機器學(xué)習(xí)方法來算圓的面積。
詢問任何人圓的面積是多少,他們都會告訴你不就是𝜋r²嗎。但如果你問他們?yōu)槭裁?,他們很可能并不知道?/p>
這是因為圓的面積公式的證明在大多數(shù)情況下要么不直觀,不令人滿意,要么充斥著積分等高級數(shù)學(xué)概念。
借鑒統(tǒng)計學(xué)習(xí)和機器學(xué)習(xí)的核心原理,我們可以使用蒙特卡羅模擬和多項式/二次回歸來創(chuàng)建基于計算的方法,以找到圓的面積公式。
在不使用任何數(shù)學(xué)運算的情況下得出圓的面積,我們使用了蒙特卡羅方法。從探索不規(guī)則形狀的面積到預(yù)測股票市場的情況,都用到了蒙特卡羅方法。該方法的核心思想是引入隨機性,并測量系統(tǒng)對其作出的反饋,甚至可以在不了解系統(tǒng)原理的情況下獲得有效信息。
在使用蒙特卡羅來近似圓的面積時,我們先生成一些隨機坐標(biāo)點 (x1,x2),這兩個方向的坐標(biāo)都是從負(fù)半徑值到正半徑值的均勻分布繪制得到的。我們在圓中放入 250,000 個這樣的坐標(biāo)點,如中心極限定理(或大數(shù)定律)所描述的,研究所用的真實隨機樣例點越多,得到的結(jié)果就會越準(zhǔn)確。
對于圓內(nèi)的每一個點,我們可以引入一個落入圓內(nèi)的點的數(shù)目的計數(shù)變量。在所有隨機點都被投入之后,圓內(nèi)的點數(shù)除以總點數(shù)(該研究中為 250,000)的值就代表在正方形內(nèi)圓的面積所占的分?jǐn)?shù)。該正方形的邊長是圓的半徑的兩倍,因此正方形的面積是 4r²,其中 r 是圓的半徑。用 4r²乘之前得到的分?jǐn)?shù),就得到了圓的面積。通過蒙特卡羅方法,可以非常接近地得到圓的真實面積而無需數(shù)學(xué)計算公式。
道理很簡單,結(jié)果幾乎完全正確!
我們可以在給定半徑 r 的情況下找到任何圓的面積,但此時此刻我們還沒有歸納出圓的公式。為找到公式,我們需要創(chuàng)建一個二次方程式進(jìn)行建模,該方程式需要一個半徑并嘗試輸出面積。為了正確地擬合方程,我們必須為每個半徑的蒙特卡洛近似面積收集數(shù)據(jù)。
- 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)
而下一步就是寫一個擬合數(shù)據(jù)的二次項模型(回歸模型),y =ax²。我們可以通過繪圖驗證數(shù)據(jù)為二次項,而不是三階或四階多項式。從本質(zhì)上講,這是一個基礎(chǔ)的機器學(xué)習(xí)問題,因此再回顧一些基本術(shù)語:
- 模型參數(shù):模型進(jìn)行自動調(diào)整從而找到最佳參數(shù),在這種情況下,參數(shù)為 a。如果具有 n 個參數(shù),則該模型被稱為 n 維。我們所使用的最基本模型是一維的,而對圖像進(jìn)行分類的深度神經(jīng)網(wǎng)絡(luò)有可能具有數(shù)百萬個維度。
- 損失函數(shù):損失函數(shù)是對當(dāng)下模擬情況進(jìn)行評估,并希望找到可以得到最低誤差度的參數(shù)集,從而使得損失函數(shù)最小化。比如某個參數(shù)值 j 的損失函數(shù)值為 3,而參數(shù)值 k 的損失函數(shù)值為 2,則理應(yīng)選擇參數(shù)值 k。
- 平均絕對誤差(MAE):我們將使用損失函數(shù)/錯誤度量,其原因是因為它易于使用且易于理解。給定當(dāng)前參數(shù)(a)和模型預(yù)測值,而平均絕對誤差是指預(yù)測值與真實值之間平均相差有多大,較低的 MAE 意味著模型更適合數(shù)據(jù)。
- 學(xué)習(xí)率:為了優(yōu)化參數(shù),模型會在特定「方向」上逐漸調(diào)整參數(shù)。由于我們現(xiàn)在的模型僅優(yōu)化一個參數(shù)(a),因此僅需決定在一維平面上是增大或是減小參數(shù)值(任何變化都會產(chǎn)生較低的損失函數(shù))。而模型在調(diào)整過程中的移動量稱為學(xué)習(xí)率。較高的學(xué)習(xí)速度意味著模型有可能短時間內(nèi)就能得到一組效果較好的參數(shù),但無法保證其準(zhǔn)確度,而較低的學(xué)習(xí)率能夠獲得非常不錯的參數(shù),并且擁有較高的準(zhǔn)確度,唯一一點是需要大量的訓(xùn)練時間。
有了這些變量,我們可以構(gòu)建一個非?;A(chǔ)簡單的程序,使得它對這些數(shù)據(jù)擬合:
- 把參數(shù) coef(a)初始化為 0.1。
- 對于訓(xùn)練周期中的每次迭代:
- 對 coef 提出兩條路徑;coef+lr 和 coef-lr,其中 lr 是學(xué)習(xí)率。
- 對使用 coef=coef+lr 的模型和使用 coef=coef-lr 的模型評估平均絕對誤差。
將 coef 設(shè)置為等于 coef+lr 和 coef-lr 中平均絕對誤差值較小的那個數(shù)字。
通過對平均絕對誤差的反復(fù)優(yōu)化,模型最終將收斂出一個「最佳」的 coef 值(從而最大程度地降低平均絕對誤差)。這一思路正是機器學(xué)習(xí)的核心原理——通過反復(fù)地推斷、評估和修正,計算機可以「磨煉」出一套最優(yōu)的參數(shù)。
- 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
當(dāng)我們查看訓(xùn)練的 coef 值時,可以看到它等于π:
- print(str(coef)[:5]) #first four digits of coefficient (decimal point counts as a character)
- [Output]: '3.141'
當(dāng)然,計算圓面積的公式很好記就是𝜋r²。無需使用微積分中的任何復(fù)雜的數(shù)學(xué)方法或其他證明,我們就能找到它的公式,并找到一種使用蒙特卡洛模擬和二次回歸找到𝜋值的方法。使用這種思路就可以找到計算圓面積的方法——當(dāng)然也可以找到任何圖形的面積計算公式——橢圓、心形、二維的烏龜形狀——只要參數(shù)可以說明它的輪廓。
近年來,計算機已經(jīng)接手開始解決復(fù)雜的高可變數(shù)學(xué)問題,計算圓面積只是其中的一個簡單的示例。如果想要更復(fù)雜、更具開創(chuàng)性的,那當(dāng)然是四色定理了(每個無外飛地的地圖都可以用不多于四種顏色來染色,且不會有兩個鄰接的區(qū)域顏色相同)。這是第一個由計算機先生成證明,又被數(shù)學(xué)家廣泛接受的成果。
借助計算機,人類可以探索以往無法嘗試進(jìn)入的,極其復(fù)雜的數(shù)學(xué)領(lǐng)域。
原文鏈接:https://medium.com/swlh/finding-the-formula-for-circle-area-without-using-any-math-898cbee70253
【本文是51CTO專欄機構(gòu)“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】