【Python】基于动态残差学习的堆叠式LSTM模型和传统BP在股票预测中的应用

1. 前言

本论文探讨了长短时记忆网络(LSTM)和反向传播神经网络(BP)在股票价格预测中的应用。首先,我们介绍了LSTM和BP在时间序列预测中的基本原理和应用背景。通过对比分析两者的优缺点,我们选择了LSTM作为基础模型,因其能够有效处理时间序列数据中的长期依赖关系,在基础LSTM模型的基础上,我们引入了动态残差学习(dynamic skip connection)的概念,通过动态调整残差连接,提高了模型的长期记忆能力和预测准确性。实验证明,动态残差的引入在股票价格预测任务中取得了显著的改进效果。进一步地,我们探讨了堆叠式LSTM的改进方法,通过增加模型的深度来捕捉更复杂的时间序列模式。我们详细阐述了堆叠式LSTM的结构和训练过程,并通过实验证实其在股票价格预测中的优越性。结果表明,堆叠式LSTM在处理多层次的时间序列信息上具有更强的表达能力,提高了模型的泛化性能。综合而言,本论文通过对LSTM和BP在股票价格预测中的应用进行研究,进一步引入了动态残差学习和堆叠式LSTM的改进方法,提高了模型的性能和稳健性。这些方法为金融领域的时间序列预测提供了有效的工具和思路,对于投资决策和风险管理具有重要的实际意义。

Value在这里插入图片描述
Colab NotebookGithub Rep

2. 数据集和方法选用

随着信息技术的不断发展和大数据的涌现,研究者们越来越倾向于利用高频、多维的金融数据来提升预测模型的性能。在这一趋势中,长短时记忆网络(LSTM)作为一种强大的时序建模工具,凭借其对长期依赖关系的出色捕捉能力,引起了广泛的关注。同时,动态残差学习和堆叠式LSTM等改进方法的引入进一步提高了模型的复杂性和性能。本研究在这一背景下,以中国股票市场为研究对象,旨在利用这些先进的深度学习技术,提高对系统性风险的识别和预测能力。

2.1 数据集描述

为了确保时间序列的稳定性,我们选择了这些具有相对较长历史的股票。我们的数据集来源于 investing.com、Yahoo Finance、Yahoo Finance等,通过网络爬虫爬取和网站直接下载的方式,获取了中国股票市场中时间较长的四只股票的日频数据。这些股票的历史数据涵盖多年,每日记录超过7000条。

2.2 数据获取过程

在使用网络爬虫获取金融数据时,主要步骤包括选择数据源、确定数据获取的方法、编写爬虫代码、处理数据并保存。首先我们确定了要获取数据的来源,就是上面所说的几个股票网站,随后我们确定了数据获取的方法,查看数据源是否提供API接口和直接下载的链接。如果有,就可以使用API或者直接下载方式来更加方便和规范地获取数据。如果没有API,则能需要考虑使用爬虫技术从网页中提取数据。到了编写爬虫代码的步骤, 我们选择使用爬虫,于是编写代码来模拟浏览器行为,请求网页并解析HTML内容。具体使用的Python中的requests库来用于发送HTTP请求,除此之外还使用了BeautifulSoup和lxml等库用于解析所获取到HTML。最后我们进行了处理数据并保存,提取了后面再进行特征工程时所需要的信息,然后进行简单的数据清理和处理。最后,将数据保存到本地文件或数据库中。最后我们保存了四只符合条件的股票。

