机器学习周记(第四十四周:Robformer)2024.6.17~2024.6.23

2024-06-23 16:28

本文主要是介绍机器学习周记(第四十四周:Robformer)2024.6.17~2024.6.23,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 摘要
  • ABSTRACT
  • 1 论文信息
    • 1.1 论文标题
    • 1.2 论文摘要
    • 1.3 论文引言
    • 1.4 论文贡献
  • 2 论文模型
    • 2.1 问题描述
    • 2.2 Robformer
      • 2.2.1 Encoder
      • 2.2.2 Decoder
    • 2.3 鲁棒序列分解模块
    • 2.4 季节性成分调整模块

摘要

本周阅读了一篇利用改进 Transformer 进行长时间序列预测的论文。论文模型为 Robformer ,其主要强调了在长时间序列预测问题上模型的鲁棒性。Robformer 主要包括几个关键模块:Encoder、Decoder、鲁棒序列分解模块、季节性成分调整模块。Encoder 主要侧重于从历史信息中提取周期性依赖关系,以供解码器使用。Decoder 包含两部分:堆叠的自相关机制以获得季节性部分,以及堆叠的稳健趋势预测块用于趋势部分。鲁棒序列分解模块主要提供一种简单且有效的方法来更新内部分解模块,使其能够鲁棒地提取季节性成分。季节性成分调整模块主要作用为进一步确保分解后的季节性成分的鲁棒性。

ABSTRACT

This week, We read a paper on long-term time series forecasting using an improved Transformer model. The model, named Robformer, primarily emphasizes the robustness of the model in long-term time series forecasting problems. Robformer consists of several key modules: the Encoder, the Decoder, the Robust Series Decomposition Module, and the Seasonal Component Adjustment Module. The Encoder mainly focuses on extracting periodic dependencies from historical information for the Decoder. The Decoder contains two parts: stacked Auto-Correlation mechanisms to obtain seasonal components and stacked robust trend forecasting blocks for trend components. The Robust Series Decomposition Module provides a simple and efficient approach to updating the inner decomposition blocks to extract seasonal components robustly. The Seasonal Component Adjustment Module’s main function is to further ensure the robustness of the decomposed seasonal components.

1 论文信息

1.1 论文标题

Robformer: A robust decomposition transformer for long-term time series forecasting

1.2 论文摘要

基于 Transformer 的预测方法已广泛应用于长期多变量时间序列的预测,并在延长预测时间上取得了显著进展。然而,当长期时间序列中出现突发趋势变化和季节波动时,这些方法的性能可能会严重退化。因此,作者确定了以往 Transformer 架构的两个瓶颈:(1) 稳健性较差的分解模块。 (2) 趋势转移问题,这一问题导致了在长期多变量序列预测中趋势预测与真实值之间存在不同的分布。针对这些瓶颈,作者设计了 Robformer,一种新型基于分解的 Transformer,其包括三个新的内部模块,以增强 Transformer 的预测能力。具体而言,作者更新了分解模块,并添加了一个季节性成分调整模块以处理非平稳序列。此外,作者还提出了一种受多项式拟合方法启发的新型内部趋势预测架构,在准确性和鲁棒性方面优于以往的设计。作者的实验研究表明,在六个基准测试上,在公平的长期多变量设置下,Robformer 相比于最先进的 AutoformerFEDformer 基线分别实现了 17% 和 10% 的相对改进,这些基准测试涵盖了能源、经济、交通、天气和疾病五大主流时间序列预测应用。

1.3 论文引言

长期多变量时间序列预测(LTTF)问题旨在输出比已知序列长度多几倍的预测序列,这在许多领域如金融、能源或天气中都很常见。最近的相关研究中,引入了 Transformers 以利用其自注意机制捕捉时间点之间复杂的依赖关系,并实现长期预测。为了应对 Transformers 在计算时间和内存方面的高消耗,一些基于 Transformer 的预测模型利用稀疏自注意机制来减少计算消耗,例如 ProbSparse 自注意因果卷积自注意局部敏感哈希注意力。然而,这些方法会离散化时间序列的连续空间模式,并遗忘一些时间信息。由于合理的分解过程可以有效地理清纠缠的时间模式,这可以促进模型准确预测,基于 Transformer 的方法 AutoformerFEDformer 利用基于简单平滑移动平均方法的内部分解模块来捕捉时间依赖关系,同时保持在 ( L log ⁡ L ) (L \log L) (LlogL) 程度的复杂性。

