【论文复现】基于标签相关性的多标签学习

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

❀基于标签相关性的多标签学习

  • 论文概述
    • 什么是多标签学习
    • 论文贡献
  • 算法流程
    • 挖掘“主题“——提取标签相关性
    • 训练 𝑀 𝑇 M T​模型——拟合{特征集, 主题集合}
    • 用标记相关性扩增数据集
    • 再次训练拟合 𝑀 M模型——对真实帕金森病例进行筛查
  • 实验结果
    • 核心代码复现
    • main.py文件
    • multi_label_learn.py文件
  • 使用方法
    • 导入本地数据集
    • 构建多标签学习分类模型
    • 运行模型输出测试指标
  • 测试结果
  • 未来可能的改进方向
  • 环境配置

今天介绍的论文是多标签学习经典算法——LDAML
论文链接:https://ieeexplore.ieee.org/abstract/document/8217717

论文概述


在这里插入图片描述
帕金森病属于一种会逐渐削弱人体机能的慢性神经系统障碍。传统中医(TCM)为帕金森病的诊断开辟了新的途径,而应用于此病症诊断的中医数据集,则是一个涵盖了多种症状标签的复杂数据集。鉴于帕金森病症状(即标签)间普遍存在的关联性,利用这种关联性可以优化多标签学习的流程。现有的多标签分类技术大多聚焦于从成对的标签或标签序列中探索相关性。本文介绍了一种既简洁又高效的多标签分类架构,命名为潜在狄利克雷分布多标签(LDAML)。该架构的核心在于,它运用针对类别标签的主题模型来捕捉全局范围内的相关性。简而言之,研究者尝试通过主题模型,在标签集合中提炼出抽象的“主题”,以此深入挖掘标签间的全局关联性。一系列的实验充分证明,这一新方法是一个既通用又有效的框架,能够显著提升多数多标签算法的表现。依托这一框架,研究者在中医帕金森病数据集上的实验取得了显著成果,为相关领域的研究进展提供了有价值的参考和助力。

什么是多标签学习


多标签学习(Multi-Label Learning)是一种机器学习方法,用于处理具有多个标签的数据样本。与传统的单标签学习不同,每个数据点在多标签学习中可以同时属于一个或多个类别,而不仅仅是一个确定的标签。其目标是经过算法训练后输出一个分类模型,即学习一组从特征空间到标记空间的实值函数映射。假设使用 X = R d X = \mathbb{R}^d X=Rd表示一个d维的输入空间 Y = { y 1 , y 2 , y 3 , … , y q } Y = \{y_1, y_2, y_3, \ldots, y_q\} Y={y1,y2,y3,,yq}表示可能输出的q个类别,多标签任务即在训练集合 D = { ( x 1 , Y 1 ) , ( x 2 , Y 2 ) , … , ( x m , Y m ) } D = \{(x_1, Y_1), (x_2, Y_2), \ldots, (x_m, Y_m)\} D={(x1,Y1),(x2,Y2),,(xm,Ym)}上学习一个X到Y的函数,该函数可以衡量x和y的相关性,对于未见过的实例x预测其对应的标签y。

论文贡献


  • 提出了一种通用且高效的多标签分类框架——Latent Dirichlet Allocation Multi-Label (LDAML)。该框架通过利用标签间的关联性进行多标签分类。
  • 该框架可以应用于大多数当前的多标签分类方法,使其性能得到提升。通过使用LDAML框架,可以显著提升简单方法(如Binary Relevance, BR)的性能,甚至超过某些最新的方法,同时保持较低的时间成本。
  • 提出的改进LDAML在某些特殊数据集(如帕金森数据集)上取得了最佳性能。特别是在帕金森数据集上,改进的LDAML框架实现了最优性能,达到了本文的最终目标。该方法能够在未来为医生提供指导和帮助。

算法流程


挖掘“主题“——提取标签相关性


