[译] 机器学习可以建模简单的数学函数吗?

  • 原文地址: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.mzph.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…