然而,基于分解的 Transformers 仍面临一些瓶颈,例如在预测现实世界多变量时间序列时的分布转换问题。此外,一些单变量预测模型声称它们在长期单变量序列预测任务中已取得了与 Transformer 相当的结果。尽管如此,Transformers 在长期多变量时间序列预测中真的不有效吗?
在这里插入图片描述

Fig.1 ETTh2数据集上Autoformer的预测输出和真实值之间的趋势变化示意图

为了回答这个问题,Non-stationary TransformersRevIN 提出了类似于预处理的平稳化和去平稳化模块,从提高数据可预测性的角度来提升 Transformer 的性能。类似地,PatchTST 将时间序列分割成序列级别的补丁,在输入之前帮助 Transformer 提取时间依赖性,这类似于标记化方法。然而,从 Transformer 架构的角度来看,使其在现实世界的时间序列上更具鲁棒性仍然是一个具有挑战性的问题。

在实验中,作者观察到基于分解的 Transformers 架构中存在两个主要瓶颈。首先,简单的移动平均方法不足以应对趋势和周期项的突发波动和变化,特别是被异常值误导时,而传统的分解解决方案由于计算复杂度的指数增长,很难应用于内部分解模块。其次,先前的基于分解的 Transformers 很难学习时间序列中的长期趋势模式。作者在 ETTh2 数据集上比较了 Autoformer 的预测结果和真实值,如图1所示,可以发现预测的趋势和实际的趋势之间存在巨大的差距。作者进一步进行了实验,发现先前的基于分解的 Transformer 随着回溯窗口大小的增加,预测误差并没有减少。后续分析显示,这是因为它们使用输入序列的平均值作为未来趋势组件的水平,当未来趋势与输入序列的平均值不一致时,会带来错误的趋势预测。同时,当历史和预测序列的长度增加时,时间序列中包含的长期趋势模式将被揭示,这需要模型具有捕捉多个趋势模式的能力。因此,如何鲁棒地分解时间序列并增强学习多种趋势模式的能力被证明是基于分解的 Transformers 进一步提升预测性能的瓶颈。

基于此,作者尝试超越基于分解的 Transformer,并提出了一种新的端到端鲁棒 Transformer,简称 Robformer,以便在不进行预处理的情况下处理长期时间序列预测。Robformer 仍然遵循编码器-解码器结构,并采用自相关机制,但创新性地加入了鲁棒分解块和季节性组件调整块作为内部操作,以实现更好的分解。所提出的新型鲁棒分解块简单但高效,且具有低计算复杂度。Robformer 还引入了具有双残差结构的鲁棒趋势预测块,以取代原有的趋势预测方法,在具有剧烈趋势组件波动的短期内显示出更好的性能。Robformer 保持了原始 ( L log ⁡ L ) (L \log L) (LlogL) 级别的复杂度,并且可以推广到其他基于分解的 Transformers,以进一步改进基础模型。作者的 Robformer 在几乎所有六个多变量真实世界基准上都达到了最先进的准确性。

1.4 论文贡献

① 提出了鲁棒分解架构和季节性组件调整块,以减轻趋势和周期项的突发波动和变化对长期预测的影响。

② 提出了鲁棒趋势预测块来提取长期时间序列的多种趋势模式,显示出比之前的趋势预测块更强的学习能力。这些提出的块可以应用于任何基于分解的 Transformer 模型,以提升其在长期时间序列预测任务(LTTF)中的性能。

2 论文模型

2.1 问题描述

给定具有 C( C ≥ 1 C\geq1 C1) 个变量的历史时间序列数据 H = { X 1 t , . . . , X C t } t = 1 L H = \{ X^{t}_{1},...,X^{t}_{C} \}^{L}_{t=1} H={X1t,...,XCt}t=1L,其中 L 是输入序列的长度, X i t X^{t}_{i} Xit 是第 i 个变量在第 t 个时间步上的观测值。时间序列预测问题主要是预测序列在未来 T 个时间步上的值,即 H ^ = { X 1 t ^ , . . . , X C t ^ } t = L + 1 L + T \widehat{H} = \{ \widehat{X^{t}_{1}},...,\widehat{X^{t}_{C}} \}^{L+T}_{t=L+1} H ={X1t ,...,XCt }t=L+1L+T,输入 L 预测 T。在 LTTF 条件下,L<<T。

2.2 Robformer

作者将基于分解的 Transformer 改造为更为鲁棒的深度预测模型(如图2所示),包括鲁棒序列分解块(RobDecomp)季节性成分调整块(SAB) 和解码器中的鲁棒趋势预测块(RobTF)
在这里插入图片描述

