【机器学习】数据变换---小波变换特征提取及应用案列介绍

news2024/11/23 11:30:08

引言

  在机器学习领域,数据变换是一种常见且重要的预处理步骤。通过对原始数据进行变换,我们可以提取出更有意义的特征,提高模型的性能。在众多数据变换方法中,小波变换是一种非常有效的方法,尤其适用于处理非平稳信号和时频分析。本文将详细介绍小波变换的数学原理及其在特征提取中的应用。

一、小波变换的介绍

  小波变换作为一种前沿的数据分析工具,近年来在信号分析领域崭露头角。小波分析的理论和方法凭借其独特优势,在信号处理、图像处理、语音处理、模式识别以及量子物理等多个领域得到了广泛的应用,堪称近年来在工具及方法上的重大突破。小波变换以其多分辨率的特性,在时域和频域均展现出对信号局部特征的强大表征能力。通过伸缩和平移等运算过程,小波变换能够对信号进行多尺度聚焦分析,为非平稳信号的时频分析提供了一种有效手段。它允许我们由粗及细地逐步观察信号,从而精准地提取出有用信息。

  小波变换作为一种信号分析方法,其核心思想在于将信号分解为一系列小波函数的叠加。小波函数是一类具有有限支撑集、在正负之间振荡的波形,其特性使得小波变换能够在时域和频域同时提供局部化信息,从而更加适用于非平稳信号的处理。在实际问题中,特征量往往隐含在信号的某个或某些分量中,小波变换通过分解非平稳信号为表达不同层次、不同频带信息的数据序列,即小波系数,从而实现对信号的特征提取。

  具体而言,小波变换的基本思想涉及信号与小波函数的内积运算。这一运算过程能够生成不同尺度下的小波系数,这些系数反映了信号在不同尺度和位置上的特征。通过精心选择小波函数和尺度参数,我们能够对信号进行多尺度分析,深入揭示信号中隐藏的结构信息。这一特性使得小波变换在信号分析领域具有独特的优势,为信号处理提供了新的视角和工具。

二、基于小波变换的特征提取方法 [ 1 ] ^{[1]} [1]

  基于小波变换的特征提取方法主要有:基于小波变换的多尺度空间能量分布特征提基于小波变换的多尺度空间的模极大值特征提取、基于小波包变换的特征提取、基于适应性小波神经网络的特征提取,详见下表:

基于小波变换的特征提取方法 \bold{基于小波变换的特征提取方法} 基于小波变换的特征提取方法

基于小波变换的特征提取方法方法描述
基于小波变换的多尺度空间能量分布特征提取方法各尺度空间内的平滑信号和细节信号能提供原始信号的时频局域信息,特别是能提供不同频段上信号的构成信息。把不同分解尺度上信号的能量求解出来,就可以将这些能量尺度顺序排列,形成特征向量供识别用
基于小波变换的多尺度空间的模极大值特征提取方法利用小波变换的信号局域化分析能力,求解小波变换的模极大值特性来检测信号的局部奇异性,将小波变换模极大值的尺度参数s、平移参数及其幅值作为目标的特征量
基于小波包变换的特征提取方法利用小波分解,可将时域随机信号序列映射为尺度域各子空间内的随机系数序列,按小波包分解得到的最佳子空间内随机系数序列的不确定性程度最低,将最佳子空间的熵值及最佳子空间在完整二叉树中的位置参数作为特征量,可以用于目标识别
基于适应性小波神经网络的特征提取方法基于适应性小波神经网络的特征提取方法可以把信号通过分析小波拟合表示,进行特征提取

  在机器学习中,特征提取是一个关键步骤。通过特征提取,我们可以从原始数据中提取出有意义的特征,为模型训练提供有力的支持。小波变换作为一种有效的数据变换方法,可以用于特征提取。

  基于小波变换的特征提取通常包括以下步骤:

  • 选择合适的小波函数和尺度参数。不同的小波函数和尺度参数会对特征提取结果产生不同的影响。因此,在实际应用中,我们需要根据具体任务和数据特点选择合适的小波函数和尺度参数。

  • 对原始信号进行小波变换。通过计算信号与小波函数的内积,得到不同尺度下的小波系数。

  • 提取小波系数作为特征。根据任务需求,我们可以选择部分或全部小波系数作为特征。这些特征可以用于后续的机器学习模型训练。

  • 对特征进行进一步处理。为了提高模型的性能,我们可以对提取出的小波系数进行进一步处理,如降维、归一化等。

