怎么样鉴定疾病相关稀有细胞群?二值化精细模型标签,这个刚发的顶刊单细胞算法值得一学!

生信碱移

HiDDEN:抽丝剥茧

在具有病例和对照单细胞RNA测序研究中,样本级标签通常被直接赋予单个细胞,假设所有病例细胞都受影响。这种传统方法在受影响细胞比例较小或扰动强度较弱时,难以有效识别关键细胞及其标记基因(注意,这里以及后面所提到的扰动都是指不同分组下影响细胞的因素,比如病毒感染时病毒对细胞的转录影响)。同时,这些计算策略通常还假设:1) 分组标签能正确反映每个细胞的扰动状态;2) 分组标签所代表的扰动信号在潜在空间中占主导地位;3) 所有混淆变量均已知并可去除。但这些假设在细胞异质性和技术噪声较大的情况下往往难以满足,特别是当受影响细胞比例较小时。简单点说,传统方法假设所有来自疾病的细胞都受扰动,但实际上只有少部分细胞受影响,这种误差让研究者难以准确识别真正受影响的细胞及其特征。

图片

▲ 当前方法的问题。作者使用外周血单核细胞数据集中Naive B细胞和记忆 B 细胞的单细胞RNA-seq图谱进行了模拟。非记忆 B 细胞和记忆 B 细胞的表达谱相对相似,但在生物学上存在差异,因此适合模拟扰动引起的变化。作者构建了一个由Naive B(代表未扰动分组)细胞组成的对照样本和一个由Naive 和Memory B(代表扰动分组,Memory是受到扰动而改变的细胞)细胞组成的病例样本但受扰动的关键细胞极少时,比如在病例条件下有5%的记忆B细胞会导致标准降维工作流程产生高度异质的降维潜在空间,从而无法检测到受干扰细胞的位置。沿两个轴的定义:病例样本中受扰动细胞的百分比(x 轴)和扰动强度(y 轴)。当受影响的细胞数量较少且受影响细胞与未受影响细胞之间的差异较小时,检测扰动最具挑战性。

为了解决这一问题,来自麻省理工学院-哈佛大学Broad研究所的研究人员提出了HiDDEN方法,于2024年11月2日发表于Nature Communications[IF:14.7]该方法将样本级标签转化为细胞特异的连续扰动得分,进而根据扰动状态生成精细化的单个细胞标签。通过这种方式,HiDDEN显著提升了检测扰动相关基因的能力,有助于准确识别扰动标记并增强检测功效。在实验中,HiDDEN展示出能够克服传统方法的局限性,恢复出多个真实扰动信号,准确识别相关细胞亚群。

图片

▲ DOI: 10.1038/s41467-024-53666-8

本文简要介绍HiDDEN的运行过程,更多细节可以查看原文或者下方链接:

  • https://github.com/tudaga/LabelCorrection/tree/main

0.环境配置与示例数据

环境配置:

HiDDEN基于python软件的scanpy单细胞流程,使用git clone克隆github项目仓后可以通过conda在环境中进行安装配置:

git clone https://github.com/tudaga/LabelCorrection.git
conda env create --file environment.yml
① 相关py库的导入:
import os
import sys
root_path = os.path.abspath('./..')
sys.path.insert(0, root_path )import itertools
import functools
from tqdm import tqdmimport pandas as pd
import numpy as np
import sklearn
import sklearn.linear_model
import sklearn.cluster
import sklearn.metrics
import matplotlib.pyplot as plt
import seaborn as snsimport hiddensc
from hiddensc import utils, files, visimport scanpy as sc
import scvi
import anndatautils.set_random_seed(utils.RANDOM_SEED)
utils.print_module_versions([sc, anndata, scvi, hiddensc])
vis.visual_settings()
② 加载并准备示例数据集

