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

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

本文所涉及所有资源均在传知代码平台可获取

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

论文概述

在这里插入图片描述

帕金森病是一种使人虚弱的慢性神经系统疾病。传统中医(TCM)是一种诊断帕金森病的新方法,而用于诊断帕金森病的中医数据集是一个多标签数据集。考虑到帕金森病数据集中的症状(标签)之间总是存在相关性,可以通过利用标签相关性来促进多标签学习过程。目前的多标签分类方法主要尝试从标签对或标签链中挖掘相关性。该文章提出了一种简单且高效的多标签分类框架,称为潜在狄利克雷分布多标签(LDAML),该框架旨在通过使用类别标签的主题模型来学习全局相关性。简而言之,研究人员试图通过主题模型在标签集上获得抽象的“主题”,从而能够挖掘标签之间的全局相关性。大量实验清楚地验证了所提出的方法是一个通用且有效的框架,能够提高大多数多标签算法的性能。基于该框架,研究人员在中医帕金森病数据集上取得了令人满意的实验结果,这可以为该领域的发展提供参考和帮助。

什么是多标签学习

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

论文贡献

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

算法流程

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

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

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

训练 M T M_T MT模型——拟合{特征集, 主题集合}

在这里我们的训练集数据与测试集数据分布相似,因此我们可以假设测试数据集的主题概率分布与训练数据集相同。首先我们对训练集提取出具有标记相关性的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 ^ } t' = \{(\hat{x_i'}, \hat{Y_i}) \mid 1 \leq i \leq N, \hat{x_i'} = x_i \oplus \hat{Y_T} \} t={(xi^,Yi^)1iN,xi^=xiYT^}

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

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

实验结果

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

在这里插入图片描述

在这里插入图片描述

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

核心代码复现

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

main.py文件

#########################伪代码###########################
# 导入必要的库
Import libraries

# 定义函数
Function discretize(theta):
    # 初始化二进制矩阵 YT
    Initialize YT as a zero matrix with the same shape as theta
    For each row i in theta:
        Find the maximum value in row i
        For 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 1
            Else:
                Set YT[i][j] to 0
    Return YT

Function convert_to_one_hot(data):
    # 获取唯一值和类别数
    Find unique values in data
    Initialize one_hot_encoded as a zero matrix
    For each value in data:
        Find the index of the value in unique values
        Set the corresponding position in one_hot_encoded to 1
    Return one_hot_encoded

Function lda(labels, n):
    # 进行潜在狄利克雷分配(LDA)
    Initialize LDA model with n components
    Fit and transform labels using LDA model
    Discretize the transformed data
    Return the discretized data

Function metric_cal(test, pred):
    # 计算并打印评估指标
    Calculate accuracy, precision, recall, F1 score, and AUC
    Print the calculated metrics

# 主程序
If __name__ == "__main__":
    # 加载数据
    Load data from Excel file
    # 定义标签列和特征
    Define label_cols and features
    Convert features and labels to NumPy arrays
    # 设置主题数
    Set n to 6
    # 对标签进行LDA
    Call 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_test
    Remove 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_test
    Convert yt_pred to integer
    # 使用预测的主题扩展训练集和测试集
    Concatenate X_train with yt_train to get X_train_aug
    Concatenate X_test with yt_pred to get X_test_aug
    # 初始化并训练二进制相关性分类器
    Initialize base_classifier as MLPClassifier
    Initialize clf as BinaryRelevance with base_classifier
    Fit 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 precision
    Print calculated metrics
    # 对每个标签计算并打印评估指标
    For each label i:
        Extract test and pred for label i
        Call metric_cal function to calculate and print metrics
        Print separator
    Print final separator

在主文件main.py中我复现了LDAML算法的整个流程,并实现了从输入数据到输出评价指标的全过程,在这里默认采用的多标签学习分类起 M T M_T MT M M 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, gamma
    def __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_state
    def __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, lr
    def __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_count
    def __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 M 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算法。

潜在语义分析(Latent Semantic Analysis,LSA)是一种用于分析大规模文本数据的统计方法,旨在发现文本中的潜在语义结构并提取其语义信息。LSA假设文本中存在一些潜在的语义结构,即使在词语表达方式不同的情况下,这些结构也会保持一定的稳定性。其基本思想是将文本数据表示为一个矩阵,其中行代表文档,列代表词语,而矩阵中的元素则可以是词频、TF-IDF权重等。接下来,通过奇异值分解(Singular Value Decomposition,SVD)将这个矩阵分解为三个矩阵的乘积: 其中,A是原始文本矩阵,U是文档-概念矩阵,Σ是奇异值矩阵,是词语-概念矩阵的转置。LSA通过保留最重要的奇异值及其对应的左右奇异向量,将文本数据的维度降低到一个更小的空间,从而发现潜在的语义结构,并提取出文本数据的语义信息。

LSA在面对大规模文本数据时,能够有效地提取出其中的潜在语义信息。并且,LSA能发现文本数据中的主题结构并提取出其中的主题信息。受此启发,我们使用LSA对膝骨关节炎标记集合中的十个标记进行相关性计算并提取主题,从而获得标记集合中的高阶信息。相比之下,LSA比LDA更加灵活和简单。LDA对于大规模数据的处理速度较慢,因为它需要对每个词项和主题进行迭代推断,对主题分布和词项分布的先验参数进行设定,而LSA只需进行奇异值分解,不需要对先验参数进行设置,因此更容易实现和调试。LSA在语义上也更为易懂。LDA通过抽样方法从文档中抽取主题,它的主题在语义上可能难以解释,LSA通过奇异值分解从标签数据中提取主题,可以更直观地解释这些主题的含义,更好地反映标签之间的语义关系。

接下来是不是有可能将LSA融入到目前的框架中,或者直接基于LSA开发一种标记相关性提取的算法都是可以尝试的方向,可以留给大家一起去学习探索!

环境配置

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

资源获取

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件地址获取。

附件地址:基于标签相关性的多标签学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里公告:停止 EasyExcel 更新与维护

最近,阿里发布公告通知,将停止对知名 Java Excel 工具库 EasyExcel 的更新和维护。EasyExcel 由阿里巴巴开源,作者是玉箫,在 GitHub 上拥有 30k stars、7.5k forks 的高人气。 据悉,EasyExcel 作者玉箫去年已从阿里离…

稳恒磁场(2)

物理概念 电流元 IdL要足够小 物理理论 毕奥——萨伐尔定律 电流元在空间产生的磁场,磁感应强度与电流I长正比,与半径的平方成反比 后由拉普拉斯总结得出数学表达式: 其中 ,μ0 4π*10^-7 N*A^-2 , r^为r反向上…

C语言 | Leetcode C语言题解之第553题最优除法

题目: 题解: #define MAX_STR_LEN 64char * optimalDivision(int* nums, int numsSize) {char * res (char *)malloc(sizeof(char) * MAX_STR_LEN);if (numsSize 1) {sprintf(res, "%d", nums[0]);return res;}if (numsSize 2) {sprintf(r…

IntelliJ+SpringBoot项目实战(二)---构建项目多层级模块

本人上一篇文件介绍了使用IntelliJ开发工具构建新的SpringBoot项目。本节介绍SpringBoot项目的模块、子模块如何搭建。 首先我们根据项目的需求,可以将在顶级工程下创建多个模块,已经不同模块下还有子模块。 仍使用上节的OpenJWeb项目作为示例&#xff0…

达梦数据库安装与初始化超教程

达梦数据库(DM Database)作为中国自主研发的数据库系统,因其高效的性能和稳定的支持广泛应用于政府、金融、能源等关键领域。面对日益增长的数据管理需求,如何快速安装与初始化达梦数据库成了许多新手的第一步。这篇教程&#xff…

Mac中禁用系统更新

Mac中禁用系统更新 文章目录 Mac中禁用系统更新1. 修改hosts,屏蔽系统更新检测联网1. 去除系统偏好设置--系统更新已有的小红点标记 1. 修改hosts,屏蔽系统更新检测联网 打开终端,执行命令: sudo vim /etc/hosts127.0.0.1 swdis…

黑芝麻智能:技术+生态+量产三大先发优势,领跑智驾“芯”成长

黑芝麻智能:定位智驾芯片供应商,卓越研发团队打造强劲产品力。 1)公司定位:Tier2 芯片供应商,提供车规级计算 SoC 及基于 SoC 的智能汽车解决方案。2)产品结构:公司具有两个车规级 SoC 系列——…

Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码