2.1 小波基函数

  小波基函数是一种具有局部支集的函数,并且平均值为0,小波基函数满足 ψ ( 0 ) = ∫ ψ ( t ) d t \psi(0)= \begin{aligned} \int \psi(t) \mathrm{d} t \end{aligned} ψ(0)=ψ(t)dt常用的小波基有Haar小波基、db系列小波基等。Haar小波函数如下图所示。
在这里插入图片描述

2.2 小波变换

  对小波基函数进行伸缩和平移变换:
ψ a , b ( t ) = 1 ∣ a ∣ ψ ( t − τ a ) \psi_{a,b}(t) = \frac{1}{\sqrt{|a|}} \psi(\frac{t-\tau}{a}) ψa,b(t)=a 1ψ(atτ)
  其中, a a a为伸缩因子, τ \tau τ为平移因子。
  任意函数 f ( t ) f(t) f(t)的连续小波变换(CWT)为:
W f ( a , b ) = ∣ a ∣ − 1 / 2 ∫ f ( t ) ψ ( t − τ a ) d t W_f(a,b)=|a|^{-1/2}\begin{aligned} \int f(t) \psi(\frac{t-\tau}{a}) \mathrm{d} t \end{aligned} Wf(a,b)=a1/2f(t)ψ(atτ)dt
  可知,连续小波变换为 f ( t ) → W f ( a , τ ) f(t) \rightarrow W_f(a,\tau) f(t)Wf(a,τ)的映射,对小波基函数 ψ ( t ) \psi(t) ψ(t)增加约束条件 C ψ = ∫ ∣ ψ ( t ) ^ ∣ 2 t d t < ∞ C_\psi=\begin{aligned} \int \frac{|\hat{\psi(t)}|^{2}}{t} \mathrm{d} t \end{aligned} < \infty Cψ=tψ(t)^2dt<,就可以由 W f ( a , τ ) W_f(a,\tau) Wf(a,τ)逆变换到 f ( t ) f(t) f(t)。其中 ψ ( t ) ^ \hat{\psi(t)} ψ(t)^ ψ ( t ) \psi(t) ψ(t)的傅里叶变换(后续文章中将会继续介绍傅里叶变换)。

f ( t ) = 1 ψ ( t ) ∫ ∫ 1 a 2 W f ( a , τ ) ψ ( t − b a ) d a ⋅ d τ f(t) = \frac{1}{\psi(t)} \int\int{\frac{1}{a^2}W_f(a,\tau)\psi(\frac{t-b}{a}) \mathrm{d} a \cdot \mathrm{d} \tau } f(t)=ψ(t)1∫∫a21Wf(a,τ)ψ(atb)dadτ
  简而言之,小波变换采用了可伸缩和平移的基函数,其实质上是由两个正交基进行分解构成。当基函数被压缩至较窄的形态时,它主要对应于信号中的高频成分;而当基函数展宽时,则更多地与信号的低频成分相对应。在变换过程中,这个基函数会与原始信号进行连续相乘运算。在特定的尺度(即基函数的宽窄程度)下,相乘的结果反映了信号在该尺度下所包含的对应频率成分的量级。在某些尺度下,基函数与信号之间可能存在较大的重叠,从而导致相乘的结果值较大。这种重叠关系实际上揭示了信号中包含该频率成分的程度。因此,通过观察不同尺度下的乘积结果,我们可以准确地了解信号中不同频率成分的分布情况。与传统的傅里叶变换相比,小波变换的一个显著改进在于它采用了有限长度且会衰减的小波基,替代了无限长的三角函数基。这种改变使得小波变换在分析非平稳信号和局部特征时具有更高的精度和灵活性。效果如下图
