译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师。

原文: Machine Learning with JavaScript : Part 1

译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习

使用JavaScript做机器学习?不是应该用Python吗?是不是我疯了才用JavaScript做如此繁重的计算?难道我不用Python和R是为了装逼?scikit-learn(Python机器学习库)不能使用Python吧?

嗯,我并没有开玩笑…

其实呢,类似于Python的scikit-learn,JavaScript开发者也开发了一些机器学习库,我打算用一下它们。

JavaScript不能用于机器学习?

  1. 太慢(幻觉?)
  2. 矩阵操作太难(有函数库啊,比如math.js
  3. JavaScript只能用于前端开发(Node.js开发者笑了)
  4. 机器学习库都是Python(JS开发者)

JavaScript机器学习库

  1. brain.js (神经网络)
  2. Synaptic (神经网络)
  3. Natural (自然语言处理)
  4. ConvNetJS (卷积神经网络)
  5. mljs (一系列AI库)
  6. Neataptic (神经网络)
  7. Webdnn (深度学习)

我们将使用mljs来实现线性回归,源代码在GitHub仓库: machine-learning-with-js。下面是详细步骤:

1. 安装模块

$ yarn add ml-regression csvtojson

或者使用 npm

$ npm install ml-regression csvtojson

2. 初始化并导入数据

下载.csv数据

假设你已经初始化了一个NPM项目,请在index.js中输入以下内容:

const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // 线性回归
 
const csvFilePath = "advertising.csv"; // 训练数据
let csvData = [],
X = [],
y = [];
 
let regressionModel;

使用csvtojson模块的fromFile方法加载数据:

csv()
.fromFile(csvFilePath)
.on("json", (jsonObj) => {
csvData.push(jsonObj);
})
.on("done", () => {
dressData();
performRegression();
});

3. 转换数据

导入的数据为json对象数组,我们需要使用dressData函数将其转化为两个数据向量xy:

// 将JSON数据转换为向量数据
function dressData() {
/**
* 原始数据中每一行为JSON对象
* 因此需要将数据转换为向量数据,并将字符串解析为浮点数
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
 
 
// 将字符串解析为浮点数
function f(s) {
return parseFloat(s);
}

4. 训练数据并预测

编写performRegression函数:

// 使用线性回归算法训练数据
function performRegression() {
regressionModel = new SLR(X, y);
console.log(regressionModel.toString(3));
predictOutput();
}

regressionModeltoString方法可以指定参数的精确度。

predictOutput函数可以根据输入值输出预测值。

// 接收输入数据,然后输出预测值
function predictOutput() {
rl.question("请输入X用于预测(输入CTRL+C退出) : ", (answer) => {
console.log(`当X = ${answer}时, 预测值y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}

predictOutput函数使用了Node.js的Readline模块:

const readline = require("readline");
 
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

5. 完整程序

完整的程序index.js是这样的:

const ml = require("ml-regression");
const csv = require("csvtojson");
const SLR = ml.SLR; // 线性回归
 
const csvFilePath = "advertising.csv"; // 训练数据
let csvData = [],
X = [],
y = [];
 
let regressionModel;
 
const readline = require("readline");
 
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
 
csv()
.fromFile(csvFilePath)
.on("json", (jsonObj) => {
csvData.push(jsonObj);
})
.on("done", () => {
dressData();
performRegression();
});
 
 
// 使用线性回归算法训练数据
function performRegression() {
regressionModel = new SLR(X, y);
console.log(regressionModel.toString(3));
predictOutput();
}
 
 
// 将JSON数据转换为向量数据
function dressData() {
/**
* 原始数据中每一行为JSON对象
* 因此需要将数据转换为向量数据,并将字符串解析为浮点数
* {
* TV: "10",
* Radio: "100",
* Newspaper: "20",
* "Sales": "1000"
* }
*/
csvData.forEach((row) => {
X.push(f(row.Radio));
y.push(f(row.Sales));
});
}
 
 
// 将字符串解析为浮点数
function f(s) {
return parseFloat(s);
}
 
 
// 接收输入数据,然后输出预测值
function predictOutput() {
rl.question("请输入X用于预测(输入CTRL+C退出) : ", (answer) => {
console.log(`当X = ${answer}时, 预测值y = ${regressionModel.predict(parseFloat(answer))}`);
predictOutput();
});
}

执行 node index.js ,则输出如下:

$ node index.js
f(x) = 0.202 * x + 9.31
请输入X用于预测(输入CTRL+C退出) : 151.5
当X = 151.5时, 预测值y = 39.98974927911285
请输入X用于预测(输入CTRL+C退出) :

恭喜!你已经使用JavaScript训练了一个线性回归模型,如下:

f(x) = 0.202 * x + 9.31

感兴趣的话,请持续关注 machine-learning-with-js,我将使用JavaScript实现各种机器学习算法。

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/03/javascript-machine-learning-regression/

JavaScript机器学习之线性回归的更多相关文章

  1. 2019年11个javascript机器学习库

    Credits: aijs.rocks 虽然python或r编程语言有一个相对容易的学习曲线,但是Web开发人员更喜欢在他们舒适的javascript区域内做事情.目前来看,node.js已经开始向每 ...

  2. 机器学习之线性回归(纯python实现)][转]

    本文转载自:https://juejin.im/post/5a924df16fb9a0634514d6e1 机器学习之线性回归(纯python实现) 线性回归是机器学习中最基本的一个算法,大部分算法都 ...

  3. 机器学习-review-1 线性回归

    发现隔一段时间,忘记了好多知识点,这里认为重要的知识点记录下来,作为笔记,方便以后回顾. From “李航- 统计学习方法” 统计学习方法的三要素: 模型,策略, 算法 对于线性回归 -------- ...

  4. Andrew Ng机器学习入门——线性回归

    本人从2017年起,开始涉猎机器学习.作为入门,首先学习的是斯坦福大学Andrew Ng(吴恩达)教授的Coursera课程 2 单变量线性回归 线性回归属于监督学习(Supervise Learni ...

  5. 机器学习---最小二乘线性回归模型的5个基本假设(Machine Learning Least Squares Linear Regression Assumptions)

    在之前的文章<机器学习---线性回归(Machine Learning Linear Regression)>中说到,使用最小二乘回归模型需要满足一些假设条件.但是这些假设条件却往往是人们 ...

  6. JavaScript机器学习之KNN算法

    译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...

  7. 机器学习之线性回归---logistic回归---softmax回归

    在本节中,我们介绍Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签 可以取两个以上的值. Softmax回归模型对于诸如MNIST手写数字分类等问题 ...

  8. 【机器学习】线性回归python实现

    线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用python实现线性回归,没有使用sklearn等机器学习框架,目的是帮助理解算法的原理. 写了三个例子,分别是单变量的 ...

  9. 机器学习:线性回归法(Linear Regression)

    # 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度R < 0,则说明很可能数据间不存在任何线性关系(也可能是算法中间出现错误),此时就要检查算法或者考虑使用其它算法: ...

随机推荐

  1. 浅析B/S架构数据库连接方式

    前言 在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?   目录 1.普通连接方式 2.单例模式 3.连接池   分析 普通连接: 下面是我们 ...

  2. DOM1级问题与DOM2级事件

    前几天有小伙伴问过我一个问题,为什么有DOM 0级事件以及DOM2级事件,但是却没有DOM1级事件呢?那我们今天就来说一说DOM的级别问题. 同时推荐伙伴们可以看看尚学堂有关JavaScript BO ...

  3. zabbix3.2 C/S架构搭建文档

    zabbix  是用PHP开发的.得需要搭建LAMP环境 zabbix-server 192.168.1.101zabbix-agent 192.168.1.105 zabbix 下载 https:/ ...

  4. [node.js] fs.renameSync()报错

    初学node.js,跟着node入门,操作了一遍.在最后一步,上传图片并显示时遇到报错 fs.js: throw err; ^ Error: ENOENT: no such file or direc ...

  5. PyTorch-Adam优化算法原理,公式,应用

    概念:Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重.Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jim ...

  6. PHP拿到接口数据返回的json以及传参-----ajax 跨域请求 ---

    以下测试------ <php $ch = curl_init(); $str = '';//此处为接口地址以及传参------- curl_setopt($ch, CURLOPT_URL, $ ...

  7. HTML一些有趣的东西

    1.<head>标签里: <meta http-equiv="Refresh" content="3"/><!--三秒自动刷新-- ...

  8. 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!

    面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...

  9. BeautifuSoup的使用

    BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单.

  10. Java使用OkHttps工具类调用外部接口

    前言 现在公司业务已止不是传统的增删改查等简单的业务处理操作,而是对数据各种联调三方接口与其他系统进行交互等,那么就需要我们在后台java中进行外部接口的调用,本文采用OkHttps工具类对接微信接口 ...