表 I 四只股票的详情信息(名称用序号替换)
序号记录开始时间记录结束时间记录条数
0000011991-01-292020-04-146936
0000021991-01-292020-04-186940
0000041991-01-142020-04-146820
0000061992-04-272020-04-186603
示例代码1 使用爬虫获得股票信息(伪代码)
import requests  
from bs4 import BeautifulSoup  
import pandas as pd  
import yfinance as yf  
from tiingo import TiingoClient  # 函数:爬取 investing.com 的历史股价数据  
def scrape_investing(stock_code):  url = f'https://www.investing.com/equities/{stock_code}-historical-data'  response = requests.get(url)  soup = BeautifulSoup(response.text, 'html.parser')  data_table = soup.find('table', {'id': 'curr_table'})  data = pd.read_html(str(data_table))[0]  return data  # 函数:爬取 Yahoo Finance 的历史股价数据  
def scrape_yahoo_finance(stock_code):  stock_data = yf.download(stock_code, start="1991-01-01")  return stock_data# 函数:爬取 Tiingo 的历史股价数据  
def scrape_tiingo(stock_code, api_key):  config = {  'session': True,  'api_key': api_key  }  client = TiingoClient(config)  stock_data = client.get_ticker_price(stock_code, fmt='json', startDate='2000-01-01')  data = pd.DataFrame(stock_data)  return data  # 函数:筛选至少有6800条记录的数据  
def filter_data(data, min_records=6800):  if len(data) >= min_records:  return data  else:  return None  # 股票代码  
stock_code = 'xxxx'  # 示例伪代码  # 爬取数据  
investing_data = scrape_investing(stock_code)  
yahoo_finance_data = scrape_yahoo_finance(stock_code)  
tiingo_data = scrape_tiingo(stock_code, 'TIINGO_API_KEY')  # 真实的Tiingo API 密钥  # 筛选数据  
investing_data = filter_data(investing_data)  
yahoo_finance_data = filter_data(yahoo_finance_data)  
tiingo_data = filter_data(tiingo_data)  
# 清洗数据...  
# 保存文件...  

在数据获取的过程中,我们也遇到一些困难,有网站有反爬虫机制,它们采取反爬虫机制来防止爬虫访问。我们用设置合适的请求头,使用代理IP解决了这个问题,还有动态加载的问题, 一些网页如新三板网站(xinsanban.eastmoney.com)使用JavaScript进行动态加载数据,这样爬虫可能无法直接获取到所有的信息。解决办法是我们使用Docker部署一个splash来爬取数据。

FIGURE 1.  使用Splash来解决爬取网页需要JavaScript动态加载的问题

在这里插入图片描述

2.3 选股标准:

在选股时,我们考虑了这四只股票在中国股票市场中的代表性、其历史数据的时间跨度,以及它们的交易活跃度。这种选股标准的应用旨在使我们的研究更具有代表性,能够更全面地反映中国股票市场的整体波动。

2.4 机器学习方法:

我们采用了深度学习方法,主要是长短时记忆网络(LSTM)。并且与BP神经网络进行了一个对比实验,LSTM作为一种递归神经网络,在捕捉时间序列数据中的长期依赖关系方面表现出色。通过对股票价格的历史数据进行训练,我们预期的是LSTM能够有效地建模和预测未来的价格趋势。

2.5 改进方法:

在基础的LSTM模型上,我们引入了动态残差学习和堆叠式LSTM的改进方法。动态残差学习旨在通过调整残差连接,提升模型的长期记忆能力。而堆叠式LSTM通过增加模型的深度,更好地捕捉时间序列中的复杂模式。这些改进方法旨在提高模型对系统性风险的识别和预测能力,使其更适用于金融领域的时间序列预测任务。

3. 反向神经网络以及短期记忆网络的数学表达

反向传播(BP)神经网络是一类人工神经网络,在机器学习和模式识别领域非常受欢迎。这些网络属于监督学习算法家族,尤其以其学习输入和输出数据之间复杂映射的能力而闻名。术语“反向传播”是指误差通过网络向后传播的训练过程,从而能够调整权重以最小化预测输出和实际输出之间的差异。

3.1 反向传播原理的概念

3.1.1 神经网络结构

BP神经网络由输入层、一个或多个隐藏层和输出层组成。每层都包含互连的节点,每个连接都与一个权重相关联。

3.1.2 前馈过程

