news 2026/4/16 17:00:05

JavaScript 与人工智能:简单的机器学习示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 与人工智能:简单的机器学习示例

引言

在现代科技领域,人工智能(Artificial Intelligence,AI)和机器学习(Machine Learning,ML)正逐渐成为热门话题。而JavaScript作为一种广泛应用于前端开发的编程语言,在近年来也逐渐涉足到了人工智能和机器学习的领域。本文将通过一个简单的机器学习示例,展示如何使用JavaScript进行基本的机器学习任务。

机器学习基础概念

在深入到具体的JavaScript示例之前,我们先简要介绍一些机器学习的基础概念。

机器学习定义

机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

监督学习

监督学习是机器学习中的一种重要类型,它从标记的训练数据来推断一个功能。训练数据包括一组训练示例,每一个训练示例包括一个输入对象(通常是向量)和一个期望的输出值。监督学习算法的目标是从训练数据中学习一个模型,以便对新的输入作出预测。

分类与回归

在监督学习中,主要有两种任务类型:分类和回归。分类任务是将输入数据划分到不同的类别中,例如判断一封邮件是垃圾邮件还是正常邮件;回归任务则是预测一个连续的数值,例如预测房价。

使用JavaScript实现简单的线性回归

线性回归是一种基本的回归分析方法,用于建立自变量(特征)和因变量(目标)之间的线性关系。我们将使用JavaScript实现一个简单的线性回归模型,并通过一个示例数据集进行训练和预测。

示例数据集

假设我们有一组关于房屋面积和房价的数据,如下所示:

房屋面积(平方米)房价(万元)
5080
6095
70110
80125
90140
线性回归原理

线性回归的目标是找到一条直线 ( y = mx + b ),使得该直线尽可能地拟合所有的数据点。其中,( y ) 是因变量(房价),( x ) 是自变量(房屋面积),( m ) 是斜率,( b ) 是截距。

我们可以通过最小化损失函数(通常是均方误差)来找到最优的 ( m ) 和 ( b ) 值。均方误差的计算公式如下:

[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 ]

其中,( n ) 是数据点的数量,( y_i ) 是实际的房价,( \hat{y}_i ) 是预测的房价。

JavaScript代码实现
// 示例数据集constdata=[{x:50,y:80},{x:60,y:95},{x:70,y:110},{x:80,y:125},{x:90,y:140}];// 计算平均值functionmean(values){constsum=values.reduce((acc,val)=>acc+val,0);returnsum/values.length;}// 计算斜率和截距functionlinearRegression(data){constxValues=data.map(item=>item.x);constyValues=data.map(item=>item.y);constxMean=mean(xValues);constyMean=mean(yValues);letnumerator=0;letdenominator=0;for(leti=0;i<data.length;i++){numerator+=(xValues[i]-xMean)*(yValues[i]-yMean);denominator+=(xValues[i]-xMean)**2;}constm=numerator/denominator;constb=yMean-m*xMean;return{m,b};}// 进行预测functionpredict(x,m,b){returnm*x+b;}// 训练模型const{m,b}=linearRegression(data);// 预测房屋面积为 100 平方米的房价constarea=100;constpredictedPrice=predict(area,m,b);console.log(`斜率 m:${m}`);console.log(`截距 b:${b}`);console.log(`房屋面积为${area}平方米的预测房价:${predictedPrice}万元`);
代码解释
  1. 数据准备:我们定义了一个包含房屋面积和房价的数据集data
  2. 计算平均值mean函数用于计算一组数据的平均值。
  3. 线性回归计算linearRegression函数根据最小二乘法计算斜率 ( m ) 和截距 ( b )。
  4. 预测函数predict函数根据计算得到的斜率和截距,预测给定房屋面积的房价。
  5. 训练和预测:我们调用linearRegression函数训练模型,并使用predict函数预测房屋面积为 100 平方米的房价。

使用TensorFlow.js进行更复杂的机器学习任务

TensorFlow.js是一个基于JavaScript的开源深度学习库,它允许开发者在浏览器或Node.js环境中训练和部署机器学习模型。下面我们将使用TensorFlow.js实现一个更复杂的机器学习任务:手写数字识别。

数据集介绍

我们将使用MNIST数据集,该数据集包含60,000个训练样本和10,000个测试样本,每个样本是一个28x28像素的手写数字图像。

