[譯] 機器學習可以建模簡單的數學函數嗎?

  • 原文地址:Can Machine Learning model simple Math functions?
  • 原文作者:Harsh Sahu
  • 譯文出自:掘金翻譯計劃
  • 本文永久鏈接:github.com/xitu/gold-m…
  • 譯者:Minghao23
  • 校對者:lsvih,zoomdong

機器學習可以建模簡單的數學函數嗎?

使用機器學習建模一些基礎數學函數

近來,在各種任務上應用機器學習已經成為了一個慣例。似乎在每一個 Gartner's 技術循環曲線 上的新興技術都對機器學習有所涉及,這是一種趨勢。這些算法被當做 figure-out-it-yourself 的模型:將任何類型的數據都分解為一串特征,應用一些黑盒的機器學習模型,對每個模型求解并選擇結果最好的那個。

但是機器學習真的能解決所有的問題嗎?還是它只適用于一小部分的任務?在這篇文章中,我們試圖回答一個更基本的問題,即機器學習能否推導出那些在日常生活中經常出現的數學關系。在這里,我會嘗試使用一些流行的機器學習技術來擬合幾個基礎的函數,并觀察這些算法能否識別并建模這些基礎的數學關系。

我們將要嘗試的函數:

  • 線性函數
  • 指數函數
  • 對數函數
  • 冪函數
  • 模函數
  • 三角函數

將會用到的機器學習算法:

  • XGBoost
  • 線性回歸
  • 支持向量回歸(SVR)
  • 決策樹
  • 隨機森林
  • 多層感知機(前饋神經網絡)

數據準備

我會保持因變量(譯者注:原文錯誤,應該為自變量)的維度為 4(選擇這個特殊的數字并沒有什么原因)。所以,X(自變量)和 Y(因變量)的關系為:

f :- 我們將要擬合的函數

Epsilon:- 隨機噪聲(使 Y 更加真實一點,因為現實生活中的數據中總是存在一些噪聲)

每個函數類型都會用到一系列的參數。這些參數通過生成隨機數得到,方法如下:

numpy.random.normal()
numpy.random.randint()
復制代碼

randint() 用于獲取冪函數的參數,以免 Y 的值特別小。normal() 用于所有其他情況。

生成自變量(即 X):

function_type = 'Linear'if function_type=='Logarithmic':X_train = abs(np.random.normal(loc=5, size=(1000, 4)))X_test = abs(np.random.normal(loc=5, size=(500, 4)))
else:X_train = np.random.normal(size=(1000, 4))X_test = np.random.normal(size=(500, 4))
復制代碼

對于對數函數,使用均值為 5(均值遠大于方差)的正態分布來避免得到負值。

獲取因變量(即 Y):