在示例教程中,作者使用10x Genomics免费提供的PBMCs数据集中Naive B细胞和记忆B细胞单细胞RNAseq数据的半模拟病例/对照单细胞数据集(如本文开头所描述的那样)。对照样本只包含Naive B细胞,病例样本由15%的记忆B细胞和85%的Naive B细胞组成(病例样本中15%的记忆B细胞可以理解为模拟的受到扰动因素干扰后产生的关键细胞亚群)。以该数据集为例,接下来展示如何识别病例样本中是否存在对照样细胞,并分离出真正受扰动的细胞亚群(这里是15%的记忆B细胞)。有关该数据集生成的更多详情,铁子们可以参阅原文。

REFIX = f'naiveB_1900_memoryB_154'
at_data_dir = functools.partial(os.path.join, root_path, files.DATA_DIR)
adata = sc.read(at_data_dir(f'{PREFIX}_raw.h5ad'))
adata.obs['binary_label'] = adata.obs['batch']=='Case'
hiddensc.datasets.preprocess_data(adata)
hiddensc.datasets.normalize_and_log(adata)
adata
#AnnData object with n_obs × n_vars = 2054 × 14603
#    obs: 'barcodes', 'batch', 'perturbed', 'binary_label', 'n_genes'
#    var: 'gene_ids', 'n_cells'
#    uns: 'log1p'
#    layers: 'counts'# Prepare directories
at_figure_dir = functools.partial(os.path.join, root_path, 'figures', 'tutorial')
os.makedirs(at_figure_dir(), exist_ok=True)
at_results_dir = functools.partial(os.path.join, root_path, files.RESULT_DIR, 'tutorial')
os.makedirs(at_results_dir(), exist_ok=True)
at_train_dir = functools.partial(os.path.join, root_path, files.RESULT_DIR, 'tutorial', 'training')
os.makedirs(at_train_dir(), exist_ok=True)print(f'Generating results at {at_results_dir()}')
# Generating results at /home/jupyter/LabelCorrection/results/tutorialhiddensc.datasets.augment_for_analysis(adata)
sc.pl.umap(adata, color=['batch'], s=120)

图片

如图所示,无论是"病例 "还是 "对照 "的标签,都没有明显的富集群,此时标准分析工作流程无法识别出扰动的记忆B亚群。

1.HiDDEN分析

① 获得降维表示:

HiDDEN框架的第一步是计算单细胞数据的降维表示(表示是指高维基因表达降维后的潜空间,即PCA、UMAP、TSNE,不过最好选择能够良好表示细节的算法)。在这里,可以加载已经计算过的表示,例如去除批次效应或其他混杂因素后的表示。当然,hiddensc框架提供了多种降维方法供您选择,包括PCA和scvi。

第一种方案是使用PCA

feats = []
# 计算主成分的最佳数量
num_pcs, ks, ks_pval = hiddensc.models.determine_pcs_heuristic_ks(adata=adata, orig_label="binary_label", max_pcs=60)
optimal_num_pcs_ks = num_pcs[np.argmax(ks)]# 可视化
plt.figure(figsize=(4, 2))
plt.scatter(num_pcs, ks, s=10, c='k', alpha=0.5)
plt.axvline(x = optimal_num_pcs_ks, color = 'r', alpha=0.2)
plt.scatter(optimal_num_pcs_ks, ks[np.argmax(ks)], s=20, c='r', marker='*', edgecolors='k')
plt.xticks(np.append(np.arange(0, 60, 15), optimal_num_pcs_ks), fontsize=18)
plt.xlabel('Number of PCs')
plt.ylabel('KS')
plt.show()# 添加特征
x_pca = hiddensc.models.get_pca(adata, n_comps=optimal_num_pcs_ks)
feats['PCA'] = x_pca

图片

第二种方案是使用SCVI或者LinearSCVI的模型嵌入

