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

生信碱移

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.xdnf.cn/news/6242.html

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

相关文章

第十九周机器学习笔记:GAN的数学理论知识与实际应用的操作

第十九周周报 摘要Abstratc一、机器学习——GAN Basic Theory1. Maximum Likelihood Estimation2. 复习训练GAN的过程3. Objective function与JS散度相关性推导4. GAN的实际做法 总结 摘要 本周周报主要围绕生成对抗网络&#xff08;GAN&#xff09;的基础知识和理论进行深入探…

计算机网络八股文个人总结

1.TCP/IP模型和OSI模型的区别 在计算机网络中&#xff0c;TCP/IP 模型和 OSI 模型是两个重要的网络协议模型。它们帮助我们理解计算机通信的工作原理。以下是它们的主要区别&#xff0c;以通俗易懂的方式进行解释&#xff1a; 1. 模型层数 OSI 模型&#xff1a;有 7 层&#…

Web Workers 学习笔记

最近在开发中遇到了一个需求&#xff0c;一大堆的图片都需要调用两个接口。这对单线程的 JavaScript 运行环境构成了挑战&#xff0c;容易影响用户体验。所以决定学习 Web Workers 并记录一下。 Web Workers 的作用就是提供一个多线程环境&#xff0c;允许将一些繁重任务&…

YOLO11改进|注意力机制篇|引入HAT超分辨率重建模块

目录 一、HAttention注意力机制1.1HAttention注意力介绍1.2HAT核心代码二、添加HAT注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4三、yaml文件与运行3.1yaml文件3.2运行成功截图一、HAttention注意力机制 1.1HAttention注意力介绍 HAT模型 通过结合卷积特征提取与多尺度注意力机…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…

ElasticSearch认识

ElasticSearch是什么&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计&#xff0c;提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据&#xff0c;并且具备横向扩展能力&#…

在 Google Chrome 上查找并安装 SearchGPT 扩展

ChatGPT 搜索 (SearchGPT)&#xff0c;一个嵌入在流行的 ChatGPT 聊天机器人中的全新搜索引擎&#xff0c;可以改变人们搜索网页的方式。如果你想让它更容易找到并使用它&#xff0c;可以通过安装它的 Chrome 扩展程序。 ChatGPT 搜索是一个快速、精准且无广告的搜索引擎&…

两道算法题

一、算法一 Amazon would like to enforce a password policy that when a user changes their password, the new password cannot be similar to the current one. To determine whether two passwords are similar, they take the new password, choose a set of indices a…

嵌入式硬件电子电路设计(三)电源电路之负电源

引言&#xff1a;在对信号线性度放大要求非常高的应用需要使用双电源运放&#xff0c;比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗&#xff1f; 地的理解 负电压产生电路 BUCK电…

A019基于SpringBoot的校园闲置物品交易系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

字节青训-小S的倒排索引

问题描述 小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子&#xff0c;小S决定使用倒排索引。倒排索引的工作原理是&#xff1a;每个单词都会关联一个帖子ID的列表&#xff0c;这些帖子包含该单词&#xff0c;且ID按从小到大的顺序排列。 例…

2024 CSS - 基础保姆级教程系列一

CSS盒子模型 <style>.box {width: 200px;height: 100px;padding: 20px;} </style> <div class"box">盒子模型 </div><style>.box {width: 200px;height: 100px;padding: 20px;box-sizing: border-box;} </style> <div class&…

道品科技水肥一体化如何确定灌溉需水量呢?

在农业生产进程之中&#xff0c;持续攀升的生产成本&#xff0c;使农民苦不堪言。其一&#xff0c;水肥用量递增&#xff0c;致使成本上扬&#xff1b;其二&#xff0c;种植成效并不显著&#xff0c;所增经济收益颇为有限。另外&#xff0c;不科学的滴灌施肥亦破坏了农业环境架…

北航软件工程考研难度分析!

C哥专业提供——计软考研院校选择分析专业课备考指南规划 总体情况概述 北航软件工程学硕2024届呈现"稳中有降"态势。2024届复试线335分&#xff0c;较2023届上升25分&#xff0c;但较2022届下降10分。实际录取24人&#xff08;含实验室方向&#xff09;&#xff0c…

网页,app,微信小程序互相跳转

1.网页打开小程序 配置&#xff1a;登录小程序账号&#xff0c;找到账号设置&#xff0c;在基本设置中找到隐私与安全 在明文scheme中点击配置&#xff0c;填写要跳转的小程序页面地址即可 此处只展示一种实现方法&#xff0c;其他参照获取 URL Scheme | 微信开放文档 <a …

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

【工具】在线一维码生成器

在国外网站上看到一款条形码生成器&#xff0c;它是开源的&#xff0c;很好用。但是访问慢&#xff0c;也不支持下载一维码&#xff0c; 于是我把他翻译了过来&#xff0c;加上下载条码功能&#xff0c;再加了配色&#xff0c;让界面看上来更丰富 一个可直接使用的工具&#x…

PHM技术应用:发电机线棒高温预警

目录 1 案例背景 1.1 事件描述 1.2 设备概况 1.3 事件过程 2 系统动力学模型 典型工况 故障树 潜在业务提升 3 异常预警规则模型 4 故障排查逻辑 5 小结 1 案例背景 1.1 事件描述 某发电厂的某台发电机组&#xff0c;在满功率工况下&#xff0c;因发电机下层线棒温…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

是时候用开源降低AI落地门槛了

过去三十多年&#xff0c;从Linux到KVM&#xff0c;从OpenStack到Kubernetes&#xff0c;IT领域众多关键技术都来自开源。开源技术不仅大幅降低了IT成本&#xff0c;也降低了企业技术创新的门槛。 那么&#xff0c;在生成式AI时代&#xff0c;开源能够为AI带来什么&#xff1f;…