在这里插入图片描述
从公式可以看出,不同于傅里叶变换,变量只有频率ω,小波变换有两个变量:尺度 a a a(scale)和平移量 τ \tau τ(translation)。尺度 a a a控制小波函数的伸缩,平移量 τ控制小波函数的平移。尺度就对应于频率(反比),平移量 τ \tau τ就对应于时间。如下图
在这里插入图片描述
当伸缩、平移到这么一种重合情况时,也会相乘得到一个大的值。这时候和傅里叶变换不同的是,这不仅可以知道信号有这样频率的成分,而且知道它在时域上存在的具体位置。

三 、 基于小波变换的特征提取案例

  在 Python中,Scipy本身提供了一些信号处理函数,但不够全面,而更好的信号处理库是PyWavelets (pywt)。在本案例中,我们将使用Python语言以及pywt库来展示基于小波变换的特征提取过程。我们将使用一个简单的信号数据集,对其进行小波变换,并提取特征。

  首先,请确保已经安装了pywt库。如果尚未安装,可以使用以下命令进行安装:

pip install PyWavelets

  接下来是Python代码实现:

import numpy as np  
import matplotlib.pyplot as plt  
import pywt  


  
# 创建一个简单的信号数据  
# 这里我们使用一个包含正弦波和噪声的信号作为示例  
t = np.linspace(0, 1, num=500)  
signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 12 * t) + 0.1 * np.random.randn(500)  
  
# 选择小波函数和分解层级  
wavelet = 'db4'  # 选择Daubechies小波系中的'db1'  
level = 5  # 分解层级  
  
# 执行小波变换  
coeffs = pywt.wavedec(signal, wavelet, level=level)  
cA, cD = coeffs[0], coeffs[1:]  # 分离近似系数和细节系数  
  
#计算小波系数的能量
energy = [np.sum(np.square(i)) for i in coeffs]
#计算小波系数标准差
std = [np.std(i) for i in coeffs]
#计算小波系数的均值
mean = [np.mean(i) for i in coeffs]
#将计算得到的特征值组合成一个特征向量
feature_vector = np.concatenate((energy,std,mean))
# 接下来,可以使用这些特征进行机器学习任务,如分类、回归等  
# 这里仅展示特征提取过程,因此省略了机器学习模型的训练和评估步骤

  在这个案例中,我们首先创建了一个包含正弦波和噪声的信号。然后,我们使用pywt.wavedec函数执行小波变换,并分离出近似系数和细节系数。我们选择db4小波函数和5层分解作为示例。细节系数cD包含了信号在不同尺度上的高频信息,这些信息可以被用作特征。在这个简单的例子中,我们简单地将所有细节系数连接成一个一维数组作为特征。

四、小波变换在机器学习中的应用场景

  小波变换在机器学习领域有着广泛的应用。以下是一些典型的应用场景:

  • 信号处理与分类:在信号处理领域,小波变换可以用于提取信号中的特征,进而实现信号的分类。例如,在语音识别、图像识别等任务中,小波变换可以有效地提取出音频或图像的局部特征,提高分类性能。

  • 故障诊断与健康监测:在工业领域,小波变换可以用于设备故障诊断和健康监测。通过对设备振动信号进行小波变换,我们可以提取出与故障相关的特征,实现故障的早期预警和定位。

  • 金融数据分析:在金融领域,小波变换可以用于分析股票价格、汇率等金融数据的波动特性。通过提取金融数据中的多尺度特征,我们可以更好地预测市场趋势和制定投资策略。

五、小波变换在机器学习中的应用场景——信号处理与分类

  小波变换是一种信号处理技术,它能够在时域和频域中同时提供信号的局部化信息。在机器学习中,小波变换常用于信号预处理,特别是在处理非平稳信号时,如生物医学信号、音频信号等。通过小波变换,我们可以提取信号的特征,进而用于分类、识别等任务。

  下面是一个简单的案例,展示了如何使用小波变换对信号进行预处理,并结合机器学习算法进行分类。