论文介绍 CARAFE模块概述:本文介绍了一种名为CARAFE(Content-Aware ReAssembly of FEatures)的模块,它是一种用于特征上采样的新方法。应用场景:CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程&#xff0…

一文了解git TAG

Git标签(Tag)用于为 Git 历史中的特定提交打上标记,通常用于标识重要的节点,比如发布版本。标签让开发者可以很方便地对特定版本进行引用,且不会随时间变动。Git 中的标签分为两种:轻量标签和附注标签。 …

IRF堆叠基本配置

IRF(堆叠配置) IRF(IntelligentResilientFramework,智能弹性架构)是H3C自主研发的软件虚拟化堆叠技术。它的核心思想是将多台设备通过IRF物理端口连接在一起,进行必要的配置后,虚拟化成一台“分布式设备”。使用这种虚…

渗透测试(socket,namp,scapy)

socket:可以用来实现不同虚拟机或者不同计算机之间的通信。 socket常用函数: sock.bind(host,port) //host可接受client范围,以及连接的端口 sock.listen()//sever开启监听连接 sock.accpet()//返回 sock,addr 用来接受和发送数据 addr…

组态软件的概念

一、前言 组态软件是一种用于设计、配置和管理自动化系统的软件。它可以帮助用户快速地创建和修改自动化系统的界面、逻辑和通信功能,从而提高生产效率和质量。 二、组态软件的定义 组态软件是一种集成开发环境,用于设计、配置和管理自动化系统。它通…