与通过查找标签子集或标签链来利用相关性的传统方法不同,LDAML通过发现标签的抽象“主题”来利用相关性。假设为d维特征向量的输入空间,表示q类标号的输出空间。给定多标签训练集,其中为d维特征向量,为对应的标签集。我们可以将每个实例看作一个文档,每个标签看作文档中的一个单词。直观地说,一定有一些抽象的“主题”,期望特定的标签或多或少地出现在实例中,特别是在包含大量相关标签的多标签数据集中。LDAML算法的主要流程分为两步:(1)从训练集中挖掘标签主题;(2)计算主题的离散分布。

从训练集中挖掘标签主题: 首先,我们将LDA引入到训练集d中,每个实例xi表示文档,每个标签表示第i个实例中的第j个标签。然后利用LDA模型生成过程计算实例-主题 θ 的概率分布矩阵,其中 表示第i个实例注入第j主题的概率。
主题的离散分布: 计算实例-主题分布矩阵后,得到每个实例属于每个主题的概率值。为了确定实例确切属于哪个主题,我们需要用离散值0/1来代替概率值。在这里我们使用的离散化方法如下所示:
在这里插入图片描述

训练 𝑀 𝑇 M T​模型——拟合{特征集, 主题集合}


在这里我们的训练集数据与测试集数据分布相似,因此我们可以假设测试数据集的主题概率分布与训练数据集相同。首先我们对训练集提取出具有标记相关性的k个主题(利用算法1),然后我们使用多标签分类模型 ( M T ) (M_T) (MT) 对训练集的特征-主题进行拟合,然后利用训练好的MT模型对未知标记集合的测试集特征数据生成含有标记相关性的k个主题(这里需要注意的是, ( M T ) (M_T) (MT) 可以随便选取一个有效的多标签分类模型,文章的重点是利用标签相关性来提高各种多标签学习模型的效率)。

用标记相关性扩增数据集


我们将这k个主题加入训练集,从而构建出新的训练集——{训练特征集,训练集标签主题}。我们将这k个主题加入数据集,从而构建出新的训练集—— [ D ′ = { ( x i ′ , Y i ) ∣ 1 ≤ i ≤ N , x i ′ = x i ⊕ Y T } ] [ D' = \{(x_i', Y_i) \mid 1 \leq i \leq N, x_i' = x_i \oplus Y_T\} ] [D={(xi,Yi)1iN,xi=xiYT}]新的测试集—— [ t ^ ′ = { ( x ^ i ′ , Y ^ i ) ∣ 1 ≤ i ≤ N , x ^ i ′ = x i ⊕ Y ^ T } ] [ \hat{t}' = \{(\hat{x}_i', \hat{Y}_i) \mid 1 \leq i \leq N, \hat{x}_i' = x_i \oplus \hat{Y}_T\} ] [t^={(x^i,Y^i)1iN,x^i=xiY^T}]

再次训练拟合 𝑀 M模型——对真实帕金森病例进行筛查


最后,可以再次使用一种多标签学习模型M对扩增后的训练集D’进行拟合,进一步建立输入数据和输出空间的数据联系。然后对扩增后的测试集t’进行多标签分类,获得输入样本是否患有病症以及其他情况的预测结果。上述过程的整体框架流程图如算法2所示。

在这里插入图片描述

实验结果


本文所涉及的所有资源的获取方式:这里

文章在四份数据集上用多种多标签学习分类模型分别加上LDAML算法与其原始模型的分类效果进行对比,实验结果如图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上实验结果表明,LDAML能够在性能和时间成本之间取得良好的平衡。目前的大多数方法都可以应用于LDAML。我们可以采用目前最先进的方法作为LDAML在原始基础上取得突破的基本方法(base model)。另一方面,唯一额外的时间代价是计算主题概率分布矩阵的小词空间。因此,LDAML的时间成本接近于其基础方法的时间成本。通过采用BR或CC等较弱的方法作为基本方法,可以在较低的时间成本下提高接近实际状态的性能。这些结果表明,LDAML是一个通用的框架,可以为具有标签相关性的多标签问题提供鲁棒且更优的解决方案。