feats = {}
# 指定嵌入模型的epoch训练轮数
n_epochs = 250
# 其实用到了两种模型嵌入
model_classes = [scvi.model.LinearSCVI, scvi.model.SCVI]
ks = [10]#, 20, 30, 40, 50]
combos = list(itertools.product(model_classes, ks))
# 训练与特征提取
for model_cls, k in tqdm(combos):local_adata = adata.copy()name = f'{model_cls.__name__}_{k}'model_cls.setup_anndata(local_adata, layer="counts")model = model_cls(local_adata, n_latent=k)model.train(max_epochs=n_epochs, plan_kwargs={"lr": 5e-3}, check_val_every_n_epoch=5)train_elbo = model.history["elbo_train"][1:]test_elbo = model.history["elbo_validation"]ax = train_elbo.plot()test_elbo.plot(ax=ax)plt.yscale('log')#plt.savefig(at_train_dir(f'{name}.png'))plt.title(name)feats[name] = model.get_latent_representation()plt.show()del local_adata

图片

值得注意的是,使用的降维方法全部放在一个字典feats即可。

②  生成预测

HiDDEN框架的第二个组成部分是一个预测模型,该模型根据降维特征和样本级标签进行训练(有意思的是,HiDDEN使用的是逻辑回归/SVM模型,还是比较容易实现的哈哈)。该模型的预测结果构成了每个细胞的连续扰动得分,可以用于探索扰动的潜在梯度效应,或进行聚类并生成精细的单个细胞二元标签。

feats = files.load_npz(at_results_dir('features.npz'))
y = (adata.obs['batch'].values == 'Case').astype(np.int32)
#y_true = (adata.obs['perturbed'].values == 'Memory B').astype(np.int32)
ids = adata.obs['barcodes'].values
pred_fns = {'logistic': hiddensc.models.logistic_predictions,'svm': hiddensc.models.svm_predictions}preds = [y]#, y_true]
info = [('batch', '','Case')]#, ('perturbed', '','Memory B')]
combos = list(itertools.product(feats.keys(), pred_fns.keys()))for feat_name, strat_name  in tqdm(combos):rand_state=0x = feats[feat_name]p_hat, p_labels = pred_fns[strat_name](x, y, 1, rand_state)preds.append(p_hat)info.append((feat_name, strat_name, 'p_hat'))preds.append(p_labels)info.append((feat_name, strat_name, 'p_label'))cols = pd.MultiIndex.from_tuples(info)
pred_df = pd.DataFrame(np.array(preds).T, index=adata.obs['barcodes'], columns=cols)
pred_df.to_csv(at_results_dir('predictions.csv'))
pred_df
# batch PCA LinearSCVI_10 SCVI_10
#logistic svm logistic svm logistic svm
#Case p_hat p_label p_hat p_label p_hat p_label p_hat p_label p_hat p_label p_hat p_label
#barcodes             
#naiveB_a_AAACCTGCACGGTAGA-1 1.000 0.543 0.000 0.546 1.000 0.437 0.000 0.461 0.000 0.375 0.000 0.401 0.000
#naiveB_a_AAACCTGCAGATGGGT-1 1.000 0.438 0.000 0.458 0.000 0.433 0.000 0.447 0.000 0.396 0.000 0.420 0.000
#naiveB_a_AAAGATGCATTTCAGG-1 0.000 0.302 0.000 0.439 0.000 0.359 0.000 0.409 0.000 0.370 0.000 0.409 0.000
#naiveB_a_AAAGCAAAGCCAACAG-1 0.000 0.393 0.000 0.449 0.000 0.407 0.000 0.430 0.000 0.469 0.000 0.481 0.000
#naiveB_a_AAAGCAAAGTGCCATT-1 1.000 0.531 0.000 0.500 0.000 0.562 0.000 0.535 0.000 0.418 0.000 0.441 0.000
#... ... ... ... ... ... ... ... ... ... ... ... ... ...
#memoryB_b_TGACTTTGTCACTTCC-1 1.000 0.629 1.000 0.545 1.000 0.563 0.000 0.545 0.000 0.548 1.000 0.534 1.000
#memoryB_b_TGTATTCGTTTGCATG-1 1.000 0.821 1.000 0.617 1.000 0.815 1.000 0.780 1.000 0.648 1.000 0.616 1.000
#memoryB_b_TGTATTCTCCTTTCTC-1 1.000 0.404 0.000 0.477 0.000 0.696 1.000 0.671 1.000 0.672 1.000 0.619 1.000
#memoryB_b_TTCTCCTCAGTCGATT-1 1.000 0.597 1.000 0.532 0.000 0.563 0.000 0.565 0.000 0.614 1.000 0.591 1.000
#memoryB_b_TTCTTAGTCGGCGCAT-1 1.000 0.762 1.000 0.587 1.000 0.761 1.000 0.716 1.000 0.679 1.000 0.625 1.000
#2054 rows × 13 columns
③ 可视化预测结果

