人工智能数据基础之微积分入门-学习篇
目录
- 导数概念
- 常见导数和激活导数
- python代码绘制激活函数
- 微分概念和法则、积分概念
- 微积分切线切面代码生成案例
- 链式求导法则
- 反向传播算法(重要)
一、概念
二、常见导数及激活导数
常见激活函数及其导数公式:
在神经网络中,激活函数用于引入非线性因素,使得神经网络能够拟合更加复杂的数据分布。没有激活函数的神经网络本质上只是一个线性模型,而添加了非线性激活函数后,神经网络可以表示非线性的决策边界。使得网络能够解决复杂的非线性问题。
三、python绘制以上激活函数
sigmoid函数:
Sigmoid函数将输入值映射到(0, 1)之间,常用于二分类问题的输出层。然而,它容易出现梯度消失问题,特别是在输入值接近0或1时,梯度接近于0,导致网络训练缓慢。
import numpy as np
import matplotlib.pyplot as plot
#sigmoid公式
def sigmoid(x):return 1/(1+np.exp(-x))
#绘制图形方法 func数学公式,可变参数x,图形标题title
def plot_activation_function(func,x,title):y = func(x)plot.plot(x,y) #传入x 和yplot.title(title) #设置标题plot.xlabel('x') #x轴plot.ylabel('y') #y轴plot.grid() #网格线plot.show()
x_value = np.arange(-10,10,0.1) #x取值范围,-10 - 10 步长0.1
plot_activation_function(sigmoid,x_value,'sigmoid')
运行如下:
tanh函数:
Tanh函数将输入值映射到(-1, 1)之间,输出均值为0,有助于中心化数据。与Sigmoid函数类似,它也容易出现梯度消失问题,但程度相对较轻。
import numpy as np
import matplotlib.pyplot as plot
#tanh公式 双曲正切函数(Tanh函数)
def tanh(x):return np.tanh(x)
#绘制图形方法 func数学公式,可变参数x,图形标题title
def plot_activation_function(func,x,title):y = func(x)plot.plot(x,y) #传入x 和yplot.title(title) #设置标题plot.xlabel('x') #x轴plot.ylabel('y') #y轴plot.grid() #网格线plot.show()
x_value = np.arange(-10,10,0.1) #x取值范围,-10 - 10 步长0.1
plot_activation_function(tanh,x_value,'tanh')
结果如下:
ReLU函数:
ReLU函数简单高效,能够解决梯度消失问题(在正数区域)。然而,它存在神经元“死亡”问题,即当输入小于0时,梯度为0,导致神经元无法更新。
import numpy as np
import matplotlib.pyplot as plot
#ReLU函数(Rectified Linear Unit)
def relu(x):return np.maximum(0, x)
#绘制图形方法 func数学公式,可变参数x,图形标题title
def plot_activation_function(func,x,title):y = func(x)plot.plot(x,y) #传入x 和yplot.title(title) #设置标题plot.xlabel('x') #x轴plot.ylabel('y') #y轴plot.grid() #网格线plot.show()
x_value = np.arange(-10,10,0.1) #x取值范围,-10 - 10 步长0.1
plot_activation_function(relu,x_value,'ReLU')
执行如下:
Leaky ReLU函数:
Leaky ReLU函数通过引入一个小的斜率α,解决了ReLU函数中的“死亡”问题。它保留了ReLU函数的优点,同时避免了神经元无法更新的问题。
alpha=0.01是可变的,值可以根据实际情况定义
import numpy as np
import matplotlib.pyplot as plot
# Leaky ReLU函数
def leaky_relu(x,alpha=0.01):return np.where(x > 0, x, x*alpha) #x >0时,返回x,否则 x*0.01
#绘制图形方法 func数学公式,可变参数x,图形标题title
def plot_activation_function(func,x,title):y = func(x)plot.plot(x,y) #传入x 和yplot.title(title) #设置标题plot.xlabel('x') #x轴plot.ylabel('y') #y轴plot.grid() #网格线plot.show()
x_value = np.arange(-10,10,0.1) #x取值范围,-10 - 10 步长0.1
plot_activation_function(leaky_relu,x_value,'leaky_relu')
返回结果:
#ELU函数(Exponential Linear Unit):
ELU函数融合了ReLU和Leaky ReLU的优点,具有负数饱和区域,对噪声有一定的鲁棒性。然而,其计算量相对较大,因为包含指数运算。
import numpy as np
import matplotlib.pyplot as plot
#ELU函数(Exponential Linear Unit)
def elu(x,alpha=1):return np.where(x > 0, x, alpha*(np.exp(x) - 1))
#绘制图形方法 func数学公式,可变参数x,图形标题title
def plot_activation_function(func,x,title):y = func(x)plot.plot(x,y) #传入x 和yplot.title(title) #设置标题plot.xlabel('x') #x轴plot.ylabel('y') #y轴plot.grid() #网格线plot.show()
x_value = np.arange(-10,10,0.1) #x取值范围,-10 - 10 步长0.1
plot_activation_function(elu,x_value,'elu')
结果如下:
四:微分、积分
1. 微分的定义:
微分是求函数在某一点的变化率。
2. 微分的三个法则:
在微积分中,微分(导数)的加法法则、乘法法则和除法法则(也称为商的导数法则)是求解复合函数导数的基本工具。这些法则允许我们将复杂的函数分解为更简单的部分,并分别求导,然后再以特定的方式组合起来。
3. 积分
定积分的值就是这个封闭图形的面积。
五、微积分切线切面代码生成案例
1. 用Python展示二维图像的切线
用代码绘制x^2的函数图像,并绘制函数在x=1处的切线
Python代码如下
import numpy as np
import matplotlib.pyplot as plt#定义一个函数f(x) 求x平方的函数
def f(x):return x ** 2
#定义函数的导数
def df(x):return 2 * x
#绘制原始函数 定义x的取值范围,中间均匀拆分出100个点
x = np.linspace(-3,3,100)
y = f(x) #y是要求导的这条曲线
#设置画面大小 8 * 6 的尺寸比例
plt.figure(figsize=(8,6))
#绘制图像添加标注
plt.plot(x,y,label='f(x) = x^2')
#计算x = 1时的导数和切线
x1 = 1
y1 = f(x1)
scope = df(x1) #导数
#切线方程 y = m(x-x1) + y1
def tangent_line(x,x1,y1,scope):return scope * (x - x1) + y1
#在切点附近绘制切线
x_tangent = np.linspace(x1 -1,x1 + 1,10) #限定切线x轴的范围
y_tangent = tangent_line(x_tangent,x1,y1,scope) #切线y轴的范围
#绘制切线图像,添加标题
plt.plot(x_tangent,y_tangent,label='tangent at x = 1',color='red')
plt.scatter([x1],[y1],color='black') #定义标注切点颜色
#设置图像
plt.legend() #展示图线的label
plt.xlabel("x") #定义x轴名称
plt.ylabel("f(x)") #y轴名称
plt.title("Function and Tangent Line at a Point") #图片标题
plt.grid(True) #显示网格
plt.show()
2. 展示三维函数切面
用代码绘制以下三维图像,并绘制出三维图像的切面
Python代码如下:
import matplotlib.pyplot as plt
import numpy as np#创建x,y数据点
# -5 - 5,中间拆分成100段
x = np.linspace(-5,5,100)
y = np.linspace(-5,5,100)
#把x,y放入meshgrid,生成网格坐标矩阵
x,y = np.meshgrid(x,y)
#定义三维函数
def f(x,y):return x ** 2 + y ** 2
#计算z的值 z是三维图形的高度
z = f(x,y)
#创建图形和轴
fig = plt.figure() #创建一个图形
#111代表在图像的第一行第一列第一个位置添加一个图,在这个图上画三维图像
ax = fig.add_subplot(111,projection='3d')
#绘制表面 plot_surface用来绘制三维图 颜色使用viridis alpha代表画面的透明度
surf = ax.plot_surface(x,y,z,cmap="viridis",alpha=0.5)
#定义要突出显示的点 曲面和切面相交的点的x轴和y轴的值
point_x,point_y = 1.0,1.0
point_z = f(point_x,point_y) #z轴的值
#绘制出该相交的点位,s=50代表点大小为50
ax.scatter(point_x,point_y,point_z,color='red',s=50)
#为了方便画出切面,需先算出切面的法线
normal = np.array([2*point_x,2*point_y,-1])
#定义平面上的所有点,x_plane,y_plane,z_plane
x_plane = np.linspace(-5,5,10)
y_plane = np.linspace(-5,5,10)
#把x_plane y_plane转化为网格点坐标
x_plane,y_plane = np.meshgrid(x_plane,y_plane)
#normal[0]代表x轴的变量, normal[1] y轴变量 normal[2] z轴变量
z_plane = (-normal[0] * (x_plane-point_x) - normal[1] * (y_plane-point_y) /normal[2] + point_z)
#绘制切平面
ax.plot_surface(x_plane,y_plane,z_plane,color='yellow',alpha=0.5)
#设置标题和坐标轴
ax.set_xlabel('x asis')
ax.set_ylabel('y asis')
ax.set_zlabel('z asis')
ax.set_title("3D Surface Plot with Tangent Plane")
plt.show()
六、链式求导法则
七、反向传播算法
简介
反向传播算法(Backpropagation Algorithm),简称BP算法,是一种用于训练人工神经网络(Artificial Neural Network, ANN)的常用且有效的算法。它建立在梯度下降法的基础上,通过计算网络预测与实际结果之间的误差,并将这个误差反向传播到网络中的每一层,从而调整网络中每个权重的值,以逐步优化网络的学习过程。
反向传播算法的基本原理
反向传播算法的基本原理是利用链式法则(Chain Rule)进行求导。在神经网络中,数据通过前向传播得到预测输出,然后计算预测输出与真实标签之间的损失(或误差)。接着,通过反向传播算法,将损失从输出层向输入层逐层反向传播,计算每一层权重和偏置的梯度。最后,利用这些梯度来更新网络的参数,以减小损失。
反向传播算法步骤概述
前向传播: 首先,给定一个输入样本,按照当前网络的权重和偏置,通过每一层传递这个输入,直到最后一层,得到网络的预测输出。
计算损失: 使用损失函数(如均方误差或交叉熵)计算网络预测输出与实际目标输出之间的差异。
梯度计算: 通过链式法则计算损失函数相对于每个权重的梯度。这个过程从输出层开始,向后传播到输入层。在每一步中,都会计算当前层的误差项(也称为局部梯度),然后根据当前层的权重将误差分配给前一层。
权重更新: 一旦得到了每个权重的梯度,就可以使用某种形式的梯度下降法(例如批量梯度下降、随机梯度下降或小批量梯度下降)来调整权重,使损失函数减少。
反向传播算法的关键要素
学习率(Learning Rate): 决定了参数更新的步长,过大的学习率可能导致震荡,过小的学习率可能导致收敛速度过慢。
激活函数(Activation Function): 影响神经元的输出,常见的激活函数包括sigmoid、ReLU等。
损失函数(Loss Function): 衡量网络预测输出与真实标签之间的差距,常见的损失函数包括均方误差(MSE)和交叉熵损失函数。
梯度下降(Gradient Descent): 利用梯度信息来更新网络参数的优化算法
这里我画了一个三层的神经元,x1,x2代表输入,y代表输出,z1,z2,z3代表中间变量
计算过程:
梯度更新计算:
重新进行前向传播:
使用Python代码实现上述神经网络的反向传播
#模型参数初始化
def param_init():# 定义权重w_1_11 = 0.5w_1_12 = 0.5w_1_13 = 0.5w_1_21 = 0.5w_1_22 = 0.5w_1_23 = 0.5w_2_11 = 1.0w_2_21 = 1.0w_2_31 = 1.0layer_1_list = [w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23]layer_2_list = [w_2_11,w_2_21,w_2_31]return layer_1_list, layer_2_list#前向传播的函数 输出预测输出
def forword_porpagation(layer_1_list, layer_2_list):w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23 = layer_1_listw_2_11, w_2_21, w_2_31 = layer_2_list# 前向传播z_1 = x_1 * w_1_11 + x_2 * w_1_21z_2 = x_1 * w_1_12 + x_2 * w_1_22z_3 = x_1 * w_1_13 + x_2 * w_1_23y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31return y_pred#计算损失值 网络的输出和真实值相多少
def compute_loss(y_true, y_pred):loss = 0.5 * (y_true - y_pred) ** 2return loss#反向传播
def backword_propagation(layer_1_list, layer_2_list,learning_rate):w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23 = layer_1_listw_2_11, w_2_21, w_2_31 = layer_2_listz_1 = x_1 * w_1_11 + x_2 * w_1_21z_2 = x_1 * w_1_12 + x_2 * w_1_22z_3 = x_1 * w_1_13 + x_2 * w_1_23# 计算输出层关于损失函数的梯度d_loss_predictied_output = -(expected_out - y_pred)# 计算权重关于损失函数的梯度d_loss_w_2_11 = d_loss_predictied_output * z_1d_loss_w_2_21 = d_loss_predictied_output * z_2d_loss_w_2_31 = d_loss_predictied_output * z_3d_loss_w_1_11 = d_loss_predictied_output * w_2_11 * x_1d_loss_w_1_21 = d_loss_predictied_output * w_2_11 * x_2d_loss_w_1_12 = d_loss_predictied_output * w_2_21 * x_1d_loss_w_1_22 = d_loss_predictied_output * w_2_21 * x_2d_loss_w_1_13 = d_loss_predictied_output * w_2_31 * x_1d_loss_w_1_23 = d_loss_predictied_output * w_2_31 * x_2# 使用梯度下降法更新权重learning_rate = 1e-5w_2_11 -= learning_rate * d_loss_w_2_11w_2_21 -= learning_rate * d_loss_w_2_21w_2_31 -= learning_rate * d_loss_w_2_31w_1_11 -= learning_rate * d_loss_w_1_11w_1_12 -= learning_rate * d_loss_w_1_12w_1_13 -= learning_rate * d_loss_w_1_13w_1_21 -= learning_rate * d_loss_w_1_21w_1_22 -= learning_rate * d_loss_w_1_22w_1_23 -= learning_rate * d_loss_w_1_23layer_1_list = [w_1_11, w_1_12, w_1_13, w_1_21, w_1_22, w_1_23]layer_2_list = [w_2_11,w_2_21,w_2_31]return layer_1_list, layer_2_listif __name__ == '__main__':# 定义输入值和期望输出x_1 = 40.0x_2 = 80.0expected_out = 60.0 # 期望输出值learning_rate = 1e-5epoch = 100#初始化定义权重layer_1_list, layer_2_list = param_init()for i in range(epoch):y_pred = forword_porpagation(layer_1_list, layer_2_list)print(f"前向传播预测值为{y_pred}")loss = compute_loss(expected_out, y_pred)print(f"当前的Loss值为{loss}")layer_1_list, layer_2_list = backword_propagation(layer_1_list, layer_2_list, learning_rate)
结果如下图所示:
一直到:
可以看到经过100次循环,损失值越来越小, 网络的输出和真实值相差无限接近,达到了最终的目的。
相关文章:

人工智能数据基础之微积分入门-学习篇
目录 导数概念常见导数和激活导数python代码绘制激活函数微分概念和法则、积分概念微积分切线切面代码生成案例链式求导法则反向传播算法(重要) 一、概念 二、常见导数及激活导数 常见激活函数及其导数公式: 在神经网络中,激活函数用于引入非线性因素&…...

【PSINS】ZUPT代码解析(PSINS_SINS_ZUPT)|MATLAB
这篇文章写关于PSINS_SINS_ZUPT的相关解析。【值得注意的是】:例程里面给的这个m文件的代码,并没有使用ZUPT的相关技术,只是一个速度观测的EKF 简述程序作用 主要作用是进行基于零速更新(ZUPT)的惯性导航系统(INS)仿真和滤波 什么是ZUPT ZUPT是Zero Velocity Update(…...

多态(上)【C++】
文章目录 多态的概念多态的实现多态产生的条件什么是虚函数?虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写? 多态的概念 C中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口…...

如何驱动一枚30年前的音源芯片,YMF288驱动手记 Part2
一些问题 在上一篇里面虽然策划了想要驱动YMF288所需要做的事情以及目标。但是,在板子打出来后,我在进一步的研究中,发现我犯了个错误,那就是YMF288并不是使用现在很多轻量化的嵌入式,比如ESP32常用的I2S协议的&#x…...

yarn webpack脚手架 react+ts搭建项目
安装 Yarn 首先,确保你已经安装了 Node.js 和 Yarn。如果还没有安装 Yarn,可以通过以下命令安装: npm install -g yarn创建项目 使用 create-react-app 脚手架创建一个带有 TypeScript 的项目,node更新到最新版,并指定…...

防蓝光护眼灯有用吗?五款防蓝光效果好的护眼台灯推荐
现在孩子的很多兴趣班和课后辅导班都是在线上举行,通常对着手机电脑长时间。电子产品有大量蓝光和辐射,会伤害到孩子的眼睛。但为了学习,也是没办法。护眼台灯的出现可以让孩子们的眼睛得到保护,防止蓝光对眼睛的伤害。防蓝光护眼…...

Mac使用Elasticsearch
下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz 修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl: enabled: false 切换目录 cd elasticsearch-8.15.1/…...

DevOps -CI/CD 与自动化部署
DevOps - CI/CD 与自动化部署详解 DevOps 是一种结合开发(Development)与运维(Operations)的方法论,旨在通过工具和文化变革,促进软件开发和运维之间的协作,提升软件交付的效率、质量和稳定性。…...

单体架构系统是不是已经彻底死亡?
单体架构系统并未“彻底死亡”,尽管在复杂和大规模的应用场景中,它可能不再是首选的架构模式。单体架构系统,也称为巨石系统(Monolithic),在软件发展过程中是最广泛的架构风格之一,出现时间最早…...

mathorcup发邮件:参赛必看邮件撰写技巧?
mathorcup发邮件的注意事项?如何使用mathorcup发信? 无论是提交参赛作品、咨询比赛规则,还是与组委会沟通,一封清晰、专业的邮件都能为你赢得更多机会。AokSend将为你详细介绍mathorcup发邮件的撰写技巧,帮助你在比赛…...

ESP01烧入AT出厂固件
ESP01是一种常见的WIFI模块,其核心是esp8266,常用于给主控拓展WIFI功能,因其体积较小、集成度高、造价便宜,常受到消费者喜爱,ESP01常用的开发方式有两种,一种是利用基于Arduino框架作为独立设备开发&#…...

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽
一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…...

民间故事推广系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,民族文化管理,节日类型管理,传统节日管理,故事类型管理,民间故事管理,系统管理 微信端账号功能包括:系统首…...

关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时,自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时,将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms (典型值) 内没有变为高…...

C++ 异常
这里写目录标题 1.C语言传统的处理错误的方式2.C异常概念3.异常的用法3.1 异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.自定义异常体系5.标准库异常体系6.异常的优缺点 1.C语言传统的处理错误的方式 传统的错误处理机制: 1. 终止程序,…...

ST官方 VSCode 插件安装及配置工程参考
写在前头 VSCode的用法和插件是月初参加ST官方北京站举办的线下培训中,厂家AE工程师给我们讲的,不同于已经很多人用的(并且一直在吵的)keil assistant什么的,用的是CMake编译,抛弃了原有的keil,…...

使用Pandas读取和写入数据库的Python函数实现
使用Pandas读取和写入数据库的Python函数实现 Pandas是一个强大的数据处理和分析库,广泛应用于数据科学和机器学习领域。结合数据库操作,Pandas可以极大地简化数据的读取和写入过程。本文将详细介绍如何使用Pandas实现读取和写入数据库的函数,涵盖数据库连接、数据读取、数…...

Redis——常用数据类型hash
目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值:设置成功的键值对的个数hget HGET key field//hdel HDEL key…...

基于Python实现一个庆祝中秋节的小程序
功能包括: 使用复杂的库来计算农历日期:可以使用 lunarcalendar 库来计算农历日期。提供更多的祝福语:可以通过随机选择祝福语来增加趣味性。加入图形用户界面 (GUI):可以使用 tkinter 库来创建一个简单的图形用户界面。 我们可…...

近期最值得买的数码好物有什么?2024兼具功能和实用性的好物分享
在如今这个科技飞速发展的时代,数码好物层出不穷,它们为我们带来了前所未有的便捷与乐趣。而对于学生党和上班族来说,挑选到既实用又性价比高的数码好物,更是能为学习和办公生活增添一抹亮丽的色彩。其中,电容笔便是备…...

云服务器中的MinIO 配置 HTTPS 过程(图文)
目录 1. 基本知识2. 实战3. 彩蛋1. 基本知识 具体证书的格式如下: 私钥:private.key公钥:public.crt (公钥以pem格式结尾,可直接改为crt格式)证书和私钥文件的命名和路径应该是: 证书文件: ~/.minio/certs/public.crt 私钥文件: ~/.minio/certs/private.key使用了自定义…...

注册安全分析报告:熊猫频道
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

2000-2021年3月海关数据库
2000-2021年3月海关数据库 1、时间:2000-2021年3月 2、指标:2000-2015数据变量包括:年份、截止日期、进出口分类代码、进出口分类名称、HS商品编码、HS商品名称、金额_美元、数量、价格、经营单位代码、经营单位名称、经营单位地址、电话、…...

【YashanDB知识库】archivelog磁盘满导致数据库abnormal
本文转自YashanDB官网,具体内容可见archivelog磁盘满导致数据库abnormal 【问题分类】功能使用 【关键字】磁盘空间满,archivelog日志,archivelog自动清理 【问题描述】数据库状态变更为abnormal,检查V$DIAG_INCIDENT视图&#…...

远程跨境传输大文件如何做到安全又稳定?
在当今全球化的商业环境中,企业跨境传输大文件的需求日益增长。这不仅涉及到数据的快速迁移,还包括了安全性、稳定性和合规性等多重挑战。本文将探讨企业在跨境传输大文件时可能遇到的问题,以及在传输过程中应注意的事项,并重点介…...

JSON报文根据正则过滤消息
有时候业务系统在接收外部传过来的JSON报文,可能需要根据某个标识来判断是否是自己系统的消息,不是需要过滤。正常我们可能是先将JSON反序列化为具体实体类(例: A a JSON.parseObject(body,A.class)),然后获取具体字段来判断。此方法面对接收…...

BOM编程
什么是 BOM? BOM(Browser Object Model)是浏览器提供的对象和方法的集合,允许开发者操作浏览器窗口、页面跳转、URL、浏览器历史记录、用户设备信息等。window 对象是 BOM 的顶层对象,所有 BOM API 都直接或间接作为 …...

【C++ Primer Plus习题】16.1
大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> usin…...

音视频入门基础:AAC专题(1)——AAC官方文档下载
一、AAC简介 高级音频编码(英语:Advanced Audio Coding,AAC)是有损音频压缩的专利数字音频编码标准,由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年,为一种基于MPEG…...