def get_Y(X, function_type, paras):X1 = X[:,0]X2 = X[:,1]X3 = X[:,2]X4 = X[:,3]if function_type=='Linear':[a0, a1, a2, a3, a4] = parasnoise = np.random.normal(scale=(a1*X1).var(), size=X.shape[0])Y = a0+a1*X1+a2*X2+a3*X3+a4*X4+noiseelif function_type=='Exponential':[a0, a1, a2, a3, a4] = parasnoise = np.random.normal(scale=(a1*np.exp(X1)).var(), size=X.shape[0])Y = a0+a1*np.exp(X1)+a2*np.exp(X2)+a3*np.exp(X3)+a4*np.exp(X4)+noiseelif function_type=='Logarithmic':[a0, a1, a2, a3, a4] = parasnoise = np.random.normal(scale=(a1*np.log(X1)).var(), size=X.shape[0])Y = a0+a1*np.log(X1)+a2*np.log(X2)+a3*np.log(X3)+a4*np.log(X4)+noiseelif function_type=='Power':[a0, a1, a2, a3, a4] = parasnoise = np.random.normal(scale=np.power(X1,a1).var(), size=X.shape[0])Y = a0+np.power(X1,a1)+np.power(X2,a2)+np.power(X2,a2)+np.power(X3,a3)+np.power(X4,a4)+noiseelif function_type=='Modulus':[a0, a1, a2, a3, a4] = parasnoise = np.random.normal(scale=(a1*np.abs(X1)).var(), size=X.shape[0])Y = a0+a1*np.abs(X1)+a2*np.abs(X2)+a3*np.abs(X3)+a4*np.abs(X4)+noiseelif function_type=='Sine':[a0, a1, b1, a2, b2, a3, b3, a4, b4] = parasnoise = np.random.normal(scale=(a1*np.sin(X1)).var(), size=X.shape[0])Y = a0+a1*np.sin(X1)+b1*np.cos(X1)+a2*np.sin(X2)+b2*np.cos(X2)+a3*np.sin(X3)+b3*np.cos(X3)+a4*np.sin(X4)+b4*np.cos(X4)+noiseelse:print('Unknown function type')return Yif function_type=='Linear':paras = [0.35526578, -0.85543226, -0.67566499, -1.97178384, -1.07461643]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Exponential':paras = [ 0.15644562, -0.13978794, -1.8136447 ,  0.72604755, -0.65264939]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Logarithmic':paras = [ 0.63278503, -0.7216328 , -0.02688884,  0.63856392,  0.5494543]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Power':paras = [2, 2, 8, 9, 2]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Modulus':paras = [ 0.15829356,  1.01611121, -0.3914764 , -0.21559318, -0.39467206]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Sine':paras = [-2.44751615,  1.89845893,  1.78794848, -2.24497666, -1.34696884, 0.82485303,  0.95871345, -1.4847142 ,  0.67080158]Y_train = get_Y(X_train, function_type, paras)Y_test = get_Y(X_test, function_type, paras)
復制代碼

噪聲是在 0 均值的正態分布中隨機抽樣得到的。我設置了噪聲的方差等于 f(X) 的方差,借此保證我們數據中的“信號和噪聲”具有可比性,且噪聲不會在信號中有損失,反之亦然。

訓練

注意:在任何模型中都沒有做超參數的調參。 我們的基本想法是只在這些模型對所提及的函數上的表現做一個粗略的估計,因此沒有對這些模型做太多的優化。

model_type = 'MLP'if model_type=='XGBoost':model = xgb.XGBRegressor()
elif model_type=='Linear Regression':model = LinearRegression()
elif model_type=='SVR':model = SVR()
elif model_type=='Decision Tree':model = DecisionTreeRegressor()
elif model_type=='Random Forest':model = RandomForestRegressor()
elif model_type=='MLP':model = MLPRegressor(hidden_layer_sizes=(10, 10))model.fit(X_train, Y_train)
復制代碼

結果

大多數的表現結果比平均基線要好很多。計算出的平均R方是 70.83%我們可以說,機器學習技術對這些簡單的數學函數確實可以有效地建模

但是通過這個實驗,我們不僅知道了機器學習能否建模這些函數,同時也了解了不同的機器學習技術在各種基礎函數上的表現是怎樣的。

有些結果是令人驚訝的(至少對我來說),有些則是合理的。總之,這些結果重新認定了我們的一些先前的想法,也給出了新的想法。

最后,我們可以得到下列結論:

  • 盡管線性回歸是一個簡單的模型,但是在線性相關的數據上,它的表現是優于其他模型的
  • 大多數情況下,決策樹 < 隨機森林 < XGBoost,這是根據實驗的表現得到的(在以上 6 個結果中有 5 個是顯而易見的)
  • 不像最近實踐中的流行趨勢那樣,XGBoost(6 個結果中只有 2 個表現最好)不應該成為所有類型的列表數據的一站式解決方案,我們仍然需要對每個模型進行公平地比較。
  • 和我們的猜測相反的是,線性函數不一定是最容易預測的函數。我們在對數函數上得到了最好的聚合R方結果,達到了 92.98%
  • 各種技術在不同的基礎函數上的效果(相對地)差異十分大,因此,對一個任務選擇何種技術必須經過完善的思考和實驗