根据上一小点的内容,分别设置降维以及预测模型的参数:

  • 降维技术DIM_RED:例如 "PCA"、"LinearSCVI_10"、"SCVI_10

  • 预测模型PRED_MODEL:如 "logistic"、"svm

IM_RED = 'PCA'
PRED_MODEL = 'logistic'

接下来,可以先可视化对照以及疾病组之间的p_hat差异(即所谓的二值化预测得分,模型输出的0-1范围概率)

df = sc.get.obs_df(adata, ['batch', 'binary_label'])
df.columns = ['batch', 'binary_label']
df['p_hat'] = pred_df[f'{DIM_RED}'][f'{PRED_MODEL}']['p_hat'].values
df['new_label'] = pred_df[f'{DIM_RED}'][f'{PRED_MODEL}']['p_label'].values
df[' '] = 1
# 可视化
plt.figure(figsize=(6, 4))
sns.violinplot(data=df, x="batch", y="p_hat", linewidth=1, scale='count', cut=0, order=['Control', 'Case'])
plt.show()

图片

然后,可以将细胞分为三种:控制组中的B细胞(默认没有扰动)Control_L0、疾病组中的B细胞类型01Case_L0(没有扰动)、疾病组中的B细胞类型1Case_L1(受到扰动的)。可视化疾病样本中分离的关键扰动细胞群Case_L1

# 设置标签
conditions = [(df['binary_label']==0),(df['binary_label']==1) & (df['new_label']==0),(df['binary_label']==1) & (df['new_label']==1)
]
values = ['Control_L0', 'Case_L0', 'Case_L1']
df['three_labels'] = np.select(conditions, values)# 可视化
plt.figure(figsize=(10, 5))
sns.violinplot(data=df, x="three_labels", y="p_hat", linewidth=1, scale='width', cut=0, order=['Control_L0', 'Case_L0', 'Case_L1'], palette=['lightblue', 'lightblue', 'orange'])
plt.ylabel('HiDDEN continuous score')
plt.xlabel("")
plt.show()# 看一下Case_L1的数量,攻击298个
np.sum(df['three_labels']=='Case_L1')
#298

图片

可以看到,Case_L1细胞群的二值化得分最高,是与疾病最潜在相关的细胞群体。