在前馈过程中,输入数据在网络中逐层传播,通过每个节点中的加权连接和激活函数进行转换。此过程生成网络的输出。如下公式(1),前馈的过程是通过网络传播输入以使用激活函数生成输出。

a j ( l ) = g ( z j ( l ) ) ( 1 ) a_j^{(l)} = g(z_j^{(l)}) (1) aj(l)=g(zj(l))1

FIGURE 2.  BP神经网络的前馈过程(图源知乎)

在这里插入图片描述

3.1.3 误差计算:

将网络生成的输出与实际目标值进行比较,并计算误差。常见的误差函数包括均方误差 (MSE) 或交叉熵。如下公式(2),误差计算是计算预测 a k ( L ) a_k^{(L)} ak(L)和实际 y k y_k yk输出之间的差异。

E = 1 2 ∑ k ( y k − a k ( L ) ) ( 2 ) E=\frac{1}{2}\sum_{k}(y_{k}-a_{k}^{(L)})(2) E=21k(ykak(L))2

FIGURE 3.  BP神经网络的误差计算(图源知乎)

在这里插入图片描述

3.1.4 反向传播算法

反向传播算法涉及权重的迭代调整以最小化误差。首先进行梯度计算(公式3)用微积分的链式法则计算误差相对于每个权重的梯度。然后更新权重(公式4),权重以梯度的相反方向更新,目的是减少误差。再引入学习率,以此来控制权重更新期间的步长。它可以防止超调或收敛问题。然后是激活函数(公式5),它向网络引入非线性,使其能够学习复杂的关系。最后训练迭代前馈和反向传播步骤重复多次迭代或历元,直到网络收敛到误差最小化的状态。

FIGURE 4.  BP神经网络的反向传播(图源知乎)

在这里插入图片描述

∂ E ∂ ω i j ¨ ( 1 ) = δ j ( l + 1 ) ∗ a i ( l ) ( 3 ) \frac{\partial E}{\partial\omega_{\ddot{\mathrm{ij}}}^{(1)}}=\delta_{j}^{(l+1)}*a_{i}^{(l)} (3) ωij¨(1)E=δj(l+1)ai(l)3
ω i j ( l ) = ω i j ( l ) − α ∂ E ∂ ω i j ( l ) ( 4 ) \omega_{\mathrm{ij}}^{(l)}=\omega_{\mathrm{ij}}^{(l)}-\alpha\frac{\partial E}{\partial\omega_{ij}^{(l)}}(4) ωij(l)=ωij(l)αωij(l)E4
g ( z ) = 1 1 + e − z O R g ( z ) = max ⁡ ( 0 , Z ) ( 5 ) g(z)=\dfrac{1}{1+e^{-z}}ORg(z)=\max(0,Z)(5) g(z)=1+ez1ORg(z)=max(0,Z)5

3.2 LSTM的原理以及概念

长短期记忆 (LSTM) 网络是一种特殊类型的循环神经网络 (RNN),旨在克服传统 RNN 中的梯度消失问题。 LSTM 通过捕获远程依赖关系,在建模和预测顺序数据方面特别有效。由于这些网络能够长时间学习和记住信息,因此在自然语言处理、语音识别和时间序列预测中得到了广泛的应用。

FIGURE 5.  直观的LSTM网络结构图(图源知乎)

在这里插入图片描述

3.2.1 细胞状态和门

LSTM 引入了贯穿整个序列的单元状态 概念,允许信息随着时间的推移而持续存在。门控制信息流入和流出细胞状态。

3.2.2 三种门

第一种是忘记门,用于决定应丢弃或保留细胞状态中的哪些信息。符号表示为 ( f i ) (f_i) (fi),第二种是输入门,用于确定应将哪些新信息添加到单元状态中。符号表示为 ( i t ) (i_t) (it),第三种是输出门,用于记录控制单元状态中的哪些信息应输出到序列中的下一层。符号表示为 ( o t ) (o_t) (ot)