核心代码复现


由于改论文代码目前尚未开源,因此在本文中我将给出由本人根据论文算法流程一比一复制的复现代码,代码源文件我将放在附件中,其核心逻辑如下:

main.py文件


#########################伪代码###########################
# 导入必要的库
Import libraries# 定义函数
Function discretize(theta):# 初始化二进制矩阵 YTInitialize YT as a zero matrix with the same shape as thetaFor each row i in theta:Find the maximum value in row iFor each column j in row i:If the difference between the max value and theta[i][j] is less than 1/K:Set YT[i][j] to 1Else:Set YT[i][j] to 0Return YTFunction convert_to_one_hot(data):# 获取唯一值和类别数Find unique values in dataInitialize one_hot_encoded as a zero matrixFor each value in data:Find the index of the value in unique valuesSet the corresponding position in one_hot_encoded to 1Return one_hot_encodedFunction lda(labels, n):# 进行潜在狄利克雷分配(LDA)Initialize LDA model with n componentsFit and transform labels using LDA modelDiscretize the transformed dataReturn the discretized dataFunction metric_cal(test, pred):# 计算并打印评估指标Calculate accuracy, precision, recall, F1 score, and AUCPrint the calculated metrics# 主程序
If __name__ == "__main__":# 加载数据Load data from Excel file# 定义标签列和特征Define label_cols and featuresConvert features and labels to NumPy arrays# 设置主题数Set n to 6# 对标签进行LDACall lda function to get Y_T# 将特征与离散化的标签组合Concatenate features and Y_T to get XYT# 划分训练集和测试集Split XYT and labels into X_train, X_test, y_train, y_test# 初始化多标签分类器Initialize MT_classifier as RankSVM# 从训练集和测试集中提取主题Extract yt_train and yt_test from X_train and X_testRemove last n columns from X_train and X_test# 训练多标签分类器Fit MT_classifier using X_train and yt_train# 预测测试集的主题Predict yt_proba and yt_pred using MT_classifier on X_testConvert yt_pred to integer# 使用预测的主题扩展训练集和测试集Concatenate X_train with yt_train to get X_train_augConcatenate X_test with yt_pred to get X_test_aug# 初始化并训练二进制相关性分类器Initialize base_classifier as MLPClassifierInitialize clf as BinaryRelevance with base_classifierFit clf using X_train_aug and y_train# 预测测试集的标签Predict y_pred and y_score using clf on X_test_aug# 计算评估指标Calculate hamming loss, ranking loss, coverage error, and average precisionPrint calculated metrics# 对每个标签计算并打印评估指标For each label i:Extract test and pred for label iCall metric_cal function to calculate and print metricsPrint separatorPrint final separator

在主文件main.py中我复现了LDAML算法的整个流程,并实现了从输入数据到输出评价指标的全过程,在这里默认采用的多标签学习分类起 ( M T ) (M_T) (MT) 和M是RankSVM和二元回归+深度学习。

multi_label_learn.py文件


