【发布时间】:2015-01-28 12:03:22
【问题描述】:
我正在尝试在 R 上实现正则化潜在语义索引 (RLSI) 算法。
原始论文可以在这里找到:
http://research.microsoft.com/en-us/people/hangli/sigirfp372-wang.pdf
下面是我的代码。
在这里,我从两个矩阵 U 和 V 生成一个矩阵 D。U 的每一列对应一个主题向量,并且它是稀疏的。之后,我在 D 矩阵上应用 RLSI,看看是否可以将其分解为两个矩阵,其中一个具有像 U 这样的稀疏向量。
但是,生成的 U 远非稀疏。实际上,它的每个元素都是用数字填充的。
我的代码有问题吗?
非常感谢您。
library(magrittr)
# functions
updateU <- function(D,U,V){
S <- V %*% t(V)
R <- D %*% t(V)
for(m in 1:M){
u_m <- rep(0, K)
u_previous <- u_m
diff_u <- 100
while(diff_u > 0.1){
for(k in 1:K){
w_mk <- R[m,k] - S[k,-k] %*% U[m,-k]
in_hinge <- (abs(w_mk) - 0.5 * lambda_1)
u_m[k] <- (ifelse(in_hinge > 0, in_hinge, 0) * ifelse(w_mk >= 0, 1, -1)) / S[k,k]
}
diff_u <- sum(u_m - u_previous)
u_previous <- u_m
}
U[m,] <- u_m
}
return(U)
}
updateV <- function(D,U,V){
Sigma <- solve(t(U) %*% U + lambda_2 * diag(K))
Phi <- t(U) %*% D
V <- Sigma %*% Phi
return(V)
}
# Set constants
M <- 5000
N <- 1000
K <- 30
lambda_1 <- 1
lambda_2 <- 0.5
# Create D
originalU <- c(rpois(50000, lambda = 10), rep(0, 100000)) %>% sample(., 150000) %>% matrix(., M, K)
originalV <- rpois(30000, lambda = 5) %>% sample(., 30000) %>% matrix(., K, N)
D <- originalU %*% originalV
# Initialize U and V
V <- matrix(rpois(30000, lambda = 5), K, N)
U <- matrix(0, M, K)
# Run RLSI (iterate 100 times for now)
for(t in 1:100){
cat(t,":")
U <- updateU(D,U,V)
V <- updateV(D,U,V)
loss <- sum((D - U %*% V) ^ 2)
cat(loss, "\n")
}
【问题讨论】:
-
你能把你的问题归结为一个最小的工作示例吗?
-
谢谢,罗曼。我认为这是最小的,它没有工作......然而,我昨天在代码中发现了一个错误,我已经在下面指出了。
标签: r optimization machine-learning nlp