3.2.3 细胞状态更新

细胞状态通过以下三种步骤来更新。一种是忘记门操作(公式6),一种是输入门操作(公式7),还有一种是细胞状态更新操作(公式8)

f t = σ ( W f ∗ [ h t − 1 , x t ] + b f ) ( 6 ) \quad f_t=\sigma({W_f}*[h_{t-1},x_t]+b_f)(6) ft=σ(Wf[ht1,xt]+bf)6
i t = σ ( W f ∗ [ h t − 1 , x t ] + b i ) ( 7 ) i_t=\sigma(W_f*[h_{t-1},x_t]+b_i) (7) it=σ(Wf[ht1,xt]+bi)7
C ~ = tanh ⁡ ( W C ∗ [ h t − 1 , x t ] + b C ) ( 7 ) \widetilde{C}=\tanh(W_C*[h_{t-1},x_t]+b_C)(7) C =tanh(WC[ht1,xt]+bC)7
C t = f t ∗ C t − 1 + i t ∗ C ~ t ( 8 ) C_{t}=f_{t}*C_{t-1}+i_{t}*\tilde{C}_{t}(8) Ct=ftCt1+itC~t8

3.2.4 隐藏状态更新

隐藏状态使用输出门更新(公式9)
o t = σ ( W o ∗ [ h t − 1 , x t ] + b o ) h t = o t ∗ tanh ⁡ ( C t ) ( 9 ) \begin{aligned}o_t&=\sigma(W_o*[h_{t-1},x_t]+b_o)\\h_t&=o_t*\tanh(C_t)\end{aligned} (9) otht=σ(Wo[ht1,xt]+bo)=ottanh(Ct)(9)

3.2.5 训练和反向传播

LSTM 使用随时间反向传播 (BPTT) 进行训练,其中计算损失相对于参数的梯度并用于更新权重。

4. 用堆叠式和动态残差来改进短期记忆网络

4.1 堆叠式 LSTM的原理以及概念

堆叠式长短期记忆 (LSTM) 网络,即Stacked Long Short-Term Memory Networks是传统 LSTM 架构的扩展,旨在捕获顺序数据中更复杂和分层的模式。通过将多个 LSTM 层相互堆叠,这些网络增强了表示学习能力,从而可以对时间序列数据中复杂的依赖关系进行建模。堆叠架构能够提取分层特征,使其在时间序列预测、自然语言处理和语音识别等任务中特别有效。 它相对于传统的LSTM有顺序信息流、层次特征提取、分层结构、随时间的训练和反向传播的特点。

4.1.1 分层结构

堆叠 LSTM 由多个 LSTM 层组成,其中每层都包含自己的一组 LSTM 单元。信息按层次结构流过这些层,使网络能够学习复杂的表示。

FIGURE 6.  堆叠式LSTM在一维空间上的展示图(图源知乎)

在这里插入图片描述

堆叠 LSTM 由多个 LSTM 层组成,其中每层都包含自己的一组 LSTM 单元。信息按层次结构流过这些层,使网络能够学习复杂的表示。其公式如下(公式10)

h t ( 1 ) = L S T M 1 ( x t , h t − 1 ( 1 ) , C t − 1 ( 1 ) ) h t ( 2 ) = L S T M 2 ( h t , h t − 1 ( 2 ) , C t − 1 ( 2 ) ) ( 10 ) \begin{aligned}h_t^{(1)}&=LSTM1(x_t,h_{t-1}^{(1)},C_{t-1}^{(1)})\\h_t^{(2)}&=LSTM2(h_t,h_{t-1}^{(2)},C_{t-1}^{(2)})\end{aligned}(10) ht(1)ht(2)=LSTM1(xt,ht1(1),Ct1(1))=LSTM2(ht,ht1(2),Ct1(2))10

4.1.2 顺序信息流

