权威的药物预测训练集资源
为了实现上述目标,请按照以下步骤操作:
步骤 1: 导入必要的库和加载数据
R library(dplyr) library(ggpubr) library(cancergenomics)
步骤 2: 加载 CTRP 和 GDSC 数据
R 加载 CTRP 数据 ctrpdata <- readRDS(file = "pathtoCTRPdata.rds") 加载 GDSC 数据 gdscdata <- readRDS(file = "pathtoGDSCdata.rds")
步骤 3: 提取 CTRP 中的关键基因
R 计算每个基因与不同类别的相关系数 correlationresults <- ctrpdata %>% group_by(drug.name) %>% summarize(correlation = cor(gene.expression, drug.response)) 筛选相关性强的关键基因 keygenes <- correlationresults %>% filter(abs(correlation) > 0.7) %>% distinct(gene.name, drug.name)
步骤 4: 预处理 GDSC 数据集
`R
检查并处理缺失值
gdscdatapreprocessed <- gdsc_data %>%
na.omit()
进行 ComBat 校正以去除批次效应
combat_corrected <- ComBat(
dat = as.matrix(gdscdatapreprocessed),
batch = gdscbatchinfo,
mod = NULL,
par.prior = TRUE
权威的药物预测训练集资源
通常来说
Cancer Therapeutics Response Portal (CTRP)
目前主要是CTRP v2,官网是:http://portals.broadinstitute.org/ctrp.v2.1/
481 compounds X 860 CCLs
correlations to copy-number and gene-expression data
mutation data integrate CCLE and Sanger/MGH calls
correlation and enrichment analysis on-the-fly
box-whisker visualization in addition to enrichment heatmaps
drill-down to scatter plots and concentration-response curves
flter by lineage/subtype, growth mode
Genomics of Drug Sensitivity in Cancer (GDSC)
官网是:https://www.cancerrxgene.org/
如果是v2的版本,有809 Cell lines 以及 198 Compounds
如果是看v1版本,987 Cell lines 和 367 Compounds
资源都被整理好了
我们这里依赖预处理完成这两个数据库的rdata文件,并借助R包oncoPredict进行数据整合与分析操作。获取途径为https://osf.io/c6tfx/ ,
oncoPredict
Contributors: Danielle Maeser Robert Gruener
Date created: 2021-03-26 01:39 PM | Last Updated: 2021-08-15 10:44 PM
AI助手
下载约700M,重要的文件 如下所示;
171M Aug 14 17:10 CTRP2_Expr (RPKM, log2(x+1) Transformed).rds
177M Apr 3 2021 CTRP2_Expr (TPM, log2(x+1) Transformed).rds
1.1M Apr 3 2021 CTRP2_Res.rds
119M Apr 3 2021 GDSC1_Expr (RMA Normalized and Log Transformed).rds
2.0M Apr 3 2021 GDSC1_Res.rds
100M Apr 3 2021 GDSC2_Expr (RMA Normalized and Log Transformed).rds
906K Apr 3 2021 GDSC2_Res.rds
AI助手
通过 Cancer Therapeutics Response Portal (CTRP) 数据库可以获取到细胞系的基因表达数据矩阵,并且这些数据源自转录组测序实验。该数据库因此提供了FPKM值和TPM值两种计算方式供研究者进行选择和分析。
而言之, Genomics of Drug Sensitivity in Cancer (GDSC) 数据库中的cell line expression profile matrix应被视为芯片.这一结论源于该数据库采用RMA Normalized and Log Transformed作为常规的数据预处理方法.
代码探索 (GDSC) 数据库
直接看 v2的版本,有809 Cell lines 以及 198 Compounds
主要是一些包含800多种细胞系和大约2万个基因在内的表达数据矩阵,并与之相对应的是这些细胞系与大约200种药物之间的关系数据
library(reshape2)
library(ggpubr)
th=theme(axis.text.x = element_text(angle = 45,vjust = 0.5))
dir='./DataFiles/Training Data/'
GDSC2_Expr = readRDS(file=file.path(dir,'GDSC2_Expr (RMA Normalized and Log Transformed).rds'))
dim(GDSC2_Expr)
GDSC2_Expr[1:4, 1:4]
boxplot(GDSC2_Expr[,1:4])
df=melt(GDSC2_Expr[,1:4])
head(df)
p1=ggboxplot(df, "Var2", "value") +th
# Read GDSC2 response data. rownames() are samples, colnames() are drugs.
dir
GDSC2_Res = readRDS(file = file.path(dir,"GDSC2_Res.rds"))
dim(GDSC2_Res) # 805 198
GDSC2_Res[1:4, 1:4]
p2=ggboxplot(melt(GDSC2_Res[ , 1:4]), "Var2", "value") +th ; p2
# IMPORTANT note: here I do e^IC50 since the IC50s are actual ln values/log transformed already, and the calcPhenotype function Paul #has will do a power transformation (I assumed it would be better to not have both transformations)
GDSC2_Res <- exp(GDSC2_Res)
p3=ggboxplot(melt(GDSC2_Res[ , 1:4]), "Var2", "value") +th ; p3
library(patchwork)
p1+p2+p3
AI助手
如下所示 :

该表达量矩阵经过归一化处理效果显著;其采用RMA Normalized and Log Transformed方法;与大多数芯片数据分析方法相仿;其取值范围在0至15之间。
该药物的IC50指标,在原始RDS文件中具体而言,则是来自(GDSC)数据库的数据,在下载时已经被对数变换处理过。因此,在后续分析中,我们采用幂函数将其还原回原始数值。
在本研究中涉及的半抑制浓度(亦称半抑制率),即IC50值,在间接竞争ELISA标准曲线构建过程中具有重要参考价值。值得注意的是,在此过程中出现了多个专业术语:例如,在该方法体系下IC50值被定义为:等于药物浓度的一半能够杀死癌细胞的临界水平数值。
比如设计 0.01,0.1,1,10,100 这样的药物梯度
研究者们注意到当浓度达到1时能够有效杀死癌细胞;因此我们得出结论IC_{50}=0.5(通常情况下,在正常实验条件下不会出现浓度更高的反常结果)
可以看到,浓度 梯度设计决定了 IC50的分辨率,就是一个区间值就足够啦。
如果IC50值极高,并且即便解决了数百上千的问题也无济于事,则这种药物几乎完全无效。
如果IC50超级低,比如无限接近于0,说明这个药物就是传说中的灵丹妙药!
前面的部分图表展示了某一种药物对827个癌细胞系(数量超过8百)的IC5值数据分布情况。从图表中可以看出,在大多数癌细胞系中这些药物的效果都不理想。例如,在所展示的数据中可以看到两个显著表现欠佳的例子:" Cisplatin-1005" 和 "Cytarabine-1006" 的IC5值均高于设定的标准水平线(即表明这些药在此类癌细胞中的毒性可能较高)。值得注意的是,在本研究中仅对四种药物进行了分析。
除此之外,在特定细胞系的角度来看这些药物表现出显著效果而其他一些药物对整体效果无明显贡献
ggboxplot(melt(GDSC2_Res[ 1:4 ,]), "Var1", "value") +th
AI助手

考虑到每个细胞系的箱线图中包含了大约200种药物的数据展示,在这种情况下进行可视化分析难以直观看出每种具体药物的表现及其差异性。因此建议我们优先关注前几种表现最为突出的药物(top药物),以更清晰地了解其在不同细胞系中的作用和效果。
round(apply(GDSC2_Res[ 1:4 ,], 1, function(x){
return(c(
head(sort(x)),
tail(sort(x))
))
}),2)
COSMIC_906826 COSMIC_687983 COSMIC_910927 COSMIC_1240138
[1,] 0.00 0.00 0.00 0.05
[2,] 0.00 0.00 0.00 0.07
[3,] 0.01 0.01 0.01 0.09
[4,] 0.04 0.01 0.01 0.21
[5,] 0.05 0.01 0.01 0.95
[6,] 0.05 0.01 0.01 0.98
[7,] 2174.67 310.59 286.42 922.01
[8,] 2285.10 405.44 388.50 925.43
[9,] 2859.17 413.01 471.66 939.02
[10,] 3736.69 436.98 489.76 989.15
[11,] 5118.44 626.42 623.64 1105.89
[12,] 15431.05 973.87 803.89 1457.11
AI助手
可以看出,在各种细胞系中都存在特定的内部药物和废弃物药物。其中IC50值接近零的就是最佳选择;而那些具有高值且毒性极高的则是不理想的候选。
但是,我们可能是更想看到的是药物名字啦!
apply(GDSC2_Res[ 1:4 ,], 1, function(x){
names(x)=gsub('_[0-9]*','',colnames(GDSC2_Res))
return(c(
names(head(sort(x))),
names(tail(sort(x)))
))
})
COSMIC_906826 COSMIC_687983 COSMIC_910927 COSMIC_1240138
[1,] "Sepantronium bromide" "Daporinad" "Dactinomycin" "Luminespib"
[2,] "Bortezomib" "Sepantronium bromide" "Sepantronium bromide" "CDK9"
[3,] "Dactinomycin" "Dactinomycin" "Bortezomib" "Dinaciclib"
[4,] "Rapamycin" "Bortezomib" "Vinblastine" "Dactinomycin"
[5,] "Dactolisib" "Docetaxel" "Docetaxel" "CDK9"
[6,] "Docetaxel" "Vinblastine" "Luminespib" "Sabutoclax"
[7,] "KU-55933" "EPZ5676" "AZD1208" "IAP"
[8,] "EPZ5676" "Carmustine" "Nelarabine" "Mirin"
[9,] "Acetalax" "Selumetinib" "Doramapimod" "PFI3"
[10,] "Nelarabine" "Nelarabine" "SB216763" "ML323"
[11,] "Doramapimod" "Acetalax" "Carmustine" "AZD5991"
[12,] "Temozolomide" "5-Fluorouracil" "Temozolomide" "Carmustine"
AI助手
前面的6个药物是各自细胞系的神药,后面的6个是废物药物啦。
我们现在可以通过调用R包中的oncoPredict函数来获取针对你构建的表达量矩阵的药物反应预测结果。通过分析这些结果,我们可以更好地理解药物与基因表达之间的潜在关联。
发表oncoPredict这个包的文献非常新:《oncoPredict: an R package for predicting in vivo or cancer patient drug response and biomarkers from cell line screening data》这篇文献非常新, 这个通讯作者也是2014年r包pRRophetic同一个人, 用词可以说成是重复利用同一研究成果

使用oncoPredict之前先安装,代码如下:
install.packages("oncoPredict")
AI助手
如果遇到版本问题,请看:https://mp.weixin.qq.com/s/HGfePIQP4yP_nvhjiWdpAQ
使用方法超级简单
为了更好地进行后续分析步骤,请先获取或导入训练集中的表达量矩阵数据及相关的药物处理信息,并参照之前的详细指南:[药物预测之认识表达量矩阵和药物IC50](https://mp.weixin.qq.com/s?__biz=MzAxMDkxODM1Ng==&mid=2247507359&idx=1&sn=e1b1602338792b6bbd7283bbcc07fe81&scene=21#wechat_redirect "药物预测之认识表达量矩阵和药物IC50)
rm(list = ls()) ## 魔幻操作,一键清空~
options(stringsAsFactors = F)
library(oncoPredict)
library(data.table)
library(gtools)
library(reshape2)
library(ggpubr)
th=theme(axis.text.x = element_text(angle = 45,vjust = 0.5))
dir='./DataFiles/Training Data/'
GDSC2_Expr = readRDS(file=file.path(dir,'GDSC2_Expr (RMA Normalized and Log Transformed).rds'))
GDSC2_Res = readRDS(file = file.path(dir,"GDSC2_Res.rds"))
GDSC2_Res <- exp(GDSC2_Res)
AI助手
基于Genomics of Drug Sensitivity in Cancer(GDSC)v2版本的数据集作为研究范例,在获取训练集的基因表达矩阵以及药物处理信息后,还需导入你需要用于预测的目标基因表达矩阵。
由于这是一个教程,在不获取自己的表达量矩阵的情况下,直接从GDSC v2中随机选取10个细胞系作为需要预测的矩阵。
testExpr<- GDSC2_Expr[,sample(1:ncol(GDSC2_Expr),10)]
testExpr[1:4,1:4]
colnames(testExpr)=paste0('test',colnames(testExpr))
dim(testExpr)
AI助手
对训练集构建了表达量矩阵,并整合了药物处理信息;随后生成了待预测的目标表达量矩阵;接下来就是一个函数的应用场景;该R包中的核心功能模块是名为calcPhenotype的功能模块
calcPhenotype(trainingExprData = GDSC2_Expr,
trainingPtype = GDSC2_Res,
testExprData = testExpr,
batchCorrect = 'eb', # "eb" for ComBat
powerTransformPhenotype = TRUE,
removeLowVaryingGenes = 0.2,
minNumSamples = 10,
printOutput = TRUE,
removeLowVaringGenesFrom = 'rawData' )
AI助手
该函数的执行效率与你的计算能力有关...大约需要半个多小时...目前并未发现该函数具备多线程处理的可能性...因此只能耐心等待大约半小时的时间...不妨来上一杯咖啡休息一下...如果有兴趣的话,请您在咱们《生信技能树》公众号的任意一篇教程结尾处打赏一杯咖啡作为感谢也行...让我们一起耐心等待这大约半小时的时间。
从函数运行的log日志来看,本质上就是一个岭回归:
17419 gene identifiers overlap between the supplied expression matrices...
Found2batches
Adjusting for0covariate(s) or covariate level(s)
Standardizing Data across genes
Fitting L/S model and finding priors
Finding parametric adjustments
Adjusting the Data
4650 low variabilty genes filtered.
Fitting Ridge Regression model
Calculating predicted phenotype...
Done making prediction for drug 1 of 198
Fitting Ridge Regression model...
Calculating predicted phenotype...
Done making prediction for drug 2 of 198
AI助手
可以说这是机器学习中的一个基础方法。
如果对其他机器学习方法感兴趣的话,请参考生信菜鸟团鲍志炜的详细讲解。
#新开号#一起探索人工智能的新征程!
机器学习技术中的实践应用:朴素贝叶斯算法
该课程深入讲解了机器学习的核心算法原理与实现方法
机器学习实战中的支持向量机第一课
机器学习实践——支持向量机(Sklearn)核心参数深入解析
该公众号文章探讨的是'机器学习技术'中的'数据预处理环节'
机器学习实践-机器学习评测指标
在本教程中,我们深入探讨了机器学习中的特征选择问题,并结合实际案例展示了其重要性
在本课程中涉及的机器学习实践主要集中在分类模型的学习与应用上
生物代谢工作流 - 微生物组学分析过程
实际上,在生物信息学领域中普遍认为R语言的应用更为广泛。通常只需要导入一个现成的R包或调用一个简单的函数就能完成大部分任务。因此,并非学习Python是必须的前提条件。如果对统计分析不太熟悉的话可能会觉得Python是一个不错的选择
解读药物预测结果
在R包oncoPredict的核心函数calcPhenotype运行完成后, 会生成位于当前工作目录中的$calcPhenotype_Output文件夹, 其中包含一个DrugPredictions.csv文件, 这些内容均为函数calcPhenotype预先固定好的
library(data.table)
testPtype <- fread('./calcPhenotype_Output/DrugPredictions.csv', data.table = F)
testPtype[1:4, 1:4]
AI助手
基于不同数据库资源构建的函数训练集能够带来显著差异的结果哦!此外,在模型设计阶段还可以通过调节多个参数来优化整体性能。
药物预测之相关性为什么不行
原创 生信技能树 生信技能树 2021-10-07 08:16
收录于合集#药物预测5个
基于之前的学习内容,在深入理解了药物反应数据库的基础上,熟悉了Cancer Therapeutics Response Portal (CTRP)和Genomics of Drug Sensitivity in Cancer (GDSC)这两个数据库资源。此外还详细讲解了如何使用oncoPredict R包及其应用方法,并提供了有关pRRophetic R包的具体使用信息。
可参考上述链接了解有关pRRophetic的信息
今天我想开始学习药物预测的基本原理。首先我们来看看仅仅关注相关性因素是否足以实现有效的药物预测呢?
首先认识需要预测的表达量矩阵
我们采用Bortezomib的表达量矩阵来预测所有样本对这种药物的作用结果!作为第一种蛋白酶体抑制剂,在临床试验中显示出显著的抗肿瘤活性。该数据集位于pRRophetic包中的bortezomibData数据集内。
library(pRRophetic)
data(bortezomibData)
dim(exprDataBortezomib)
exprDataBortezomib[1:4,1:4]
boxplot(exprDataBortezomib[1:4,])
# 264个样品的表达量矩阵
table(studyResponse)
# 264个病人的结局 (药物处理后)
PGx_Responder = IE PGx_Responder = NR PGx_Responder = R
25 126 113
AI助手
具体是哪种癌症及适用的患者群体,则需要参考该文章及其来源的数据集。然而药物处理后的结果或现象则比较明显。主要涉及的是区分R和NR这两种情况的核心问题,即研究对象是否存在响应性的简单情况。
然后提取Bortezomib这个药物的数据资源
基于上述掌握的信息
rm(list = ls())
library(pRRophetic)
# exprMatCcle (ccleData)
data(cgp2016ExprRma)
dim(cgp2016ExprRma)
data(PANCANCER_IC_Tue_Aug_9_15_28_57_2016)
length(unique(drugData2016$Drug.name))
unique(drugData2016$Drug.name)
AI助手
如下所示的表达量矩阵和药物信息 :
> cgp2016ExprRma[1:4,1:4]
CAL-120 DMS-114 CAL-51 H2869
TSPAN6 7.632023 7.548671 8.712338 7.797142
TNMD 2.964585 2.777716 2.643508 2.817923
DPM1 10.379553 11.807341 9.880733 9.883471
SCYL3 3.614794 4.066887 3.956230 4.063701
> drugData2016[1:4,1:4]
Drug.name Drug.Id Cell.line.name Cosmic.sample.Id
1 Erlotinib 1 MC-CAR 683665
2 Erlotinib 1 ES3 684055
3 Erlotinib 1 ES5 684057
4 Erlotinib 1 ES7 684059
AI助手
现在我们提前Bortezomib这个药物的反应情况:
Bort_drugs=drugData2016[drugData2016$Drug.name=='Bortezomib',]
dim(Bort_drugs)
kp = Bort_drugs$Cell.line.name %in% colnames(cgp2016ExprRma)
table(kp)
Bort_drugs=Bort_drugs[kp,]
pos=match( Bort_drugs$Cell.line.name ,colnames(cgp2016ExprRma) )
Bort_ExprRma=cgp2016ExprRma[,pos]
AI助手
从 Genomics of Drug Sensitivity in Cancer (GDSC) 数据库可以看出,在该数据库中存在1018个不同的癌种细胞系样本数据。然而仅具有Bortezomib药物处理记录的细胞系数量为389个。值得注意的是,在这之中仅有38个细胞系不仅拥有Bortezomib药物处理记录,却未能提供相应的基因表达数据矩阵。
合并两个表达量矩阵
两个表达量矩阵各自的技术都不一样,所以肯定是存在批次效应的,
ids=intersect(rownames(Bort_ExprRma),rownames(exprDataBortezomib))
m=cor(cbind(exprDataBortezomib[ids,],
Bort_ExprRma[ids,]))
library(pheatmap)
pheatmap(m)
ac=data.frame(batch=c(
rep('test',ncol(exprDataBortezomib)),
rep('GDSC',ncol(Bort_ExprRma))
))
rownames(ac)=colnames(m)
pheatmap(m,show_rownames = F,show_colnames = F,
annotation_col = ac)
AI助手
两个表达量矩阵的基因交集居然只有一万多个 :
> dim(exprDataBortezomib)
[1] 22283 264
> dim(Bort_ExprRma)
[1] 17419 389
> length(ids)
[1] 11437
AI助手
各自的表达量矩阵的相关性如下所示:

批次效应
通过分析可以看出,在这项研究中存在明显的批次效应现象需要注意。值得注意的是,在这种情况下我们仍然建议选择具有相关性最高的处理方案。
ch_m=m[1:ncol(exprDataBortezomib),
(ncol(exprDataBortezomib)+1):ncol(m)]
pheatmap(ch_m,show_rownames = F,show_colnames = F)
ch_m[1:4,1:4]
colnames(Bort_drugs)
pred_drug = Bort_drugs[apply(ch_m, 1, which.max), "IC50"]
boxplot(pred_drug~studyResponse)
AI助手
从观察结果来看,在不同批次的样本中进行Bortezomib药物处理后,并没有出现明显的差异。实际上不同批次的样本在该处理中应呈现R与NR两类结果。

而我将基础的相关性预测结果与之前使用的R包进行比较,并参考了药物预测R包之pRRophetic的研究结果显示, 未表现出一致的结果.
既然有批次效应,去除后会不会好一点呢?
最简单的当然是sva去除啦!
combat_edata1 = ComBat(dat=as.matrix(m),
batch=c(
rep('test',ncol(exp_test)),
rep('GDSC',ncol(exp_db))
), mod=NULL,
par.prior=T, prior.plots=F)
combat_edata1[1:4,1:4]
AI助手
有意思的一点是,在长期的研究过程中一直是这样吗?sva确实消除了两个表达量矩阵之间的差异性影响。值得注意的是,在这种情况下预测的效果略高于预期:就R组(即对药物敏感型菌株而言)而言,在计算IC50值时发现明显低于预期水平。

尽管之前使用的R包预测结果(见:药物预测R包之pRRophetic )与当前研究的相关程度不高,但二者之间确实存在显著的正向统计学关联,并不能简单地将之前的R包预测结果(见:药物预测R包之pRRophetic )视为最佳标准。
也就是我们对需要预测的表达量矩阵进行处理:将其简单地与存在于数据库中的具有药物作用信息的表达量矩阵进行相关度计算(在排除批次效应的影响下),从而为每一个样本寻找与其最匹配的数据库样本,并将这些样本对应的药物作用值直接赋值给预测样本。这样一来,在排除了潜在偏差因素的前提下所获得的结果仍然具有一定的合理性和可靠性。
相关性预测药物效果的逻辑链
通过数据库资源进行筛选出与目标样本具有最高表达量相关性的样本,并将该选定样品的药物作用值作为预测样本的作用值。
这种方法虽然不够理想但仍然算是一种可行的方法。
其理论依据在于药物作用与表达量之间的关系呈现明显的线性特征。
举个例子来说吧,在研究 facial attractiveness 和 income 关系时, 我们收集了2万名个体的面部特征数据及其对应的年收入数据. 研究发现二者呈现显著线性关系, 面部吸引力越高, 收入水平也越高. 然而具体的相关系数尚不清楚, 这一点暂未深入分析. 在一个新组建的研究团队中, 团队成员们的收入信息尚未收集, 但他们的面部特征是可以被测量和评估的. 因此, 我们采取的方法是对每个人进行面部打分, 并在数据库中找出与其最相似的数据样本. 这样一来, 我们便能够推断出该人的可能年收入.
听起来似乎是一个合理的假设前提。但需要注意的是,这一方法建立了一个重要的假设前提:即2万人的颜值与收入之间存在显著的线性关系。例如,在某些情况下(如马云的例子),低收入者反而具有较高的颜值水平。然而,在实际情况中,并非所有人的收入都随着颜值呈线性增长(例如像马云这样的高收入者却具有相对较低的颜值)。这意味着这种简单的线性关系可能并不适用于所有情况(实际上可能是一个二次函数关系)。如果你还记得一点以前学过的数学知识就可以想象得到同样的超高收入会对应着两种极端的情况:例如马云和李彦宏这两者的共同点在于拥有相似的高收入水平但却呈现出不同的外貌特征。
让我们深入研究GDSC数据库中的各标本基因组学数据与各药物处理后的IC50值之间的关联性如何。
d=as.matrix(dist(cor(Bort_ExprRma[,order(Bort_drugs$IC50)])))
df=data.frame(dist=d[1,],
ic50=sort(Bort_drugs$IC50))
library(ggpubr)
ggscatter(df, x = "dist", y = "ic50",
color = "black", shape = 21, size = 3, # Points color, shape and size
add = "reg.line", # Add regressin line
add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
conf.int = TRUE, # Add confidence interval
cor.coef = TRUE, # Add correlation coefficient. see ?stat_cor
cor.coeff.args = list(method = "pearson", label.sep = "\n")
)
AI助手
略微有点尴尬,基本上没有相关性:

基本上没有相关性
感到头疼的是,在颜值与收入之间没有明显的关联性时(或者:由于在颜值与收入之间缺乏明显关联性的情况下),我们为何还在考虑一个人的颜值来预测其收入呢?
作为学徒完成一项作业,在drugData2016这个包含数百种药物的数据集中,对其中每一个药物进行相关性分析,并观察是否有部分药物与该数据集在表达量上的相关性显著。
值得注意的是:该dist函数支持多种距离计算方式如欧氏距离、极大值距离、曼哈顿距离、余弦相似度、二进制相似度或明氏距离等这些选项在编程实现中可以根据需求灵活选择出于教学简明的目的此处不做进一步详细阐述