案例:基于小波变换的心电图信号分类

  假设我们有一组心电图(ECG)信号数据,需要将其分类为正常或异常。我们可以使用小波变换提取信号的特征,然后利用这些特征训练一个分类器。这个案例展示了如何使用小波变换对ECG信号进行特征提取,并使用SVM进行分类。在实际应用中,你可能需要根据具体的数据和任务调整小波基函数、分解层数、特征选择以及分类器的参数。此外,还可以考虑使用更复杂的特征提取方法(如基于小波包的变换)和机器学习算法(如深度学习模型)来提高分类性能。

步骤 1:导入必要的库
import numpy as np
import pywt  # 小波变换库
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC  # 支持向量机分类器
from sklearn.metrics import accuracy_score

import matplotlib.pyplot as plt
步骤 2:加载和预处理数据

  由于实际的心电图信号和标签通常是通过专业设备采集和标注的,为了演示目的,我会生成一些模拟的ECG信号和对应的标签。请注意,这些信号并不代表现实生活中的真实ECG数据,而仅用于演示代码。这里假设我们已经有了一个包含ECG信号的NumPy数组ecg_signals,以及对应的标签数组labels(0表示正常,1表示异常)

  以下是一组模拟的ECG信号和标签:

import numpy as np
import matplotlib.pyplot as plt

# 生成模拟的ECG信号
np.random.seed(42)  # 为了可重复性设置随机种子
fs = 360  # 采样频率(Hz)
t = np.arange(0, 10, 1/fs)  # 时间向量
ecg_signals = []
for _ in range(100):  # 生成100个模拟信号
    # 使用正弦波模拟ECG信号的基本形状
    signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 12 * t)
    # 添加一些噪声
    noise = 0.1 * np.random.randn(len(t))
    signal += noise
    ecg_signals.append(signal)

# 将信号转换为NumPy数组
ecg_signals = np.array(ecg_signals)

# 生成对应的标签(这里简单地将前50个标签设为0,后50个设为1)
labels = np.concatenate([np.zeros(50), np.ones(50)])

# 可视化一些随机选择的信号(可选)
plt.figure(figsize=(10, 6))
for i in np.random.choice(range(100), 10, replace=False):
    plt.plot(t, ecg_signals[i], label=f'Signal {i}')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Simulated ECG Signals')
plt.legend()
plt.show()

在这里插入图片描述

步骤 3:应用小波变换提取特征

  我们可以选择一种小波基函数(如’db1’),并指定分解的层数。然后,对每个信号应用小波变换,并提取某些层的系数作为特征。

wavelet = 'db1'  # 选择小波基函数
level = 5  # 分解层数

# 初始化特征数组
features = []

for signal in ecg_signals:
    coeffs = pywt.wavedec(signal, wavelet, level=level)  # 小波分解
    # 提取某些层的系数作为特征,这里我们选择最后一层的近似系数和细节系数
    feature = np.concatenate([coeffs[-1], coeffs[:-1]])
    features.append(feature)

# 将特征数组转换为NumPy数组
features = np.array(features)
步骤 4:划分训练集和测试集
###这里去除一些信号
features = features[:-6]    #这里需要将ndarray嵌套的情况清洗出来,我们这里直接删除处理
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
步骤 5:训练分类器

  这里我们使用支持向量机(SVM)作为分类器。当然,你也可以尝试其他机器学习算法。

clf = SVC(kernel='linear', C=1.0, random_state=42)
clf.fit(X_train, y_train)
步骤 6:评估分类器性能
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

  这个案例展示了如何使用小波变换对ECG信号进行特征提取,并使用SVM进行分类。在实际应用中,你可能需要根据具体的数据和任务调整小波基函数、分解层数、特征选择以及分类器的参数。此外,还可以考虑使用更复杂的特征提取方法(如基于小波包的变换)和机器学习算法(如深度学习模型)来提高分类性能。

完整代码

import numpy as np
import pywt  # 小波变换库
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC  # 支持向量机分类器
from sklearn.metrics import accuracy_score

import matplotlib.pyplot as plt