# 定义LIFTClassifier类,继承自BaseEstimator和ClassifierMixin
class LIFTClassifier(BaseEstimator, ClassifierMixin):# 初始化函数,接受一个基本分类器作为参数def __init__(self, base_classifier=DecisionTreeClassifier()):设置base_classifier为传入的参数初始化classifiers字典# 训练模型函数def fit(self, X, y):获取标签数量遍历每个标签对每个标签训练一个分类器将训练好的分类器存入classifiers字典返回self# 预测函数def predict(self, X):获取标签数量初始化预测结果矩阵遍历每个标签使用对应的分类器进行预测将预测结果存入预测结果矩阵返回预测结果矩阵# 预测概率函数def predict_proba(self, X):获取标签数量初始化概率预测结果矩阵遍历每个标签使用对应的分类器进行概率预测将预测概率结果存入概率预测结果矩阵返回概率预测结果矩阵# 定义MLkNN类
class MLkNN:# 初始化函数,接受一个k值作为参数def __init__(self, k=3):设置k值初始化k近邻模型# 训练模型函数def fit(self, X, y):保存训练数据X和y使用X训练k近邻模型# 预测函数def predict(self, X):获取样本数量初始化预测结果矩阵遍历每个样本获取样本的k+1个最近邻排除样本自身计算邻居标签的和根据标签和判断最终预测结果返回预测结果矩阵# 预测概率函数def predict_proba(self, X):获取样本数量初始化概率预测结果矩阵遍历每个样本获取样本的k+1个最近邻排除样本自身计算每个标签的概率返回概率预测结果矩阵# 定义RankSVM类,继承自BaseEstimator和ClassifierMixin
class RankSVM(BaseEstimator, ClassifierMixin):# 初始化函数,接受参数C, kernel, gammadef __init__(self, C=1.0, kernel='rbf', gamma='scale'):设置C, kernel, gamma值初始化模型列表初始化多标签二值化器# 训练模型函数def fit(self, X, y):使用多标签二值化器转换y获取标签数量遍历每个标签将当前标签转换为二值格式使用SVM训练二值化后的标签将训练好的SVM模型加入模型列表# 预测函数def predict(self, X):初始化预测结果矩阵遍历每个SVM模型使用模型进行预测将预测结果存入预测结果矩阵返回预测结果矩阵# 预测概率函数def predict_proba(self, X):初始化概率预测结果矩阵遍历每个SVM模型使用模型进行概率预测将预测概率结果存入概率预测结果矩阵返回概率预测结果矩阵# 定义MultiLabelDecisionTree类
class MultiLabelDecisionTree:# 初始化函数,接受参数max_depth, random_statedef __init__(self, max_depth=None, random_state=None):设置max_depth, random_state值初始化标签幂集转换器初始化决策树分类器# 训练模型函数def fit(self, X, y):使用标签幂集转换器转换y使用转换后的y训练决策树分类器# 预测概率函数def predict_proba(self, X):使用决策树分类器进行概率预测将预测概率结果转换为原始标签格式返回概率预测结果# 预测函数def predict(self, X):使用决策树分类器进行预测将预测结果转换为原始标签格式返回预测结果# 定义MLP神经网络类,继承自nn.Module
class MLP(nn.Module):# 初始化函数,接受输入大小、隐藏层大小和输出大小作为参数def __init__(self, input_size, hidden_size, output_size):调用父类的初始化函数初始化全连接层1初始化ReLU激活函数初始化全连接层2初始化Sigmoid激活函数# 前向传播函数def forward(self, x):通过全连接层1通过ReLU激活函数通过全连接层2通过Sigmoid激活函数返回输出# 定义BPMLL类,继承自BaseEstimator和ClassifierMixin
class BPMLL(BaseEstimator, ClassifierMixin):# 初始化函数,接受参数input_size, hidden_size, output_size, epochs, lrdef __init__(self, input_size, hidden_size, output_size, epochs=10, lr=0.0001):设置输入大小、隐藏层大小、输出大小、训练轮数、学习率初始化MLP模型初始化优化器初始化损失函数# 训练模型函数def fit(self, X_train, X_val, y_train, y_val):将训练数据和验证数据转换为张量创建训练数据集和数据加载器遍历每个训练轮次设置模型为训练模式遍历训练数据加载器清零梯度前向传播计算损失反向传播更新参数设置模型为评估模式计算验证损失并打印# 预测概率函数def predict_proba(self, X):设置模型为评估模式禁用梯度计算进行前向传播返回预测概率结果# 预测函数def predict(self, X, threshold=0.5):获取预测概率结果根据阈值判断最终预测结果返回预测结果# 定义RandomKLabelsetsClassifier类,继承自BaseEstimator和ClassifierMixin
class RandomKLabelsetsClassifier(BaseEstimator, ClassifierMixin):# 初始化函数,接受参数base_classifier, labelset_size, model_countdef __init__(self, base_classifier=None, labelset_size=3, model_count=10):设置基本分类器、标签集大小、模型数量初始化RakelD模型# 训练模型函数def fit(self, X, y):使用RakelD模型训练数据返回self# 预测函数def predict(self, X):使用RakelD模型进行预测返回预测结果# 预测概率函数def predict_proba(self, X):使用RakelD模型进行概率预测返回概率预测结果