安装TensorFlow.js

在HTML文件中引入TensorFlow.js的CDN链接:

<scriptsrc="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script>
JavaScript代码实现
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>MNIST手写数字识别</title><scriptsrc="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script></head><body><script>asyncfunctionrun(){// 加载MNIST数据集constmnist=tf.data.mnist();const[train,test]=awaitPromise.all([mnist.trainImages().map(img=>img.reshape([-1,28,28,1])),mnist.testImages().map(img=>img.reshape([-1,28,28,1]))]);// 构建模型constmodel=tf.sequential();model.add(tf.layers.conv2d({inputShape:[28,28,1],kernelSize:5,filters:8,strides:1,activation:'relu',kernelInitializer:'varianceScaling'}));model.add(tf.layers.maxPooling2d({poolSize:[2,2],strides:[2,2]}));model.add(tf.layers.conv2d({kernelSize:5,filters:16,strides:1,activation:'relu',kernelInitializer:'varianceScaling'}));model.add(tf.layers.maxPooling2d({poolSize:[2,2],strides:[2,2]}));model.add(tf.layers.flatten());model.add(tf.layers.dense({units:10,kernelInitializer:'varianceScaling',activation:'softmax'}));// 编译模型model.compile({optimizer:tf.train.adam(),loss:'categoricalCrossentropy',metrics:['accuracy']});// 训练模型consttrainLabels=awaitmnist.trainLabels();constoneHotTrainLabels=tf.oneHot(trainLabels,10);awaitmodel.fit(train,oneHotTrainLabels,{batchSize:64,epochs:5});// 评估模型consttestLabels=awaitmnist.testLabels();constoneHotTestLabels=tf.oneHot(testLabels,10);constevalOutput=model.evaluate(test,oneHotTestLabels);console.log(`Test accuracy:${(awaitevalOutput[1].data())[0]}`);}run();</script></body></html>
代码解释
  1. 数据加载:使用tf.data.mnist()加载MNIST数据集,并将图像数据转换为适合模型输入的形状。
  2. 模型构建:构建一个卷积神经网络(CNN)模型,包括卷积层、池化层、全连接层等。
  3. 模型编译:使用Adam优化器和交叉熵损失函数编译模型。
  4. 模型训练:对模型进行训练,指定批量大小和训练轮数。
  5. 模型评估:使用测试数据集评估模型的准确率。

机器学习模型的可视化

为了更好地理解机器学习模型的训练过程和性能,我们可以使用一些可视化工具。例如,我们可以使用Chart.js库来绘制训练过程中的损失和准确率曲线。

安装Chart.js

在HTML文件中引入Chart.js的CDN链接:

<scriptsrc="https://cdn.jsdelivr.net/npm/chart.js"></script>
JavaScript代码实现
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>MNIST手写数字识别 - 可视化</title><scriptsrc="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest"></script><scriptsrc="https://cdn.jsdelivr.net/npm/chart.js"></script></head><body><canvasid="myChart"></canvas><script>asyncfunctionrun(){// 加载MNIST数据集constmnist=tf.data.mnist();const[train,test]=awaitPromise.all([mnist.trainImages().map(img=>img.reshape([-1,28,28,1])),mnist.testImages().map(img=>img.reshape([-1,28,28,1]))]);// 构建模型constmodel=tf.sequential();model.add(tf.layers.conv2d({inputShape:[28,28,1],kernelSize:5,filters:8,strides:1,activation:'relu',kernelInitializer:'varianceScaling'}));model.add(tf.layers.maxPooling2d({poolSize:[2,2],strides:[2,2]}));model.add(tf.layers.conv2d({kernelSize:5,filters:16,strides:1,activation:'relu',kernelInitializer:'varianceScaling'}));model.add(tf.layers.maxPooling2d({poolSize:[2,2],strides:[2,2]}));model.add(tf.layers.flatten());model.add(tf.layers.dense({units:10,kernelInitializer:'varianceScaling',activation:'softmax'}));// 编译模型model.compile({optimizer:tf.train.adam(),loss:'categoricalCrossentropy',metrics:['accuracy']});// 保存训练过程中的损失和准确率constlossValues=[];constaccuracyValues=[];// 训练模型consttrainLabels=awaitmnist.trainLabels();constoneHotTrainLabels=tf.oneHot(trainLabels,10);awaitmodel.fit(train,oneHotTrainLabels,{batchSize:64,epochs:5,callbacks:{onEpochEnd:(epoch,logs)=>{lossValues.push(logs.loss);accuracyValues.push(logs.acc);}}});// 绘制图表constctx=document.getElementById('myChart').getContext('2d');newChart(ctx,{type:'line',data:{labels:Array.from({length:5},(_,i)=>i+1),datasets:[{label:'Loss',data:lossValues,borderColor:'red',fill:false},{label:'Accuracy',data:accuracyValues,borderColor:'blue',fill:false}]},options:{responsive:true,title:{display:true,text:'Training Loss and Accuracy'},scales:{x:{title:{display:true,text:'Epoch'}},y:{title:{display:true,text:'Value'}}}}});}run();</script></body></html>
代码解释
  1. 数据加载和模型构建:与之前的示例相同,加载MNIST数据集并构建CNN模型。
  2. 保存训练过程数据:在训练模型时,使用callbacks记录每一轮训练的损失和准确率。
  3. 绘制图表:使用Chart.js库绘制损失和准确率曲线,直观地展示模型的训练过程。

总结

本文通过两个示例展示了如何使用JavaScript进行简单的机器学习任务。第一个示例是使用纯JavaScript实现线性回归,通过最小二乘法找到最优的直线拟合数据;第二个示例是使用TensorFlow.js实现手写数字识别,构建卷积神经网络模型并进行训练和评估。最后,我们使用Chart.js库对训练过程进行可视化。希望这些示例能帮助你初步了解如何在JavaScript中应用机器学习技术。

注意事项

  • 在使用TensorFlow.js时,确保网络环境良好,因为加载MNIST数据集需要一定的网络带宽。
  • 对于复杂的机器学习任务,可能需要更多的计算资源和时间进行训练。可以考虑使用GPU加速训练过程。
  • 在实际应用中,需要对模型进行调优,例如调整超参数、增加训练数据等,以提高模型的性能。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:39:12

单目深度估计技术:MiDaS模型局限性分析

单目深度估计技术&#xff1a;MiDaS模型局限性分析 1. 引言&#xff1a;AI单目深度估计的现实挑战 1.1 技术背景与核心问题 在计算机视觉领域&#xff0c;从单张二维图像中恢复三维空间结构一直是极具挑战性的任务。传统立体视觉依赖双目或多摄像头系统获取深度信息&#xf…

作者头像 李华
网站建设 2026/4/16 9:09:47

从Qwen2-VL到Qwen3-VL-WEBUI|升级版视觉语言模型实践指南

从Qwen2-VL到Qwen3-VL-WEBUI&#xff5c;升级版视觉语言模型实践指南 1. 引言&#xff1a;为何需要升级至 Qwen3-VL-WEBUI&#xff1f; 随着多模态大模型在图文理解、视觉代理、视频推理等场景的广泛应用&#xff0c;对模型能力的要求也日益提升。阿里推出的 Qwen3-VL-WEBUI …

作者头像 李华
网站建设 2026/4/16 10:47:44

MiDaS模型性能优化:提升深度估计速度的5个技巧

MiDaS模型性能优化&#xff1a;提升深度估计速度的5个技巧 1. 背景与挑战&#xff1a;单目深度估计的实时性瓶颈 1.1 AI 单目深度估计 - MiDaS 在计算机视觉领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff09;是一项极具挑战性的任务&#xf…

作者头像 李华
网站建设 2026/4/16 11:00:11

MiDaS模型优化:边缘设备上的实时推理实现方案

MiDaS模型优化&#xff1a;边缘设备上的实时推理实现方案 1. 引言&#xff1a;AI 单目深度估计的现实挑战与机遇 在智能硬件和边缘计算快速发展的今天&#xff0c;如何让AI模型在资源受限的设备上高效运行&#xff0c;成为工程落地的关键瓶颈。尤其是在机器人导航、AR/VR、自…

作者头像 李华
网站建设 2026/4/16 11:02:18

【开题答辩全过程】以 高校招生预报管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/4/16 7:35:41

【Java毕设全套源码+文档】基于springboot的高中素质评价档案系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华