完整代碼見我的 github。


來點贊,評論和分享吧。建設性的批評和反饋總是受歡迎的!

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改并 PR,也可獲得相應獎勵積分。文章開頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、后端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下載spotify音樂_如何在Spotify上播放更高質量的音樂

下載spotify音樂With Spotify Premium, you get access to higher quality music streaming. By default (and if you’re on the free plan), Spotify streams at 96kbps on mobile and 160kbps on your computer. At these sort of bitrates, you’ll hear a small but notic…

ubuntu scp命令或者用root連接ssh提示:Permission denied, please try again.錯誤

1、su -            #&#xff01;&#xff01;&#xff01; 2、vi /etc/ssh/sshd_config 3、PermitRootLogin yes    # 找到此字段&#xff0c;改為此行所示 4、/etc/init.d/ssh restart    # 重啟ssh服務 轉載于:https://www.cnblogs.com/weiyiming007/p…

Windows下壓縮包安裝Mysql

1. 下載mysql壓縮包 2. 解壓到指定目錄&#xff0c;例如D:\Program Files\mysql-5.7.25-winx64 3. 在目錄下創建配置文件my.ini [mysqld] port 3306 basedirD:/Program Files/mysql-5.7.25-winx64 datadirD:/Program Files/mysql-5.7.25-winx64/data max_connections200 char…

如何從終端打開Ubuntu Nautilus文件瀏覽器

Recently, we showed you how to open a directory in Terminal from within Nautilus. However, what if you’re working on the command line in Terminal and need to access the same directory in Nautilus? There’s an easy solution for that. 最近&#xff0c;我們向…

mysql 面試知識點筆記(七)RR如何避免幻讀及非阻塞讀、范式

2019獨角獸企業重金招聘Python工程師標準>>> 表象&#xff1a;快照讀&#xff08;非阻塞讀&#xff09;--偽MVCC &#xff08;Multi-Version Concurrent Controll多版本并發控制&#xff09; 內在&#xff1a;next-key鎖(record鎖gap鎖) rr serializabel 都支持gap鎖…

pdf 奇數頁插入頁碼_如何在Word 2013中的奇數頁碼上啟動新部分

pdf 奇數頁插入頁碼When working on a long document or a book in Word, it’s common to divide the document into sections or chapters. A common practice is to start each new section or chapter on an odd page. This is easily accomplished using sections in Word…

徹底攻克C語言指針

前面我們講解了指針數組、二維數組指針、函數指針等幾種較為復雜的指針&#xff0c;它們的定義形式分別是&#xff1a; int *p1[6]; //指針數組int *(p2[6]); //指針數組&#xff0c;和上面的形式等價int (*p3)[6]; //二維數組指針int (*p4)(int, int); //函數指針我相信大部分…

流水線上的思考——異步程序開發模型(2)

上一期我們講了一個簡單的流水線處理流程&#xff0c;正如我們在上期最后所說那樣&#xff0c;這個簡單的流水線處理流程對于后續有慢設備操作的業務來說&#xff0c;性能有可能偏低。今天我們來討論一下如何提高性能的方法。首先讓我們來大致區分一下一般業務的處理方式。目前…

java ReentrantLock 鎖相關筆記

為什么80%的碼農都做不了架構師&#xff1f;>>> ReentrantLock重入鎖簡單理解就是對同一個線程而言&#xff0c;它可以重復的獲取鎖。例如這個線程可以連續獲取兩次鎖&#xff0c;但是釋放鎖的次數也一定要是兩次 Lock locknew ReentrantLock(true);//公平鎖 Lock …

計算機啟動程序bios_如何構建自己的計算機,第三部分:準備BIOS