同时我在文件multi_label_learning.py中定义了多种不同的多标签学习分类模型,大家可以自行调用相应的函数来进行实验以验证LDAML算法的有效性,使用方法我会在本文对应的视频中进行讲解。

使用方法


导入本地数据集


调用LDAML算法的方法放在main.py文件中,首先我们需要将文件路径修改成自己所要使用的数据集路径。这里我使用的文件路径为’./测试数据.xlsx’,供大家一键运行熟悉项目。然后大家需要将自己的标签列名称提取变量label_cols中,用于对数据集划分特征集合与标签集合。
在这里插入图片描述

构建多标签学习分类模型


构建想要的多标签学习分类算法,这里我给大家复现了多种经典的多标签分类器,如LIFT、MlkNN和RankSVM等,并帮大家配置好了参数,大家可以将想要使用的算法对应行的注释删掉即可(
( M T ) (M_T) (MT) 和M都是一样)。
在这里插入图片描述

运行模型输出测试指标


设置好这些外在参数后,我们就可以运行代码,主文件将自动调用第三方库和multi_label_learn.py文件中的函数来进行训练和测试。下面是我选取的几种测试指标,分别会输出模型对整体的多标签分类性能指标(Hamming loss、Ranking loss、Coverage error和Average precision)和对单一标签的分类指标(Accuracy、Precision、Recall、F1 Score和AUC)。
在这里插入图片描述

测试结果


下面是在测试数据集上模型的表现:
在这里插入图片描述
以上是模型多标签学习分类的性能,Hamming Loss为0.051228070175438595,Ranking Loss为0.016737120579225842,Coverage Error为2.3263157894736843,Average Precision为0.7500066243540565
在这里插入图片描述
以上是对模型在单一标签下的分类性能测试结果,测试数据集中有十个标签,因此这里会输出十个标签下模型分类的Accuracy、Precision、Recall、F1 Score和AUC,也就是说这样的数据会有十组

在这里插入图片描述
我这里把数据列成表这样大家可以更直观的看到,我换用了不同的多标签学习算法结合LDAML,并比较了它们在Accuracy、AUC和F1-score上的表现。在上面的情况上来看,使用BPMLL在整体对单一标签进行分类时效果相比其他算法更好,但也会在某些标签下弱于其他模型。

未来可能的改进方向


以下是对您提供文本的改写,保持了相似的意思和语气:

这一部分是我经过深思熟虑后认为可以在当前LDAML框架上进一步优化的地方,也就是我想向各位介绍的LSA算法。

潜在语义分析(LSA)是一种针对大规模文本数据的统计分析方法,它致力于挖掘文本中隐藏的语义结构,并从中提取出有价值的语义信息。LSA基于一个核心假设:即使在词语表述形式各异的情况下,文本中依然存在着某些稳定的语义结构。该方法的基本思路是将文本数据转化为一个矩阵形式,其中矩阵的行代表不同的文档,列代表各个词语,而矩阵中的元素则可以是词频、TF-IDF权重等统计指标。随后,通过运用奇异值分解(SVD)技术,将这个矩阵拆解为三个子矩阵的乘积:原始文本矩阵A、文档-概念矩阵U、奇异值矩阵Σ以及词语-概念矩阵的转置V^T。LSA通过筛选并保留最重要的奇异值及其对应的左右奇异向量,成功地将文本数据的维度降低到了一个更为紧凑的空间,从而揭示了潜在的语义结构,并有效地提取出了文本数据的语义信息。

