谈到人工智能、机器学习,我们可能会觉得很神秘,其实机器学习背后的理论并不复杂。就如同原子弹这么尖端的科技,其背后的理论就是一个很简单的公式:

E = mc²

机器学习的最基础理论其实也不复杂,本文先尝试从一个线性回归问题出发,探讨一下机器学习的一般步骤。通过本文,你将学习到:

  • 定义机器学习模型

  • 定义损失函数

  • 模型训练

  • 从训练的模型进行推导

线性回归

想必大家应该做过物理实验,还记得有这样的实验吗?就是观察一系列根据某个因素变化(比如质量)的实验数据,然后建立平面坐标,在坐标系中标记一系列离散的点,然后拟合出曲线或直线。如果结果和因子之间是线性关系,那么拟合出来就近似于一条直线。一般而言,线性关系可以用如下公式表示:

y = a * x + b

现在我们有一系列的x值以及与之对应的y值,如何得到a和b的值呢?我们以前的方法可能是将这些点描在坐标上,然后描一条近似连接所有点的直线(在实际实验中,可能有一些干扰因素,所有的点连接起来并非一条直线),在坐标轴上可以很容易看出a和b的值。

机器学习所要解决的问题也是一样,就是知道一系列x和y的值(数据集),需要找出它们之间的关系。如果是线性问题,就是求解a和b的值。

机器学习通常采用回归解决参数求解问题。

为了简单起见,我们以线性回归为例。所谓线性回归,就是首先给一个a和b的值(通常给0值),然后计算出y的值,和实际的y值进行比较,如果发现误差比较大,就调整a和b的值,比如a和b都加上0.0001,然后再计算y的值,和实际的y值比较,依次反复,只要误差是在逐步减小,最终选择的a和b的值,就接近理论的a和b的值。

比如下面几个x、y的对应值:

x = [1, 2, 3, 4];
y = [1, 3, 5, 7];

你可能立刻就能看出x和y之间的关系是:

y = 2 * x - 1;

这样理论上 a = 2,b = -1。但对于计算机,它没有这样的直觉,我们就先给它a = 0, b = 0,让它通过递归算法,逐步接近这个值,可能最终得到的值是 a = 1.99,b = -0.99。

所以我们需要理解机器学习的结果,最后推算出的结果并非理论上的真实值,而是一个接近真实的值。

至于机器学习如何保证调整a和b的值,误差能够越来越小,这背后也有复杂的算法。对于机器学习应用开发者而言,我们并不需要去实现算法,只需要做简单的了解即可,机器学习框架,如tensorflow,帮我们解决了这些问题。

好吧,我们就以实际代码,来说明如何完成一个机器学习任务。

线性回归代码实例

我们就开门见山,直接放代码:

    const tf = require('@tensorflow/tfjs');//定义一个线性回归模型。const model = tf.sequential();model.add(tf.layers.dense({ units: 1, inputShape: [1] }));model.compile({ loss: 'meanSquaredError', optimizer: 'sgd' });// 为训练生成一些合成数据const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);// 使用数据训练模型model.fit(xs, ys, { epochs: 10 }).then(() => {// 在该模型从未看到过的数据点上使用模型进行推理model.predict(tf.tensor2d([5], [1, 1])).print();});

第1行代码引入 tfjs 模块,需要注意,在上一篇文章中引入的是 tfjs-core ,这里为了方便,直接引入tfjs,它包含了 tfjs-core ,  tfjs-layers 等。所以需要修改 package.json 文件,将其中的 @tensorflow/tfjs-core 替换为 @tensorflow/tfjs 。

第4、5行代码定义线性回归模型。sequential()返回一个序列模型,dense为全连接层。一般来说,我们不用自行设计模型,所以一般模型代码照搬即可。

第7行代码编译模型,其中有两个重要的参数,一个是损失函数,一个是优化器,它们决定着模型是否能够很快收敛。对于不同的任何以及模型,在损失函数的选择有考量,不过我们一般也是按照模型设计者的建议使用对应的损失函数。优化器就那几种选择,翻翻文档,这里选择最普通的 sgd (随机梯度下降)优化器。

第10、11行代码是给出训练数据,这里出于演示的目的,直接在代码中写定,一般情况需要从文件或网络读取。

第14行代码是进行模型训练,就是逐步尝试获得最优解的过程,我们不能无限训练下去,所以这里指定 10 个轮次。

第16行代码根据训练的模型,求 x=5 时的 y 值。

怎么样?有了机器学习框架,从定义模型、训练,到最后的推理,是不是很简单?我们并不需要理解复杂的随机梯度下降算法,就可以完成机器学习的任务。

如果我们在微信小程序中运行上述代码,会得出以下结果:

Tensor[[6.0889206],]

而且每次的结果还不同,有同学可能会问,正确结果不是应该接近 9 吗?这个结果也偏差太大了吧!

因为上述代码只是出于演示目的,还存在如下问题:

  1. 数据不足,我们只给出了4个样本数据,样本太少,很难找出x,y之间的关系。这也是现代机器学习,特别是深度学习,需要大量训练数据的原因。

  2. 迭代次数太少,在误差还在减少的中途,我们就退出了计算,这样得到的参数,就存在比较大的误差。

  3. 每次推理之前都需要训练,而在实际的项目中,一般是训练和推理是两个分开的过程。

没关系,这只是一个入门的机器学习程序,后续我们会学习到比较完善的例子。

机器学习应用编写过程

