当前位置: 首页 > news >正文

范数,L2范数标准化,及其用法和意义

起因:Seurat:::FindModalityWeights() 函数用到L2标准化。

1. 范数

  • L1 norm就是绝对值相加,又称曼哈顿距离
  • L2 norm就是欧几里德距离,几个数字的平方和的开方。

2. L2范数标准化

(1) L2范数定义

L2范数(L2 norm),也称为欧几里德范数(Euclidean norm)或2-范数,是向量元素的平方和的平方根。它在数学和机器学习中经常被用作一种正则化项、距离度量或误差度量。

对于一个n维向量x = [x1, x2, …, xn],其L2范数可以通过以下公式计算:

||x||2 = sqrt(x1^2 + x2^2 + ... + xn^2)

(2) 矩阵L2范数标准化(R语言实现)

函数定义见: seurat-4.4.0/R/utilities.R:1720:L2Norm <- function(mat, MARGIN = 1)

# L2 normalize the columns (or rows) of a given matrix | 对矩阵的列(或行)做L2标准化
# @param mat Matrix to cosine normalize | 将要做cosine标准化的矩阵
# @param MARGIN Perform normalization over rows (1) or columns (2) | 默认对行做标准化
#
# @return returns l2-normalized matrix
#
L2Norm <- function(mat, MARGIN = 1){normalized <- Sweep(x = mat,MARGIN = MARGIN, #默认,按行。除以每一行的STATS = apply( # 行:平方和的开方X = mat,MARGIN = MARGIN,FUN = function(x){sqrt(x = sum(x ^ 2))}),FUN = "/")# 无穷大都改写为0: 除数是0导致无穷大,这一行全是0导致的normalized[!is.finite(x = normalized)] <- 0return(normalized)
}

(3) 手工实现:不考虑全是0的行

# 手工实现
tmp1=sweep(embeddings.list$pca,MARGIN = 1, STATS = apply(embeddings.list$pca, 1, function(x){sqrt( sum(x**2) )}),FUN = "/"
)
# 调用函数
tmp2 = Seurat:::L2Norm(embeddings.list$pca)all(abs(tmp1-tmp2)<1e-10) #T
tmp1[1:3, 1:4]
tmp2[1:3, 1:4]
#                          PC_1       PC_2        PC_3        PC_4
#AAACCTGAGACTCGGA-1  0.03717500 -0.7241838  0.16534230  0.06183454
#AAACCTGAGAGTACAT-1  0.02301086 -0.7453045  0.05282587  0.04039307
#AAACCTGAGATATACG-1 -0.05451243 -0.7092048 -0.01946849 -0.02317811

(4) L2标准化的意义

问题:输入是行为cell id,列为 PC_1 的cell embedding 矩阵,为什么对行做标准化?
我的解释:保证每一行的平方和都是1,也就是每个cell都在距原点单位1半径的球面上。

在机器学习中,L2范数经常用于模型正则化和特征归一化。通过在损失函数中添加L2范数的正则化项,可以降低模型的复杂度,避免过拟合。另外,L2范数还常用于计算向量之间的欧氏距离,用于衡量向量之间的相似性或差异性。

Ref

  • [1] https://blog.sina.com.cn/s/blog_71dad3ef010146c3.html
  • https://developer.aliyun.com/article/1316675
  • https://blog.csdn.net/weixin_43862398/article/details/137044386

http://www.mrgr.cn/news/52311.html

相关文章:

  • 闯关leetcode——111. Minimum Depth of Binary Tree
  • 【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码
  • 【MySQL】表的修改操作,插入查询结果
  • python爬虫实战案例——从移动端接口抓取微博评论,采用cookie登陆,数据存入excel表格,超详细(15)
  • 精英高匿ip的自述
  • PyQt5高级界面控件一
  • Java中使用protobuf
  • 江大白 | 目标检测YOLOv1-YOLO11,算法进化全记录(建议收藏!)
  • 双十一来袭,哪款宠物空气净化器值得入手?好用的宠物空净推荐
  • Redis-1
  • 每日OJ题_牛客_连续子数组最大和_线性dp_C++_Java
  • oracle 19c 配置开机自启动
  • 系统思考—战略共识
  • 10.17作业
  • 多态底层原理【附原理模型图】
  • 学习之上下文管理器
  • 提供综合康复服务的武汉自闭症全托管学校
  • 记一次有趣的发现-绕过堡垒机访问限制
  • 如何排查CPU占用率过高的问题
  • Redis过期Key的逐出策略