每个 LSTM 层处理顺序输入数据,一层的输出作为堆栈中下一层的输入。这种顺序信息流使模型能够捕获不同抽象级别的依赖关系。

4.1.3 层次特征提取

堆叠 LSTM 层可以提取分层特征。较低层可以捕获简单的时间模式,而较高层可以根据较低层的输出学习更抽象和复杂的表示。

4.1.4 随时间的训练和反向传播

与传统 LSTM 类似,堆叠 LSTM 使用 BPTT 算法进行训练。在反向传播期间通过整个堆栈计算梯度,从而允许考虑整个层次结构的权重更新。

4.2 动态残差 LSTM的原理以及概念

FIGURE 7.  动态残差LSTM展示图(图源知乎)

在这里插入图片描述

动态残差长短期记忆 (LSTM) 网络是传统 LSTM 架构的扩展,结合动态跳跃连接来增强模型捕获顺序数据中的长期依赖性的能力。通过引入动态残差学习,这些网络旨在提高 LSTM 模型的训练收敛性和整体性能。这项创新从残差网络 (ResNets) 中汲取灵感,专为应对序列数据带来的特定挑战而量身定制。

4.2.1 Residual Learning(剩余学习)

受 ResNets 启发,动态残差 LSTM 集成了残差学习的概念。这涉及引入跳跃连接,允许网络直接学习残差映射,从而缓解梯度消失问题。

4.2.2 Dynamic Skip Connections(动态跳跃连接)

与跳跃连接是固定的传统残差网络不同,动态残差 LSTM 引入了基于输入数据的跳跃连接的可变性(公式11)。跳跃连接在训练过程中动态调整,使模型能够适应输入序列的不同复杂性。因此LSTM的单元操作也需要做出相应的更改(公式12)
s t = D y n a m i c S k i p C o n n e c t i o n ( x t , h t − 1 ) ( 11 ) s_t=DynamicSkipConnection(x_t,h_{t-1})(11) st=DynamicSkipConnection(xt,ht1)11
h t = L S T M ( x t + s t , h t − 1 ( 1 ) , C t − 1 ( 1 ) ) ( 12 ) h_{t}=LSTM(x_{t}+s_{t},h_{t-1}^{(1)},C_{t-1}^{(1)}) (12) ht=LSTM(xt+st,ht1(1),Ct1(1))12

4.2.3 增强的长期依赖处理

动态跳跃连接通过为梯度流提供快捷路径来增强 LSTM 处理长期依赖关系的能力。这有助于缓解反向传播过程中与梯度消失相关的问题。

4.2.4 训练和反向传播

动与传统 LSTM 类似,动态残差 LSTM 使用随时间反向传播 (BPTT) 进行训练。然而,动态跳跃连接的存在引入了需要在训练期间学习的额外参数。

5. 实证分析和实验设计

5.1 数据集部分展示以及说明

FIGURE 8.  四只股票中的其中一只股票的部分展示图

在这里插入图片描述

每只股票都有至少6800条数据,每个数据都有十个特征值,包括开盘、最高、最低、收盘、涨幅、振幅、总手、金额、换手、成交次数。对于测试集的选取,我们选用的后100天的数据,即最后100条数据。

5.2 传统 LSTM构建展示

# 传统LSTM模型
from keras.models import Sequential
from keras.layers import LSTM, Dropout, Densed = 0.0001
model = Sequential()  # 建立层次模型
model.add(LSTM(64, input_shape=(window, feanum), return_sequences=True))  # 建立LSTM层
model.add(Dropout(d))  # 建立的遗忘层
model.add(LSTM(16, return_sequences=False))  # 建立LSTM层,不需要再次指定input_shape
model.add(Dropout(d))  # 建立的遗忘层
model.add(Dense(4, activation='relu'))   # 建立全连接层,移除init参数
model.add(Dense(1, activation='relu'))  # 建立全连接层,移除init参数
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=200, batch_size=256)  # 训练模型,使用epochs代替nb_epoch