Fig.2 Robformer

N 个编码器的输入是过去 L 个时间步长 H e n ∈ R L × d H_{en}\in \R ^{L \times d} HenRL×d,而 M 个解码器的输入是包含季节性部分 H d e s ∈ R ( L 2 + T ) × d H_{des} \in \R^{(\frac{L}{2}+T)\times d} HdesR(2L+T)×d 和趋势部分 H d e t ∈ R ( L 2 ) × d H_{det} \in \R^{(\frac{L}{2})\times d} HdetR(2L)×d 的分解序列。按照之前的工作,解码器的季节性部分输入包括两部分:从编码器输入 H e n H_{en} Hen 的后半部分分解出来的部分,长度为 L 2 \frac{L}{2} 2L,这部分输入可以提供过去信息;以及长度为 T 的填充标量的掩码输入。然而,与用 H e n H_{en} Hen 的平均值填充趋势部分输入不同,作者直接将长度为 L 2 \frac{L}{2} 2L 的趋势部分 H d e t H_{det} Hdet 输入到解码器中。公式如下:
H e n s , H e n t = RobDecomp ( H e n L 2 : L ) , H e n s a d j = SAB ( H e n s ) , H d e s = Concat ( H e n s a d j , H 0 ) , H d e t = H e n t , H_{ens},H_{ent}=\textup{RobDecomp}(H_{en \frac{L}{2}:L}),\\ H_{ensadj}=\textup{SAB}(H_{ens}),\\ H_{des}=\textup{Concat} (H_{ensadj},H_{0}), H_{det}=H_{ent}, Hens,Hent=RobDecomp(Hen2L:L),Hensadj=SAB(Hens),Hdes=Concat(Hensadj,H0),Hdet=Hent,
其中 H e n s , H e n t ∈ R ( L 2 ) × d H_{ens},H_{ent} \in \R^{(\frac{L}{2})\times d} Hens,HentR(2L)×d 表示 H e n H_{en} Hen 分解的季节性和趋势部分 H 0 ∈ R T × d H_{0} \in \R ^{T \times d} H0RT×d 表示填充为零的占位符。

2.2.1 Encoder

编码器主要侧重于从历史信息中提取周期性依赖关系,以供解码器使用。对于 N 个编码器层,第 l l l 个编码器层的方程可总结为 H e n l = Encoder ( H e n l − 1 ) H_{en}^{l}=\textup{Encoder}(H_{en}^{l-1}) Henl=Encoder(Henl1)。详细的方程形式化为:
g e n l , 1 , _ = RobDecomp ( AutoCorrelation ( H e n l − 1 ) + H e n l − 1 ) , g e n l , 2 , _ = RobDecomp ( FeedForward ( g e n l , 1 ) + g e n l , 1 ) , g_{en}^{l,1},\_ = \textup{RobDecomp}(\textup{AutoCorrelation}(H_{en}^{l-1})+H_{en}^{l-1}),\\ g_{en}^{l,2},\_ = \textup{RobDecomp}(\textup{FeedForward}(g_{en}^{l,1})+g_{en}^{l,1}), genl,1,_=RobDecomp(AutoCorrelation(Henl1)+Henl1),genl,2,_=RobDecomp(FeedForward(genl,1)+genl,1),
其中“_”表示不必要的部分。 H e n l = g e n l , 2 , l ∈ { 1 , . . . , N } H_{en}^{l}=g_{en}^{l,2},l \in \{ 1,...,N \} Henl=genl,2,l{1,...,N} 表示第 l l l 个编码器层的输出, AutoCorrelation ( ⋅ ) \textup{AutoCorrelation}(\cdot) AutoCorrelation() 表示 Autoformer 中提出的自相关机制,该机制可以有效发现基于周期的依赖关系,以取代原来的自注意力机制。

2.2.2 Decoder