計算機啟動程序biosSo you’ve carefully picked out some parts and built a computer, but it doesn’t really do anything…yet. Before we hop into installing your operating system, we need to take a quick look at the BIOS and prepare it for our operating syste…

PLSQL 之類型、變量和結構

1、類型 在《.Net程序員學用Oracle系列(5)&#xff1a;三大數據類型》一文中詳細地講述了 Oracle 的基本數據類型&#xff0c;文中還提到&#xff0c;除基本數據類型之外&#xff0c;Oracle 還在語法上支持一些非固有數值類型。 事實上&#xff0c;Oracle 在語法上支持的數據類…

kindle圖書免費下載_如何在Kindle上免費簽出圖書館書籍

kindle圖書免費下載Tired of paying so much for ebooks? Most libraries these days let you check out eBooks, for free, just like regular books. 厭倦了為電子書支付這么多錢&#xff1f; 如今&#xff0c;大多數圖書館都讓您免費閱讀電子書&#xff0c;就像普通書籍一樣…

第五章 了解你的用戶

第五章 了解你的用戶邏輯人的爭議&#xff1a;要學會把軟件開發簡單易用象牙塔式的開發&#xff1a;開發團隊常年閉封在“高塔”之中&#xff0c;一門心思的做著魔法一般的軟件。這些開發者根本就不知道用戶會怎么樣的使用他們所做的軟件。我們應該避免這種象牙塔式的開發&…

總結之:CentOS 6.4系統裁減詳解及裝載網卡步驟

前言 隨著接觸Linux的慢慢深入、對Linux也有了一個基本認識了吧&#xff0c;慢慢的接觸系統內核、系統配置文件、在了解Linux的系統啟動流程后&#xff0c;現在來總結一下一個簡單的Linux系統的裁減方法和步驟&#xff0c;一個只有內核文件和幾個簡單的命令的小Linux系統&am…

android 設備占用_如何查看正在占用Android設備的空間

android 設備占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how yo…

最近沉迷生意經

高度戰略搶占顧客心智 速度戰略 . 規模不夠就談發展速度&#xff0c;避開自己的劣勢&#xff1b; . 發展速度快說明產品好&#xff0c;受歡迎度高; 錢是工具&#xff0c;從錢上解脫 . 不能被錢所困 . 放下錢&#xff0c;才能瀟灑地使用錢 第一時間搶占顧客心智 . 核心點就是搶占…

mysql密碼正確卻提示錯誤, 不輸入密碼反而能登錄

今天部署阿里云服務器, 發現之前可以連接的mysql服務器突然連接不上了, 密碼我確認是正確的,但登錄時就是顯示密碼錯誤, 很崩潰, 差點氣得我就想重裝mysql了。 好在經過幾番苦尋找到了以下能解決我問題的資料&#xff0c; 成功解決了我的問題&#xff0c; 萬分感謝&#xff0c;…

域用戶權限|安裝軟件

如何讓普通的域用戶有安裝軟件的權限&#xff1f;現在給客戶部署了活動目錄&#xff0c;客戶要求 普通的域用戶也可以自己安裝軟件。不知道如何設置&#xff0c;希望大家幫幫忙&#xff01;我告訴客戶的做法如下&#xff1a;不知道可行性如何&#xff1f; 1、在域中新建一個域賬…

c/c++ new delete初探

new delete初探 1&#xff0c;new有2個作用 開辟內存空間。調用構造函數。2&#xff0c;delete也有2個作用 釋放內存空間調用析構函數。如果用new開辟一個類的對象的數組&#xff0c;這個類里必須有默認(沒有參數的構造函數&#xff0c;或者有默認值的參數的構造函數)的構造函數…

php舊版本windows_Windows的舊版本中如何進行多任務處理?

php舊版本windowsConsidering that DOS was a single-tasking OS and the ties it had with early versions of Windows, just how did earlier versions of Windows manage to accomplish multi-tasking? Today’s SuperUser Q&A post looks at the answers to this ques…