5.3 堆叠式LSTM构建展示

# 堆叠式LSTM模型
from keras.models import Sequential
from keras.layers import LSTM, Dropout, Densed = 0.0001
model_stack = Sequential()  # 建立层次模型
model_stack.add(LSTM(64, input_shape=(window, feanum), return_sequences=True))  # 建立LSTM层
model_stack.add(Dropout(d))  # 建立的遗忘层
model_stack.add(LSTM(32, return_sequences=True))  # 建立LSTM层,不需要再次指定input_shape
model_stack.add(Dropout(d))  # 建立的遗忘层
model_stack.add(LSTM(16, return_sequences=False))  # 建立LSTM层,不需要再次指定input_shape
model_stack.add(Dropout(d))  # 建立的遗忘层
model_stack.add(Dense(4, activation='relu'))   # 建立全连接层,移除init参数
model_stack.add(Dense(1, activation='relu'))  # 建立全连接层,移除init参数
model_stack.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model_stack.fit(X_train, y_train, epochs=200, batch_size=256)  # 训练模型,使用epochs代替nb_epoch

5.4 动态残差+LSTM构建展示

from keras.layers import LSTM, Dropout, Dense, Lambda, Layer, Input
from keras.models import Sequential
from keras import Model
from keras.layers import GlobalAveragePooling1D
import keras.backend as K# 自定义动态残差层
class DynamicResidualLayer(Layer):def __init__(self, **kwargs):super(DynamicResidualLayer, self).__init__(**kwargs)def build(self, input_shape):super(DynamicResidualLayer, self).build(input_shape)def call(self, inputs, **kwargs):x, skip_connection = inputsreturn K.concatenate([x, skip_connection], axis=-1)def compute_output_shape(self, input_shape):return input_shape[0][0], input_shape[0][1], input_shape[0][2] * 2# 堆叠式LSTM + 动态残差模型
inputs = Input(shape=(window, feanum))
x = LSTM(64, return_sequences=True)(inputs)
x = Dropout(d)(x)# 第一个动态残差层
skip_connection1 = LSTM(64, return_sequences=True)(x)
x = DynamicResidualLayer()([x, skip_connection1])# 第二个动态残差层
skip_connection2 = LSTM(32, return_sequences=True)(x)
x = DynamicResidualLayer()([x, skip_connection2])# 第三个动态残差层
skip_connection3 = LSTM(16, return_sequences=True)(x)
x = DynamicResidualLayer()([x, skip_connection3])x = GlobalAveragePooling1D()(x)
x = Dropout(d)(x)
x = Dense(4, activation='relu')(x)
outputs = Dense(1, activation='relu')(x)model_dynamic = Model(inputs=inputs, outputs=outputs)
model_dynamic.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model_dynamic.fit(X_train, y_train, epochs=200, batch_size=256)  # 训练模型,使用epochs代替nb_epoch

5.5 三种模型信息展示

FIGURE 9.  传统LSTM模型信息展示图

在这里插入图片描述

FIGURE 10.  堆叠式LSTM模型信息展示图

在这里插入图片描述

FIGURE 11.  堆叠式LSTM+动态残差模型信息展示图

在这里插入图片描述

5.6 三种模型在训练集和测试集上的结果图

FIGURE 12.  三种模型在训练集上的结果展示图

在这里插入图片描述

FIGURE 13.  三种模型在测试集上的结果展示图

在这里插入图片描述

5.7 三种模型的详细指标结果

表 II 三种模型的指标详情信息(只保留两位有效小数)——迭代次数100
模型MAEMSE准确率MAPE
LSTM0.900.820.01inf
堆叠式LSTM0.0160.000440.431.84
堆叠式LSTM+动态残差0.0190.000710.432.16
表 III 三种模型的指标详情信息(只保留两位有效小数)——迭代次数200
模型MAEMSE准确率MAPE
LSTM0.900.820.01inf
堆叠式LSTM0.0130.000340.431.84
堆叠式LSTM+动态残差0.0140.000380.431.63

