范数,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)] <- 0
  return(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.youkuaiyun.com/weixin_43862398/article/details/137044386
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值