《教你用Python写出浪漫的表白代码》

《教你用Python写出浪漫的表白代码》最简单的教程,亲测可用 1. 引言 你有没有想过用代码来表达爱意?今天我将带你用Python实现一个浪漫的表白代码!代码简单有趣,新手也能轻松上手。让我们一起用Python绘制出心形图案吧。 2. 环…

Elmo驱动器上位机软件的详细配置

续接上文,本文讲解Elmo驱动器上位机软件更详细的配置,重点关注,在电机的位置受到约束的情况下,完成驱动器的参数整定过程,以及一些调试方法 一 硬件介绍 本文使用的是另一套设备,假设电机的位置是受到约束的 1 编码器规格书 编码器已知信息是 :读数头是26位的,通讯…

带webui的免费SSL证书管理工具

一、功能 内置 Lets encrypt/Google/ZeroSSL 接口,Google和ZeroSSL需要绑定EAB信息。EAB指引。内置 阿里云/腾讯云/Cloudflare/DNS.COM/DNS.LA/百度云 DNS解析接口。支持自定义DNS解析接口。支持一键部署(本地/FTP/SSH/宝塔/IIS)可纯前端生成CSR和私钥,…

Docker:镜像构建 DockerFile

Docker:镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富…

如何提升自媒体发稿效果,必须掌握的几个技巧

在自媒体时代,发稿效果直接关系到内容的传播力与影响力。为了提升自媒体发稿效果,有几个关键技巧是每位自媒体人必须掌握的。以下是对这些技巧的详细阐述: 一、明确受众定位 首先,自媒体人需要明确自己的受众群体。这包括受众的…

11.11不止今天,算力狂欢嗨到16号!

双十一狂欢不止今天,捷智算云服务平台算力狂欢直到16号! 双十一活动期间,用户注册,即可免费领取88元无门槛算力体验金和价值千元满减优惠券,优惠券数量多达16张! 优惠券适用于平台所有云主机容器&#xf…

HarmonyOS Next 实战卡片开发 02

HarmonyOS Next 实战卡片开发 02 卡片开发中,还有一个难点是显示图片。其中分为显示本地图片和显示网络图片 显示本地图片 卡片可以显示本地图片,如存放在应用临时目录下的图片。路径比如 /data/app/el2/100/base/你的项目boundleName/temp/123.png 以…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…