0

0

JavaScript 实现简单的神经网络算法图文详解

黄舟

黄舟

发布时间:2017-03-07 14:42:55

|

3105人浏览过

|

来源于php中文网

原创

神经网络简介

神经网络试图模拟大脑的神经元之间的关系来处理信息。它的计算模型通常需要大量彼此连接的节点。每个神经元通过某种特殊的输出函数来处理来自其它相邻神经元的加权输入值。

神经元之间的信息传递的强度,用所谓的加权值来定义,算法会不断的调整加权值来实现自我的学习过程。

1

神经网络分为多层,如上图,有输入层,隐藏层和输出层。

立即学习Java免费学习笔记(深入)”;

JS线性代数包

神经网络的计算涉及到大量的矩阵计算,有许多的线性代数的开源的软件,Python下有著名的numpy,非常有名。 Javascript也有几个:

  • http://www.php.cn/

  • http://www.php.cn/

  • http://www.php.cn/ 

我使用了numericjs,效果还不错。推荐大家可以试试。

两层神经网络

我们有一些简单的输入输出的数据用来训练神经网络。这里每一行代表一条数据。输入有三个参数,输出是一个。

Inputs 0 Inputs 1 Inputs 2 Output
0 0 1 0
1 1 1 1
1 0 1 1
0 1 1 0

首先我们实现一个最简单的神经网络,没有隐藏层,输入直连输出。

2

因为输入是三个参数,输出是一个,所以我们的神经网络输入层是三个节点,输出是1个。

// Sigmod function
function nonlin(x, deriv) {
  if (deriv) {
    return numeric.mul(x, numeric.sub(1, x));
  }

  return numeric.p(1, numeric.add(1, numeric.exp(numeric.neg(x))));
}

function train_neural(X, y, iteration) {
  // initialize weights
  var syn0 = numeric.sub(numeric.mul(2, numeric.random([3, 1])), 1);
  //Training loop
  var i = 0;
  for (; i < iteration; i++) {
    var l0 = X;
    var l1 = nonlin(numeric.dot(l0, syn0));
    var l1_error = numeric.sub(y, l1);
    var l1_delta = numeric.mul(l1_error, nonlin(l1, true));
    syn0 = numeric.add(syn0, numeric.dot(numeric.transpose(l0), l1_delta));
    } 
  }
}

//Initial input/ouput values
var X = [
  [0, 0, 1],
  [0, 1, 1],
  [1, 0, 1],
  [1, 1, 1]
];

var y = [
  [0],
  [0],
  [1],
  [1]
];

train_neural(X, y, 1000);

简单介绍一下训练的代码和过程

  • X 输入数据

  • y 输出数据

  • nonlin, S函数

  • l0,网络第一层,这是等于输入数据

    万兴爱画
    万兴爱画

    万兴爱画AI绘画生成工具

    下载
  • l1,网络第二层,这里就是输出层

  • syn0,第一层网络的权重

训练的迭代过程就是先给出一个初始的权重,利用这个权重算出一个输出值,用目标结果减去这个值,得到一个差异值,再利用这个差异值对权重进行修正。

1000次迭代后的网络输出: [0.03,0.02, 0.979, 0.974]

1000次迭代后的syn0权重值: [7.266,-0.221,-3.415]

这里我们发现第一个节点的权重较大,这个和我们的数据是一致的,通过观察数据我们也可以发现,输出值和第一列的输入值是强相关。如果增加迭代的次数,这个值会更大。

三层神经网络

Inputs 0 Inputs 1 Inputs 2 Output
0 0 1 0
0 1 1 1
1 0 1 1
1 1 1 0

现在我们有了一组新的数据,通过观察发现,第三列和结果完全无关,第一列和第二列相同时结果为0,否则为1。这是一种非线性的关系,为了有效学习我们增加一层,网络变成了这个样子。

3

// Sigmod function
function nonlin(x, deriv) {
  if (deriv) {
    return numeric.mul(x, numeric.sub(1, x));
  }

  return numeric.p(1, numeric.add(1, numeric.exp(numeric.neg(x))));
}

function train_neural(X, y, iteration) {
  // initialize weights
  var syn0 = [
    [-0.1653904, 0.11737966, -0.71922612, -0.60379702],
    [0.60148914, 0.93652315, -0.37315164, 0.38464523],
    [0.7527783, 0.78921333, -0.82991158, -0.92189043]
  ];

  var syn1 = [
    [-0.66033916],
    [0.75628501],
    [-0.80330633],
    [-0.15778475]
  ];

  //Training loop
  var i = 0;
  for (; i < 1000; i++) {
    var l0 = X;
    var l1 = nonlin(numeric.dot(l0, syn0));
    var l2 = nonlin(numeric.dot(l1, syn1));
    var l2_error = numeric.sub(y, l2);
    var l2_delta = numeric.mul(l2_error, nonlin(l2, true));
    var l1_error = numeric.dot(l2_delta, numeric.transpose(syn1));
    var l1_delta = numeric.mul(l1_error, nonlin(l1, true));
    syn1 = numeric.add(syn1, numeric.dot(numeric.transpose(l1), l2_delta));
    syn0 = numeric.add(syn0, numeric.dot(numeric.transpose(l0), l1_delta));
  }
}

//Initial input/output values
var X = [
  [0, 0, 1],
  [0, 1, 1],
  [1, 0, 1],
  [1, 1, 1]
];

var y = [
  [0],
  [1],
  [1],
  [0]
];

train_neural(X, y, 1000);

训练的过程和之前的两层差别不大,只是多了一层。通过增加的这一层,可以有效的学习数据中的复杂非线性的关联关系。

经过1000次迭代, 输出值为:[0.02,0.95,0.94,0.05]

syn0 :

4

 以上就是JavaScript 实现简单的神经网络算法图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!



相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号