5.8 实验结论

在这个实验中,我们使用了三种不同的LSTM模型来预测
股票价格:传统的LSTM,堆叠式LSTM,以及堆叠式LSTM+动态残差。每种模型都有其独特的特点和优势。

  1. 传统的LSTM模型是最简单的模型,它只有一个LSTM层。尽管这个模型的结构相对简单,但它仍然能够捕捉到时间序列数据中的长期依赖关系,从而进行有效的预测。
  2. 堆叠式LSTM模型在传统的LSTM模型的基础上增加了更多的LSTM层。这使得模型能够学习到数据中更复杂的模式。然而,这也使得模型的训练变得更加困难,并且可能导致过拟合。
  3. 堆叠式LSTM+动态残差模型在堆叠式LSTM模型的基础上添加了动态残差层。这个模型的优势在于它能够同时学习到数据中的高级特征和低级特征,从而进行更准确的预测。
    在我们的实验中,我们发现堆叠式LSTM+动态残差模型在预测股票价格上的综合表现最好。特别是当迭代次数增加时,它学习的效率比堆叠式LSTM高出很多。这可能是因为这个模型能够同时捕捉到数据中的复杂模式和简单模式,从而进行更准确的预测。然而,这并不意味着这个模型在所有情况下都会表现最好。在不同的任务和数据集上,不同的模型可能会有不同的表现。因此,选择最适合的模型需要根据具体的任务和数据来决定。

结束语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2776573.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vscode +markdown 的安装和使用

文章目录 前言一、vscode markdown 是什么?1.vscode是什么?2.markdown 是什么? 二、安装步骤1.下载2.安装 三、安装插件1.安装 Markdown All in One2.安装 Markdown Preview Enhanced3. Paste Image v1.0.44.LimfxCodeExv0.7.105.Code Spell …

4.2 Verilog 过程赋值

关键词:阻塞赋值,非阻塞赋值,并行 过程性赋值是在 initial 或 always 语句块里的赋值,赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后,其值将保持不变,直到重新被赋予新值。 连续性赋值总是处…

C语言笔试题之求出二叉树的最大深度(递归解决)

实例要求: 1、给定一个二叉树 root ,返回其最大深度;2、二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数; 案例展示: 实例分析: 1、判断根节点是否为空;2、分别递归处理左…

阿里云幻兽帕鲁服务器有用过的吗?搭建简单啊

玩转幻兽帕鲁服务器,幻兽帕鲁Palworld多人游戏专用服务器一键部署教程,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云百科…

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代,增强现实(AR)技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累,为企业提供了一套创新的AR特效自研AI算法技术解决方案,旨在满足企业在AR领域的多元化需求。…

Mysql-数据库压力测试

安装软件 官方软件 安装插件提供了更多的监听器选项 数据库驱动 数据库测试 配置 这里以一个简单的案例进行,进行连接池为10,20,30的梯度压测: select * from tb_order_item where id 1410932957404114945;新建一个线程组 新增一个连接池配置 新建一…

公众号取关粉丝获取方法1

一、前言 你是不是还在苦恼,每日关注那么多新人,为何同样也会有那么多人取关,到底是哪里出了问题,这样一个困扰公众号主的一个世纪难题,今日小编就要和大家揭晓,当然,这篇文章可能对于不是公众…

JAVA设计模式之享元模式详解

享元模式 1 享元模式介绍 享元模式 (flyweight pattern) 的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。 从这个定义中你可以发现,享元模…

【动态规划】【C++算法】2518. 好分区的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode:2518. 好分区的数目 给你一个正整数数组 nums 和一个整数 k 。 分区 的定义是:将数组划分成两个有序的 组 ,并满足每个元素 恰好 存在于 某一个 组中…

Ribbon全方位解析:构建弹性的Java微服务

