You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于R中实现斯坦福MMDS第9.4节矩阵UV分解的函数问询

矩阵UV分解的R语言实现与相关工具推荐

Hey there! Let's tackle your question about UV matrix decomposition in R, including aligning with the approach from MMDS Chapter 9.4.

一、自定义UV分解实现(匹配MMDS章节逻辑)

First, let's start with a custom implementation to mirror the core mechanics described in the chapter. The chapter mentions gradient descent, but alternating least squares (ALS) is a more practical, stable alternative for this problem. We'll include both versions:

1. 交替最小二乘(ALS)版本

# Custom UV decomposition using Alternating Least Squares (ALS)
uv_decompose_als <- function(M, k, lambda = 0.1, max_iter = 100, tol = 1e-6) {
  # M: 输入矩阵(m×n)
  # k: 分解后的秩
  # lambda: 正则化参数
  # max_iter: 最大迭代次数
  # tol: 收敛阈值
  
  m <- nrow(M)
  n <- ncol(M)
  
  # 初始化U和V矩阵
  set.seed(123) # 保证结果可复现
  U <- matrix(rnorm(m * k), nrow = m)
  V <- matrix(rnorm(n * k), nrow = n)
  
  prev_error <- Inf
  
  for (iter in 1:max_iter) {
    # 固定V,更新U
    U <- solve(t(V) %*% V + lambda * diag(k), t(V) %*% t(M)) %>% t()
    
    # 固定U,更新V
    V <- solve(t(U) %*% U + lambda * diag(k), t(U) %*% M) %>% t()
    
    # 计算带正则化的重构误差
    current_error <- norm(M - U %*% t(V), "F")^2 + lambda * (norm(U, "F")^2 + norm(V, "F")^2)
    
    # 检查收敛
    if (abs(prev_error - current_error) < tol) {
      cat("迭代", iter, "次后收敛\n")
      break
    }
    
    prev_error <- current_error
  }
  
  return(list(U = U, V = t(V), final_error = prev_error))
}

# 示例使用
set.seed(123)
sample_matrix <- matrix(rnorm(100), nrow = 10)
decomp_result <- uv_decompose_als(sample_matrix, k = 3)
# 重构矩阵
recon_matrix <- decomp_result$U %*% decomp_result$V

2. 梯度下降版本(完全匹配MMDS 9.4节描述)

# UV decomposition using Gradient Descent (matches MMDS Chapter 9.4)
uv_decompose_gd <- function(M, k, lambda = 0.1, lr = 0.001, max_iter = 1000, tol = 1e-6) {
  m <- nrow(M)
  n <- ncol(M)
  
  set.seed(123)
  U <- matrix(rnorm(m * k), nrow = m)
  V <- matrix(rnorm(k * n), nrow = k)
  
  prev_error <- Inf
  
  for (iter in 1:max_iter) {
    # 计算U的梯度
    grad_U <- -2 * (M - U %*% V) %*% t(V) + 2 * lambda * U
    # 计算V的梯度
    grad_V <- -2 * t(U) %*% (M - U %*% V) + 2 * lambda * V
    
    # 更新U和V
    U <- U - lr * grad_U
    V <- V - lr * grad_V
    
    # 计算带正则化的误差
    current_error <- norm(M - U %*% V, "F")^2 + lambda * (norm(U, "F")^2 + norm(V, "F")^2)
    
    if (abs(prev_error - current_error) < tol) {
      cat("迭代", iter, "次后收敛\n")
      break
    }
    
    prev_error <- current_error
  }
  
  return(list(U = U, V = V, final_error = prev_error))
}

# 示例使用
gd_decomp_result <- uv_decompose_gd(sample_matrix, k = 3)

二、现成的R语言工具包

If you don't want to build from scratch, several R packages implement UV-style regularized low-rank matrix decomposition, which align with the MMDS chapter's framework:

  • recommenderlab: 专为推荐系统设计(UV分解的典型应用场景),通过Recommender(data, method = "ALS")实现带正则化的ALS分解,支持显式/隐式评分,完全匹配章节中的正则化低秩近似逻辑。
  • softImpute: 主打矩阵补全,但核心的低秩分解采用了类似的正则化最小二乘框架,通过softImpute(type = "svd")可实现接近UV分解的效果,适合大规模数据集。
  • irlba: 主要用于截断奇异值分解(SVD),但SVD是UV分解的特殊正交形式,结合正则化调整后,可适配章节中的非正交UV分解需求。

三、关于MMDS 9.4节的专属实现

目前没有专门针对该章节梯度下降版UV分解的官方包,但上面的自定义梯度下降函数完全复现了章节中的算法步骤。如果追求效率,推荐使用ALS版本或recommenderlab中的实现——它们的收敛速度和稳定性都优于 vanilla 梯度下降,且核心逻辑与章节一致。

内容的提问来源于stack exchange,提问作者Vanessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:25:04