解码器包含两部分:堆叠的自相关机制以获得季节性部分,以及堆叠的稳健趋势预测块用于趋势部分。假设有 M 个解码器层,第 l l l 个解码器层的方程可以总结为 H d e l = Decoder ( H d e l − 1 , H e n N ) H_{de}^{l}=\textup{Decoder}(H_{de}^{l-1},H_{en}^{N}) Hdel=Decoder(Hdel1,HenN) Decoder ( ⋅ ) \textup{Decoder}(\cdot) Decoder() 形式化为:
g d e l , 1 , _ = RobDecomp ( AutoCorrelation ( H d e l − 1 ) + H d e l − 1 ) , g d e l , 2 , _ = RobDecomp ( AutoCorrelation ( g d e l , 1 , H e n N ) + g d e l , 1 ) , g d e l , 3 , _ = RobDecomp ( FeedForward ( g d e l , 2 ) + g d e l , 2 ) , G d e = RobTF ( H d e t ) , g_{de}^{l,1},\_ = \textup{RobDecomp}(\textup{AutoCorrelation}(H_{de}^{l-1})+H_{de}^{l-1}),\\ g_{de}^{l,2},\_ = \textup{RobDecomp}(\textup{AutoCorrelation}(g_{de}^{l,1},H_{en}^{N})+g_{de}^{l,1}),\\ g_{de}^{l,3},\_ = \textup{RobDecomp}(\textup{FeedForward}(g_{de}^{l,2})+g_{de}^{l,2}),\\ G_{de}=\textup{RobTF}(H_{det}), gdel,1,_=RobDecomp(AutoCorrelation(Hdel1)+Hdel1),gdel,2,_=RobDecomp(AutoCorrelation(gdel,1,HenN)+gdel,1),gdel,3,_=RobDecomp(FeedForward(gdel,2)+gdel,2),Gde=RobTF(Hdet),
其中 H d e l = g d e l , 3 , l ∈ { 1 , . . . , M } H_{de}^{l}=g_{de}^{l,3},l \in \{ 1,...,M \} Hdel=gdel,3,l{1,...,M} 表示第 l l l 个解码器层的输出, H d e 0 H_{de}^{0} Hde0 表示嵌入的 H d e s H_{des} Hdes g d e l , i , i ∈ { 1 , 2 , 3 } g_{de}^{l,i},i \in \{ 1,2,3 \} gdel,i,i{1,2,3} 对应于第 l l l 层中第 i i i 个稳健分解块后的季节性部分。 G d e G_{de} Gde 表示解码器的输出。注意, RobTF ( ⋅ ) \textup{RobTF}(\cdot) RobTF() 表示模型的稳健趋势预测块。

最终预测是两个分解成分的总和: W g ∗ H d e M + G d e W_{g}*H_{de}^{M}+G_{de} WgHdeM+Gde,其中 W g W_{g} Wg 表示季节性部分的简单映射。

2.3 鲁棒序列分解模块

正如在前文中提到的,简单的移动平均方法难以处理突然的趋势变化和季节性干扰问题,如图2所示。为了解决这个困境,作者尝试提出一种简单且有效的方法来更新内部分解模块,使其能够稳健地提取季节性成分。作者在分解模块中加入二阶差分算子,使模型能够自动学习如何平滑具有突变波动的分解趋势成分。具体来说,作者对每个输入序列采用二阶移动平均。对于长度为 L 的输入序列 H ∈ R L × d H \in \R ^{L \times d} HRL×d,其处理过程为:
H t = λ 1 ∗ AvgPool ( Padding ( H ) ) + λ 2 ∗ AvgPool ( Padding ( AvgPool ( Padding ( H ) ) ) ) , λ 1 , λ 2 = Softmax ( L ( H ) ) , H s = H − H t , H_{t}=\lambda_{1} * \textup{AvgPool}(\textup{Padding}(H))+\lambda_{2} *\textup{AvgPool}(\textup{Padding}(\textup{AvgPool}(\textup{Padding}(H)))),\\ \lambda_{1},\lambda_{2}=\textup{Softmax}(L(H)),\\ H_{s}=H-H_{t}, Ht=λ1AvgPool(Padding(H))+λ2AvgPool(Padding(AvgPool(Padding(H)))),λ1,λ2=Softmax(L(H)),Hs=HHt,
其中, H s , H t ∈ R L × d H_{s},H_{t}\in \R^{L \times d} Hs,HtRL×d 分别表示季节性和趋势循环部分,每个部分都包含部分残余噪声。 λ 1 , λ 2 \lambda_{1},\lambda_{2} λ1,λ2 是基于输入序列由线性映射层 L ( H ) \textup{L}(H) L(H) 自动学习并通过 softmax 函数 Softmax ( ⋅ ) \textup{Softmax}(\cdot) Softmax() 转换为概率分布的权重。通过这种方式,这些模块可以实现相同的平滑效果。