# 生成模拟的ECG信号
np.random.seed(42)  # 为了可重复性设置随机种子
fs = 360  # 采样频率(Hz)
t = np.arange(0, 10, 1/fs)  # 时间向量
ecg_signals = []
for _ in range(100):  # 生成100个模拟信号
    # 使用正弦波模拟ECG信号的基本形状
    signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 12 * t)
    # 添加一些噪声
    noise = 0.1 * np.random.randn(len(t))
    signal += noise
    ecg_signals.append(signal)

# 将信号转换为NumPy数组
ecg_signals = np.array(ecg_signals)

# 生成对应的标签(这里简单地将前50个标签设为0,后50个设为1)
labels = np.concatenate([np.zeros(50), np.ones(50)])

# 可视化一些随机选择的信号(可选)
plt.figure(figsize=(10, 6))
for i in np.random.choice(range(100), 10, replace=False):
    plt.plot(t, ecg_signals[i], label=f'Signal {i}')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Simulated ECG Signals')
plt.legend()
plt.show()

wavelet = 'db1'  # 选择小波基函数
level = 5  # 分解层数

# 初始化特征数组
features = []

for signal in ecg_signals:
    coeffs = pywt.wavedec(signal, wavelet, level=level)  # 小波分解
    # 提取某些层的系数作为特征,这里我们选择最后一层的近似系数和细节系数
    feature = np.concatenate([coeffs[-1], coeffs[:-1]])
    features.append(feature)

# 将特征数组转换为NumPy数组
features = np.array(features)

#这里需要将ndarray嵌套的情况清洗出来,我们这里直接删除处理
features = features[:,:-6]
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

clf = SVC(kernel='linear', C=1.0, random_state=42)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

结论

  小波变换作为一种有效的数据变换方法,在机器学习领域具有广泛的应用前景。通过深入了解小波变换的数学原理和特征提取方法,我们可以更好地利用小波变换来处理和分析数据,提高机器学习模型的性能。在实际应用中,我们需要根据具体任务和数据特点选择合适的小波函数和尺度参数,以充分发挥小波变换的优势。

文献

  [1]黄恒秋,张良均,谭立云.Python金融数据分析与挖掘实战[M].人民邮电出版社,2020.

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

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

相关文章

会话seesion的使用,结合ddddocr识别简单验证码的登录实现。

古诗文网登录代码&#xff1a; # 古诗文网登录实战 # 验证码链接:https://so.gushiwen.cn/RandCode.ashx # 变动参数链接:__VIEWSTATE所在的地址:https://so.gushiwen.cn/user/login.aspx?fromhttp://so.gushiwen.cn/user/collect.aspx # 登录接口链接:https://so.gushiwen.c…

npx\pnpm 镜像过期解决方法

. // 1. 清空缓存 npm cache clean --force // 2. 关闭SSL验证 npm config set strict-ssl false // 3. 安装 到这里就可以正常使用npm命令安装需要的工具了。如( npm install -g cnpm )

代码学习记录48---单调栈

随想录日记part48 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.19 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;503.下一个更大元素II ;42. 接雨水 503.下一个更大元素II 42. 接雨水 Topic1下一个更…

第二部分 Python提高—GUI图形用户界面编程(六)

其他组件学习 文章目录 OptionMenu 选择项Scale 移动滑块颜色选择框文件对话框简单输入对话框通用消息框ttk 子模块控件 OptionMenu 选择项 OptionMenu(选择项)用来做多选一&#xff0c;选中的项在顶部显示。显示效果如下&#xff1a; from tkinter import * root Tk();ro…

电弧的产生机理

目录&#xff1a; 1、起弧机理 2、电弧特点 3、电弧放电特点 4、实际意义 1&#xff09;电力开关装置 2&#xff09;保险丝 1、起弧机理 电弧的本质是一种气体放电现象&#xff0c;可以理解为绝缘情况下产生的高强度瞬时电流。起弧效果如下图所示&#xff1a; 在电场的…

5 CatBoost模型