虽然上面的代码非常简短,但也具有机器学习应用的基本框架。机器学习应用的通常过程是:

  1. 准备训练数据

  2. 定义模型

  3. 编译模型(定义损失函数、优化器等参数)

  4. 训练模型

  5. 模型推理

在后面的文章,我们可以看到,不管多复杂的机器学习应用,都不外乎这些步骤,区别就在于复杂程度。就如同虽然有了 E = mc² 这个理论,要造成原子弹,还有很多路需要走。

小结

本章主要讲解了建立线性回归模型,虽然是一个精简的程序,但具备了机器学习程序的基本框架。在下一篇文章中,我将说明如何在微信小程序中加载训练数据。没有数据,就没有机器学习。如果你有什么建议,欢迎留言。

本系列文章的源码请访问:

https://github.com/mogotech/wechat-tfjs-examples

手把手教你开发人工智能微信小程序(1):线性回归模型相关推荐

  1. 手把手教你开发人工智能微信小程序(1):Hello WeChat!

    每个开始学习编程的程序员,大约是从"Hello World!"开始的吧.就这样一个简简单单在屏幕上输出"Hello World!"字样的程序,帮助我们进入编程世 ...

  2. 手把手教你写个微信小程序

    手把手教你写个微信小程序 很多人看完bmob快速入门,并完成了bmob的基本配置之后依然不知道如何下手去写自己的代码,那么跟着我一起来一步一步做个小程序吧. 工具:Bmob后端云 新建小程序项目 一. ...

  3. 零基础手把手教你制作一个微信小程序云开发-实验室仪器管理系统(二)

    书接上文,我们了解到了怎么在微信开发者工具上新建一个空的云开发项目. 别急,你以为你能大展身手开始写代码了? 答案是否定的,首先你要先开始对小程序进行模块拆分 郦波老师有一句话说得很好:解决问题的最好 ...

  4. 手把手教你写一个微信小程序日历组件

    今天我们一起写一个微信小程序日历组件 微信小程序日历组件 github.com/749264345/w- 好,我们先看一下要实现的模样,如下图 由以上截图我们可以看到 1.日历可以通过按钮[切换展示效 ...

  5. 手把手教你Nodejs获取微信小程序二维码

    [小程序二维码和普通二维码] 下图左为小程序码,右为普通二维码, 普通二维码的生成比较简单,只用jquery就可以生成,详见:https://blog.csdn.net/uikoo9/article/ ...

  6. android微信分享走小程序流程,教你怎么把微信小程序分享到朋友圈

    教你怎么把微信小程序分享到朋友圈 2020年07月13日 | 萬仟网移动技术 | 我要评论 7月8日收到邀请,可将小程序页面分享到朋友圈.适用于内容型页面的分享,不适用于有较多交互的页面分享.该功能为 ...

  7. 教你解决Taro微信小程序中使用Echarts体积过大的问题

    教你解决Taro微信小程序中使用Echarts体积过大的问题 背景 为什么选择Echarts? 单包超过2M,如何处理? 以为到此就结束了? 最后 背景 近期笔者在使用Taro进行微信小程序开发,当引 ...

  8. 都2020年,开发制作微信小程序商城,需要准备什么资料?应该不会不知道吧!

    微信小程序使用越来越广泛,而还未入局的对于微信小程序开发需要什么材料甚至不清楚,其实这些材料很简单.总结就是微信支付.微信小程序注册.小程序代码,下面展开说说. 小程序红利 从腾讯刚发布的财报看,微信 ...

  9. vue.js反编译_基于electron-vue开发的微信小程序反编译客户端

    开源一个小程序反编译客户端 咨询小程序反编译的同学比较多,虽然有开源库但是还是有同学不清楚如何去操作,所以索性做了一个客户端方便进行小程序的反编译 # 技术选型 网上已经有大佬实现了C#版的反编译工具 ...

最新文章

  1. windows开启ssh当跳板机
  2. Multiple markers at this line @Override的解决方法
  3. Linux apache2将目录从/var/www/html调整为/根目录时报错:You don‘t have permission to access / on this server
  4. 【数据结构与算法】之深入解析“颜色分类”的求解思路与算法示例
  5. mysql5.5表的创建源码_mysql5.5 源码安装
  6. 服务器物理内存总是九十几,Solr总是使用超过90%的物理内存(Solr always use more than 90% of physical memory)...
  7. C语言指向结构体的指针的例子
  8. jenkins配置ant
  9. unix系列系统镜像下载
  10. vs2008中文版提供下载(包含中文msdn)
  11. python井字棋_用python井字棋
  12. 南阳oj 28 大数阶乘
  13. php实例精通txt下载,PHP实例精通(1碟)
  14. ksu7对讲机调频软件_万能对讲机写频软件
  15. 为什么说美团的天花板是美团自己?
  16. [回归初作]——edge浏览器的小游戏
  17. 微信小程序 data命名不能大写
  18. 数据结构:实现图书信息管理系统
  19. xshell 基本操作命令
  20. 一阶系统开环传递函数表达式_机械振动理论(2)-多自由度系统

热门文章

  1. mysql多对一数据统计
  2. AcWing春季每日一题 Week1
  3. D. Ela and the Wiring Wizard codeforces 1737D
  4. ZedBoard+Vivado(一)——纯PL实现流水灯
  5. 一张图透过结构看世界--掌握结构化思维
  6. 居然之家联手分众巨额投入:引爆2亿目标人群 双11力争破百亿
  7. 获取汉字首字母(php,java)
  8. 常用css整理2 转自csdn
  9. 解决vant sku 后台数据与前台数据绑定以及金额以分为单位问题
  10. Android运行时权限一览表