此外,考虑到时间序列可能会与多个季节性模式耦合,这可能会扰乱去趋势过程,可以利用加权移动平均方法来消除这些影响。这种方法还可以使分解后的成分更加平滑。需要注意的是,所有权重的总和应为1。类似于 FEDformer 中的 MOEDecomp 模块,对于可能存在的多个季节性模式 { τ 1 , τ 2 , . . . , τ k } \{ \tau_{1},\tau_{2},...,\tau_{k} \} {τ1,τ2,...,τk},有 k 平均滤波器,其核大小分别为 { τ 1 , τ 2 , . . . , τ k } \{ \tau_{1},\tau_{2},...,\tau_{k} \} {τ1,τ2,...,τk}。形式上,该模块可以表示为:
H t = ∑ k = 1 K ω τ k ( H t ) τ k , ω τ 1 , . . . , ω τ k = Softmax ( L ( H ) ) , H s = H − H t H_{t}=\sum_{k=1}^{K}\omega_{\tau_{k}}(H_{t})_{\tau_{k}}, \\ \omega_{\tau_{1}},...,\omega_{\tau_{k}} = \textup{Softmax}(L(H)), \\ H_{s}=H-H_{t} Ht=k=1Kωτk(Ht)τk,ωτ1,...,ωτk=Softmax(L(H)),Hs=HHt
其中, ( H t ) τ k (H_{t})_{\tau_{k}} (Ht)τk 表示核大小为 τ k \tau_{k} τk 的趋势成分, Softmax ( L ( H ) ) \textup{Softmax}(L(H)) Softmax(L(H)) 是从输入中学习到的用于混合这些提取的趋势成分的权重。详细过程见算法1。
在这里插入图片描述

Algorithm 1

2.4 季节性成分调整模块

如图 2 所示,作者提出了季节性成分调整模块,以进一步确保分解后的季节性成分的鲁棒性。

前文中提出的Robdecomp模块可以在一定程度上缓解分布偏移问题。然而,去除趋势成分后, H s H_{s} Hs 可以被视为“污染的季节性成分”,因为它可能受到各种类型的噪声或异常值的污染。这是因为没有进行噪声去除或异常检测的预处理操作。一般来说,传统的解决方法是通过使用平均季节性模式来调整季节性成分以去除水平偏移。然而,现实世界中的季节性成分通常在幅度和相位上不规则地变化,这意味着以往的方法会导致对季节性成分中复杂信息的忽略。

为了在不牺牲信息利用的情况下提取稳健的季节性成分,作者提出通过逐步学习数据依赖的权重来调整“污染的季节性成分”,以调整季节性成分中相同相位位置的观测值。

首先,假设 T T T 是周期长度,注意如果有多个潜在的周期长度,选择最大的一个。数学上,对于分解后的季节性序列 { ( H s ) 1 , H s ) 2 , . . . , H s ) N } \{ (H_{s})_{1},H_{s})_{2},...,H_{s})_{N} \} {(Hs)1,Hs)2,...,Hs)N},可以按如下方式调整序列:
H ~ = { ( H s ) N N ≦ T ∑ k = 0 K ω τ k ( H s ) N − k T N > T , ω τ 0 , . . . , ω τ k = Softmax ( L ( H ) ) , \widetilde{H} = \begin{cases} (H_{s})_{N} &\text{} N \leqq T \\ \sum_{k=0}^{K}\omega_{\tau_{k}}(H_{s})_{N-kT} &\text{} N \gt T, \end{cases}\\ \omega_{\tau_{0}},...,\omega_{\tau_{k}}=\textup{Softmax}(L(H)), H ={(Hs)Nk=0Kωτk(Hs)NkTNTN>T,ωτ0,...,ωτk=Softmax(L(H)),
其中, H ~ \widetilde{H} H 是调整后的季节性成分, Softmax ( L ( H ) ) \textup{Softmax}(L(H)) Softmax(L(H)) 是用于组合相关观测值以调整分解后的季节性序列中每个值的可学习权重。需要注意的是,在 LTTF 条件下,输入序列 N 的长度通常接近周期长度,因此可以根据编码器或解码器中的分解块数量来等分 T,以提高该方法的可用性,因为移动平均法具有叠加效果。这意味着,如果解码器中的分解块数量为 M,可以使用 ⌈ T / M ⌉ \lceil T/M \rceil T/M 而不是参数T来调整季节性成分。详细描述可以见算法2。
在这里插入图片描述

Algorithm 2

受益于对相同相位位置观测值的约束,季节性成分调整模块可以在一定程度上减轻水平偏移和异常值的干扰,从而使 Transformer 能够进行更准确的预测。
在这里插入图片描述

Fig.3 RobTF block

这篇关于机器学习周记(第四十四周:Robformer)2024.6.17~2024.6.23的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087675

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