第1章 引言 大家好,我是小黑,咱们今天聊聊Ribbon,这货是个客户端负载均衡工具,用在Spring Cloud里面能让咱们的服务调用更加灵活和健壮。负载均衡,听起来挺高大上的,其实就是把外界的请求平摊到多个服务器上,避免某个服务器压力太大,其他的却在那儿闲着。 Ribbon的牛…

SFML(1) | 自由落体小球

SFML(1) | 自由落体小球 文章目录 SFML(1) | 自由落体小球1. 目的2. SFML 适合做图形显示的理由3. 使用 SFML - 构建阶段4. 使用 SFML - C 代码5. 运行效果6. 总结7. References 1. 目的 通过一些简单的例子(2D小游戏的基础代码片段), 来学习…

SECS/GEM300需要实现哪些内容

GEM300实现设备全自动化,也是金南瓜已经全面支持功能,作为国内首家和最好的300mm标准软件。 GEM300包含E4、E5、E30、E37、E39、E40、E84、E87、E90、E94、E116等 CJob全称Conrtol Job 1. 控制设备作业的控制 2. 包括队列、开始、暂停、继续、完成等等…

SpringBoot WebSocket客户端与服务端一对一收发信息

依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类 Configuration public class WebSocketConfig {Bean //方法返回值交…

尚硅谷 Vue3+TypeScript 学习笔记(上)

目录 一、创建Vue3工程 1.1. 【基于 vue-cli 创建】 1.2. 【基于 vite 创建】(推荐) 1.3. 【一个简单的效果】 二、Vue3核心语法 2.1. 【OptionsAPI 与 CompositionAPI】 Options API 的弊端 Composition API 的优势 2.2. 【拉开序幕的 setup】 setup 概述 setup 的…

无人机系统组装与调试,多旋翼无人机组装与调试技术详解,无人机飞控系统原理

多旋翼无人机飞控系统的组装 在开始组装前&#xff0c;确保您已准备好所有必要的工具和材料。这包括螺丝刀、电烙铁、焊台、杜邦线、飞控板、GPS模块、电机、桨叶等。 飞控安装 安全开关安装&#xff0c;将安全开关固定在机架上。将安全开关的线插到飞控SWITCH插口上。 电调…

C语言中的数据类型-强转

强制类型转换 概念&#xff1a;将某种类型的数据转化我们需要的数据类型&#xff0c;注意强制类型转化是临时强转&#xff0c;不会改变本身的数据类型。 强转又分为显式强转和隐式转化 显示强转是按照我们的要求进行转化 格式&#xff1a;(需要转化数据类型)变量名 #inclu…

【新书推荐】7.2节 寄存器寻址方式和直接寻址方式

本节内容&#xff1a;寄存器寻址方式的操作数在CPU内部的寄存器中&#xff0c;指令中指定寄存器号。 ■寄存器寻址方式&#xff1a;16位的寄存器操作数可以是AX、BX、CX、DX、SI、DI、SP、BP共计8个16位通用寄存器&#xff1b;8位寄存器操作数可以是AH、AL、BH、BL、CH、CL、D…

排序算法---归并排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 归并排序是一种常见的排序算法&#xff0c;它采用了分治的思想。它将一个待排序的数组递归地分成两个子数组&#xff0c;分别对两个子数组进行排序&#xff0c;然后将排好序的子数组合并成一个有序数组。 具体的归并排序过…

上位机图像处理和嵌入式模块部署(上位机和下位机通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 一般情况下&#xff0c;如果是纯上位机开发的话&#xff0c;这个时候是不需要上位机和下位机进行通信的。只有上位机做好demo有必要移植到嵌入式模…

Modern C++ 内存篇1 - std::allocator VS pmr

大年三十所写&#xff0c;看到就点个赞吧&#xff01;祝读者们龙年大吉&#xff01;当然有问题欢迎评论指正。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 前言 从今天起我们开始内存相关的话题&#xff0c;内存是个很大的话题&#xff0c;一时不…