在处理大规模文本数据时,LSA展现出了其卓越的语义信息提取能力。此外,LSA还能够发现文本数据中的主题结构,并精准地提取出主题信息。受到这一点的启发,我们尝试将LSA应用于膝骨关节炎标记集合中,对十个标记进行了相关性计算并提取了主题,从而获得了标记集合中的高阶信息。与LDA相比,LSA显得更为灵活且易于实现。LDA在处理大规模数据时速度较慢,因为它需要对每个词项和主题进行迭代推断,并预设主题分布和词项分布的先验参数;而LSA则只需进行奇异值分解,无需设定先验参数,因此实现和调试起来更为简便。在语义解释方面,LDA通过抽样方法从文档中抽取主题,其主题在语义上可能较为晦涩难懂;而LSA则通过奇异值分解从标签数据中提取主题,能够更直观地解释这些主题的含义,并更好地反映标签之间的语义关联。

接下来,我们可以进一步探讨是否有可能将LSA融入到当前的框架中,或者直接基于LSA开发一种全新的标记相关性提取算法。这些都是值得我们去尝试和探索的方向,期待大家能够共同学习、共同进步!

环境配置


  • python3.8或以上版本
  • 须事先安装第三方库torch、numpy、sklearn、pandas、skmultilearn
  • 可修改变量——主题数n、所用的本地数据集、多标签分类器 ( M T ) (M_T) (MT) 和M
    在这里插入图片描述

编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里

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

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

相关文章

MMCloud+JuiceFS:云端Nextflow工作流的新方案

在云计算和生物信息学领域,执行大规模计算任务时的性能与成本效率至关重要。MemVerge推出的JuiceFlow通过JuiceFS和云端Memory Machine Cloud(简称“MMCloud”)平台,为Nextflow工作流(pipeline)提供了一种高…

【Linux】 shell 学习汇总[转载]

转载地址:https://blog.csdn.net/baidu_33718858/article/details/81453835 一些平时使用过程中的知识点积累,来源都附上了博客,添加了一些自己的总结。 感触:linux命令用熟了相当提高工作效率,有时候用Python写十几行…

天云数据联手举办“科学传播沙龙”活动,探讨Sora是否会带来新的科学革命

4月18日,由北京市科协主办,北京科技记协承办,中关村创新研修学院、天云融创数据科技(北京)有限公司协办的“AIGC塑造数字内容生产新范式”科学传播沙龙在京举办,活动由北京市科协宣传文化部二级调研员、北京…

LlamaIndex+本地部署InternLM实践

1.环境配置 1.1 配置基础环境 这里以在 Intern Studio 服务器上部署 LlamaIndex 为例。 首先,打开 Intern Studio 界面,点击 创建开发机 配置开发机系统 填写 开发机名称 后,点击 选择镜像 使用 Cuda11.7-conda 镜像,然后在资源…

uni-segmented-control 分段器添加数量提示

1、 在 template 内写入 uni-segmented-control 基础写法 <uni-segmented-control :current"current" :values"items" :style-type"styleType" clickItem"onClickItem" activeColor"#81D8D0" />2、在 script 里面写…

Linux篇(用户管理命令)

目录 一、用户与用户组 1. 为什么要做用户与用户组管理 2. Linux的用户及用户组 2.1. Linux的多用户多任务 2.2. 什么是用户 2.3. 什么是用户组 2.4. 用户和用户组的关系 二、用户和用户组管理 1. 用户组管理 1.1. 用户组添加 /etc/group文件结构 1.2. 用户组修改 …

编程之路,从0开始:内存函数

Hello大家好&#xff01;很高兴我们又见面了。 给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 今天我们来讲C语言中的内存函数。 目录 1、memcpy内存复制 2、memmove可重叠内存拷贝 3、memset设置字符 4、memcmp比较 1、memcpy内存复制 memcpy就是内存复制…

PyCharm 中的【控制台】和【终端】的区别

