余弦相似度及其生物信息学应用
时间:2022-07-22
本文章向大家介绍余弦相似度及其生物信息学应用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
众所周知,在R里面使用cor函数可以计算两个向量的相似情况,有两个参数尤为需要注意:
其中method参数是:One of "pearson" (default), "kendall", or "spearman": can be abbreviated.
然后use参数是:This must be (an abbreviation of) one of the strings "everything", "all.obs", "complete.obs", "na.or.complete", or "pairwise.complete.obs".
本来呢,pearson,kendall以及spearman这3个相关性公式就让人头疼了,但是最近我在教程:比较不同的肿瘤somatic突变的signature 发现两个不同算法的signature的相似性并不是和文章完全一致,原因是作者使用了一个cosine similarity(余弦相似度)的概念。
cosine similarity(余弦相似度)如何计算
简单搜索了一下它的介绍:
- 余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。
- 最常见的应用就是计算文本相似度。将两个文本根据他们词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。实践证明,这是一个非常有效的方法。
第一次搜索它在R里面的用法,发现了tcR包里面的cosine.similarity函数,就简单试用了一下。但是计算得到的结果很诡异,并不是范围在[-1,1]之间。
再次尝试搜索cosine similarity(余弦相似度),发现在 The repertoire of mutational signatures in human cancer 文章里面也提到了:
COSMIC数据库的signature需要更新
为何使用cosine similarity(余弦相似度)而不是简单的相关性系数呢?
前面我们搜索了解到,cosine similarity(余弦相似度)最常见的应用就是计算文本相似度,那么,为什么生物信息学领域里面的cosmic的signature的相似性要采用cosine similarity(余弦相似度)而不是常见的简单的相关性系数呢?
比如,同样的是对cosmic内置的30个signature互相计算相关性,如下:
# https://cancer.sanger.ac.uk/cancergenome/assets/signatures_probabilities.txt
cosmic=read.table('https://cancer.sanger.ac.uk/cancergenome/assets/signatures_probabilities.txt',
header = T,sep = 't')[,1:33]
head(cosmic[,1:4])
M=cor(cosmic[,4:33])
pheatmap::pheatmap(M)
出图如下:
而计算cosine similarity(余弦相似度)代码如下;
# 具体数学公式参考:https://www.jianshu.com/p/a894ebba4a1a
cos=function(x,y){
sum(x * y) / (sqrt(sum(x ^ 2)) * sqrt(sum(y ^ 2)));
}
M2=apply(cosmic[,4:33], 2, function(x){
apply(cosmic[,4:33], 2, function(y){
cos(x,y)
})
})
rownames(M2)=rownames(M)
pheatmap::pheatmap(M2)
出图如下:
虽然我做了探索,但是我其实并不明白为什么cosmic的signature的相似性要采用cosine similarity(余弦相似度)而不是常见的简单的相关性系数。
- 1050: [HAOI2006]旅行comf
- 某厂2016实习招聘安全技术试题答案及解析
- 3732: Network
- 洛谷P3388 【模板】割点(割顶)(tarjan求割点)
- 每天学一点Docker(3)(制作你的第一个容器)
- 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
- 1653: [Usaco2006 Feb]Backward Digit Sums
- 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场
- 1682: [Usaco2005 Mar]Out of Hay 干草危机
- 1637: [Usaco2007 Mar]Balanced Lineup
- AutoFac在项目中的应用
- 每天学一点Docker(5)——了解Docker架构
- 跨站请求伪造(CSRF/XSRF)
- 我这么玩Web Api(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实战|如何消除又臭又长的if...else判断更优雅的编程?
- 硬核 | 使用spring cache让我的接口性能瞬间提升了100倍
- 11张图让你彻底明白jdk1.7 hashmap的死循环是如何产生的
- 基于qiankun落地部署微前端爬”坑“记
- springboot面试杀手锏-自动配置原理
- 树酱的前端知识体系构建(上)
- 这8种保证线程安全的技术你都知道吗?
- 并发编程中cas的这三大问题你知道吗?
- 再也不用怕面试问二叉树了
- Redux快速上手
- CSP
- Saltstack_使用指南07_远程执行-执行模块
- 学习从拥有一支好笔开始
- Saltstack_使用指南08_远程执行-返回程序
- 人生苦短,何不用vim装13