目录 1 背景 2 原理 2.1 类别特征处理 2.1.1 传统目标编码&#xff1a; TS 2.1.2 Greedy TS 2.1.3 ordered TS编码 2.1.4 CatBoost处理Categorical features总结 2.2.预测偏移处理 2.2.1 梯度无偏估计 2.3 树的构建​​​​​​​ 3 优缺点 优点 4 代码 1 背景 终于…

关系图卷积神经网络

异质图和知识图谱 同质图与异质图 同质图指的是图中的节点类型和关系类型都仅有一种 异质图是指图中的节点类型或关系类型多于一种 知识图谱 知识图谱包含实体和实体之间的关系&#xff0c;并以三元组的形式存储&#xff08;<头实体, 关系, 尾实体>&#xff0c;即异…

Three.js——聚光灯、环境光、点光源、平行光、半球光

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

阿里云服务器怎么更换暴露的IP

很多客户阿里云服务器被攻击IP暴露&#xff0c;又不想迁移数据换服务器&#xff0c;其实阿里云服务器可以更换IP&#xff0c;今天就来和大家说说流程&#xff0c;云服务器创建成功后6小时内可以免费更换公网IP地址三次&#xff0c;超过6小时候就只能通过换绑弹性公网IP的方式来…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…

访问云平台中linux系统图形化界面,登录就出现黑屏的问题解决(ubuntu图形界面)

目录 一、问题-图形化界面访问黑屏 二、系统环境 &#xff08;一&#xff09;网络结构示意图 &#xff08;二&#xff09;内部机器版本 三、分析 四、解决过程 &#xff08;一&#xff09;通过MobaXterm远程访问图形化界面(未成功) 1、连接方法 2、连接结果 &#xf…

【新版】系统架构设计师 - 知识点 - 结构化开发方法

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识点 - 结构化开发方法结构化开发方法结构化分析结构化设计 数据流图和数据字典模块内聚类型与耦合类型 架构 - 知识点 - 结构化开发方法 结构化开发方法 分析阶段 工具&#xff1a;数据流图、…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

算法模板-线段树+懒标记

视频连接&#xff1a;C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接&#xff1a;P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) P3374 【模板】树状数组 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 算法思路 递…

四大战略合作重磅签署,九章云极DataCanvas公司为全球智算生态注能

4月18日&#xff0c;备受瞩目的“2024九章云极DataCanvas智算操作系统新品发布会”上&#xff0c;九章云极DataCanvas公司携手新华出版社、曙光信息产业股份有限公司&#xff08;简称“中科曙光”&#xff09;、黄山旅游发展股份有限公司&#xff08;简称“黄山旅游”&#xff…

51单片机串口输出问题(第一个字符重复,自动循环输出第一个字符)

遇到的问题描述 51单片机使用串口发送数据时出现只循环发送字符串的第一个字符的情况。就算发送的是第一个字符也有时候一直发送。 串口函数代码 参考串口发送注意 #include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器void UsartInit() {SCON0X50; /…

在Spring Boot实战中碰到的拦截器与过滤器是什么?

在Spring Boot实战中&#xff0c;拦截器&#xff08;Interceptors&#xff09;和过滤器&#xff08;Filters&#xff09;是两个常用的概念&#xff0c;它们用于在应用程序中实现一些通用的逻辑&#xff0c;如日志记录、权限验证、请求参数处理等。虽然它们都可以用于对请求进行…

Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题

连接报错 解决方案 解决方法1&#xff1a;升级navicat 解决方法2&#xff1a;降级pgsql 解决方法3&#xff1a;修改dll 使用3解决 实操演示 1、 打开 Navicat 安装目录&#xff0c;找到libcc.dll文件 2、备份libcc.dll文件&#xff0c;将其复制并粘贴或者修改副本为任何其他名…

L2-045 堆宝塔

L2-045 堆宝塔 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff…

Linux:进程调度

Linux&#xff1a;进程调度 进程优先级查看优先级调整优先级 Linux 2.6 内核进程调度队列 进程优先级 查看优先级 在Linux中&#xff0c;进程是有优先级的&#xff0c;我们可以通过指令ps -la来查看&#xff1a; 其中PRI表示priority优先级&#xff0c;在Linux中&#xff0c;…