pycharm专业版-使用 PyCharm 中的【控制台】和【终端】的区别如下&#xff1a; 1.环境&#xff1a;控制台是 PyCharm 的内部环境&#xff0c; 终端 是操作系统的命令行界面。 2.功能&#xff1a;控制台可以运行 Python 代码&#xff0c;并显示执行结果&#xff1b; 终端可以…

IDEA修改注释颜色—图文教程

老的注释颜色用习惯了&#xff0c;新电脑的灰色注释不习惯&#xff0c;还是喜欢黄色哈哈哈哈&#x1f923;&#x1f923;&#x1f923; Block comment &#xff1a; 多行注释 Doc comment&#xff1a;文档注释 Line comment&#xff1a;单行注释 小伙伴们可以改自己喜欢的颜色…

C++ String(2)

reserve 这个地方要和reverse区分清楚&#xff0c;reserve是保留的意思&#xff0c;而reverse是逆置的意思 reserve函数可以预先分配内存 reserve(n)代表至少保留可以容纳n个字符的空间&#xff08;具体多大和编译器有关&#xff09; 比如reserve(100)&#xff0c;代表开10…

网络基础Linux

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 网络传输流程图 ​编辑 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址 笔记&#xff08;画的图&#xff09; 协议&#x…

干货 | WiFi 7(802.11BE)技术规范详解

1 概述 1.1 简介 当前全球有近200亿的Wi-Fi设备正在使用&#xff0c;Wi-Fi已成为生活、工作中不可或缺的一部分。在实际应用中&#xff0c;Wi-Fi协议所传输无线流量&#xff0c;已占到无线总流量的90%。海量数据快速、安全传输受益于巨量Wi-Fi设备高效、安全、可靠地工作&a…

线程的状态

目录 一、线程的所有状态 二、状态转换 三、多线程初体验 一、线程的所有状态 状态是针对当前线程调度情况所描述的&#xff0c;又因为线程是调度的基本单位&#xff0c;所以我们所谈到的状态都是线程的属性。在java里对线程的状态&#xff0c;进行了一个更细的划分。 我们可…

基于SpringBoot网上超市的设计与实现录像

基于SpringBoot网上超市的设计与实现录像 SpringBoot网上超市的设计与实现录像

认证鉴权框架SpringSecurity-3--代码集成_认证篇1(重写UserDetailsService示例)

上一篇介绍了springSecurity中常用的组件和过滤器链&#xff0c;明白了springSecurity管理认证和授权的基本过程和所用到的组件。之后几篇我们通过在Java代码集成springSecurity&#xff0c;来学习下代码上认证是如何实现的。 代码上常用的认证方式有两种&#xff0c;一种是实现…

C语言操作符终极揭秘:表达式求值秘籍

C语言中操作符详解&#xff08;终结篇&#xff09; 放在最前面的表达式求值定义&#xff08;1&#xff09; 操作数的求值&#xff08;2&#xff09; 操作符的应用&#xff08;3&#xff09;类型转换&#xff08;3.1&#xff09;隐式类型转换&#xff08;Type Promotion&#xf…

[代码审计]宏*HCM最新文件上传漏洞分析复现

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本博客所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全性…

谷歌Gemini发布iOS版App,live语音聊天免费用!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

MYSQL SQL优化总结【快速理解】

1、优化insert操作 批量插入&#xff0c;防止大量与数据库进行访问 手动控制事务&#xff0c;减少事务的频繁开启和提交。 主键顺序插入 2、优化主键 主键优化的点就是避免主键过长&#xff0c;因为如果有二级索引&#xff0c;叶子节点存储的数据时间上是主键&#xff0c;如果主…

【Hive】【HiveQL】【大数据技术基础】 实验四 HBase shell命令实验

实验四&#xff1a;熟悉常用的HBase操作 实验概览 在本次实验中&#xff0c;我们将深入探索HBase在Hadoop生态系统中的角色&#xff0c;并熟练掌握常用的HBase Shell命令和Java API操作。通过这些实践&#xff0c;我们能够更好地理解HBase的工作原理以及如何在实际项目中应用。…