④ 这个时候就可以看看不同细胞群体的差异基因了!
adata.obs['new_label'] = pred_df[f'{DIM_RED}'][f'{PRED_MODEL}']['p_label'].values
de_genes = hiddensc.datasets.get_de_genes(adata, 'new_label')
de_genes.update(hiddensc.datasets.get_de_genes(adata, 'batch'))
de_genes
#{'0.0': array(['IGHD', 'TCL1A', 'BTG1', 'CXCR4', 'CD74', 'MEF2C', 'RPL18A',
#        'TMSB10', 'FCER2', 'HLA-DRA', 'MT-ND2', 'IGHM', 'HLA-DQB1',
#        'HLA-DRB1', 'IL4R', 'PLPP5', 'CD79B', 'HLA-DRB5', 'CD37', 'MT-CYB',
#        'RPS19', 'SERF2', 'MT-ATP6', 'LAPTM5', 'BIRC3', 'CD72', 'RPL21'],
#       dtype='<U8'),
# '1.0': array(['B2M', 'COTL1', 'RPS18', 'HLA-B', 'EEF1A1', 'RP5-887A10.1',
#        'RPS14', 'GAPDH', 'HLA-C', 'SLC25A6', 'JCHAIN', 'IGHA1', 'NEAT1',
#        'S100A6', 'HSPA8', 'IGHG1', 'RPS15A', 'ITGB1', 'RPL14', 'TPT1',
#        'RPS29', 'CLECL1', 'S100A4', 'RPS20', 'HLA-A', 'VIM', 'PTP4A2',
#        'CD27', 'GPR183', 'RPS8', 'YWHAZ', 'EEF2', 'RPL27A', 'S100A10',
#        'LY6E', 'RPLP1', 'TOMM7', 'MALAT1', 'CRIP1', 'PRKCB', 'ACTG1',
#        'AL928768.3', 'RP5-1171I10.5', 'EVI2B'], dtype='<U13'),
# 'Case': array([], dtype='<U1'),
# 'Control': array([], dtype='<U1')}# 比较一下原始的分组标签以及现在的标签识别到的差异基因:
print(de_genes['Control'].shape)
print(de_genes['Case'].shape)
print(de_genes['0.0'].shape)
print(de_genes['1.0'].shape)
#(0,)
#(0,)
#(27,)
#(44,)

如上所示,使用原始样本级标签进行 DE 测试,没有发现 DE 基因,也完全无法识别 DE 基因。然而,使用经 HiDDEN 精炼的二进制标签进行 DE 测试,却能识别出一些 Naive B 和 Memory B 标记。当然,可以可视化看一下:

adata.obs['three_labels'] = df['three_labels']
dp = sc.pl.dotplot(adata=adata, use_raw=False,var_names= de_genes['1.0'][0:25], groupby='three_labels',categories_order=['Control_L0', 'Case_L0', 'Case_L1'],#standard_scale = 'var',title='Label 1 Top 25 DE genes',figsize=(10, 2))
#dp.add_totals().style(dot_edge_color='black', dot_edge_lw=0.5).show()
plt.show()

图片

上面识别的Case_L1亚群表达多种Naive B细胞标记,验证了算法的准确性。

模型并不难理解 

关键还是得有好点子

至于方法的准确性

大伙可以评估试试

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三周精通FastAPI:33 在编辑器中调试

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/debugging/ 调试 你可以在编辑器中连接调试器&#xff0c;例如使用 Visual Studio Code 或 PyCharm。 调用 uvicorn 在你的 FastAPI 应用中直接导入 uvicorn 并运行&#xff1a; import uvicorn from fast…

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo&#xff0c;有网友留言如下图&#xff1a; 针对网友的留言&#xff0c;那么我们如何解决这个问题呢 Spring-Boot应用停机时&#xff0c;如何保证其内存消息都处理完成&#xff1f; 2.解决方法 方法其实挺简单的&…

vue3+vite搭建脚手架项目使用eletron打包成桌面应用+可以热更新

当前Node版本&#xff1a;18.12.0&#xff0c;npm版本&#xff1a;8.19.2 1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 可删掉index.html文件的title标签 2.配置package.json {"name": "my-vite-project","private": true,"versi…

【Golang】validator库的使用

package mainimport ("fmt""github.com/go-playground/validator" )// MyStruct .. validate:"is-awesome"是一个结构体标签&#xff0c;它告诉验证器使用名为is-awesome的验证规则来验证String字段。 type MyStruct struct {String string vali…

Linux(CentOS)安装 MySQL

CentOS版本&#xff1a;CentOS 7 MySQL版本&#xff1a;MySQL Community Server 8.4.3 LTS 1、下载 MySQL 打开MySQL官网&#xff1a;https://www.mysql.com/ 直接下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 其他版本 2、上传 MySQL 文件到 CentOS 使用F…

Pytorch实现transformer语言模型

转载自&#xff1a;| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型&#xff0c;使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…

<Project-20 YT-DLP> 给视频网站下载工具 yt-dlp/yt-dlp 加个页面 python web

介绍 yt-dlp Github 项目&#xff1a;https://github.com/yt-dlp/yt-dlp A feature-rich command-line audio/video downloader 一个功能丰富的视频与音频命令行下载器 原因与功能 之前我用的 cobalt 因为它不再提供Client Web功能&#xff0c;只能去它的官网使用。 翻 redd…

Sqli-Labs

目录 解题思路 题目设计原理 总结 解题思路 什么&#xff1f;sqli-labs&#xff1f;让我看看。还真是。想起了当初刚学被支配的恐惧。 悄咪咪点开第一关看看能不能秒了。测试闭合老样子&#xff0c;单引号闭合&#xff0c;双引号等都成功。这里 and 11 和 # 都不能通过检测&…

【基于Zynq FPGA对雷龙SD NAND的测试】

一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号&#xff0c;在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能&#xff0c;并且在意外掉电的情况下同样能保证数据的安全。 …

【NOIP提高组】引水入城

【NOIP提高组】引水入城 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊&#xff0c;刚好构成一个N行M列的矩形&#xff…

鸿蒙开发:arkts 如何读取json数据

为了支持ArkTS语言的开发&#xff0c;华为提供了完善的工具链&#xff0c;包括代码编辑器、编译器、调试器、测试工具等。开发者可以使用这些工具进行ArkTS应用的开发、调试和测试。同时&#xff0c;华为还提供了DevEco Studio这一一站式的开发平台&#xff0c;为运行在Harmony…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换&#xff08;warp&#xff09;。 该函数根据 ECC 标准 ([78]) 估计最优变换&#xff08;warpMatri…

【2024最新版Kotlin教程】Kotlin第一行代码系列第五课-类继承,抽象类,接口

【2024最新版Kotlin教程】Kotlin第一行代码系列第五课-类继承&#xff0c;抽象类&#xff0c;接口 为什么要有继承呢&#xff0c;现实中也是有继承的&#xff0c;对吧&#xff0c;你继承你爸的遗产&#xff0c;比如你爸建好了一个房子&#xff0c;儿子继承爸&#xff0c;就得了…

iOS用rime且导入自制输入方案

iPhone 16 的 cantonese 只能打传统汉字&#xff0c;没有繁简转换&#xff0c;m d sh d。考虑用「仓」输入法 [1] 使用 Rime 打字&#xff0c;且希望导入自制方案 [2]。 仓输入法有几种导入方案的方法&#xff0c;见 [3]&#xff0c;此处记录 wifi 上传法。准备工作&#xff1…

基于Zynq FPGA的雷龙SD NAND存储芯片性能测试

文章目录 前言一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 前言 随着嵌入式系统和物联网设备的快速发展&#xff0c;高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NA…

【动态规划 数学】2745. 构造最长的新字符串|1607

本文涉及知识点 C动态规划 数学 LeetCode2745. 构造最长的新字符串 给你三个整数 x &#xff0c;y 和 z 。 这三个整数表示你有 x 个 “AA” 字符串&#xff0c;y 个 “BB” 字符串&#xff0c;和 z 个 “AB” 字符串。你需要选择这些字符串中的部分字符串&#xff08;可以全…

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写 gitee地址&#xff1a; https://gitee.com/Mike_Zhou_Admin/Linux_Driver_Timestamp_Driver/更新以gitee为准 文章目录 timer库时间戳函数延时函数驱动代码应用测试附录&#xff1a;嵌入式Linux驱动开发基本步骤开发…

了解云计算工作负载保护的重要性及必要性

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

C语言 循环高级

时间&#xff1a;2024.11.6 一、学习内容 1、无限循环 无限循环&#xff1a;循环永远停不下来 注意点&#xff1a;无限循环因为永远停不下来&#xff0c;所以下面不能再写其他的代码了 2、break 跳转控制语句&#xff1a; 在循环的过程中&#xff0c;跳到其他语句上执行 #…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…