我对算法示例进行了一些更改。 最后一个例子错过了一些信息。我正在详细解释。可能存在一些基本问题,但我对循环不是很熟悉。
初始值
x<-matrix(c(1,1,1,1,
-1,-1,1,1,
-1,1,-1,1), nrow = 4)
w<-matrix(rep(0,15), nrow = 5)
d<-c(-1,1,1,1)
变量
v <- 10L
y <- 10L
e <- 10L
des <- 10L
m <- 0.5
循环的想法是为x的每一行找到w的值,直到d = i。如果你看到循环就更清楚了。
此循环运行良好,但仅适用于前5行。它必须在x上循环,直到满足条件(d = i)。 我知道这不是正确的做法。这只是为了举例说明我想做的事情。欢迎其他选项(申请)。
循环
for(i in 1:4) {
# Multiplies every row of x by w. The w comes from the result of the loop.
v[i]<- t(w[i,]) %*% x[i,]
# Takes the sign of v.
y[i] <- if(v[i] >= 0) 1 else -1
# Value to use in the last line of the loop.
e[i] <- d[i]-y[i]
des[i] <- if(d[i] == y[i]) 1 else 0 #check if condition is satisfied
w[i+1,] <- w[i,]+(m*e[i]*x[i,])
}
期望的输出
w <- matrix(c(0,-1,0,1,1,1,1,
0,1,0,1,1,1,1,
0,1,2,1,1,1,1), nrow=7)
答案 0 :(得分:0)
这段代码有点乱。提供所需的输出可能会有所帮助。这是因为,一般来说,在操作矩阵时,可以绕过缓慢的for循环。话虽如此,这应该有帮助
您的代码的第一个问题是您没有使用初始值。此外,您尝试对整数进行子集化,例如,v <- 10L
v[2]
将返回NA
。下面我预先分配了你以后使用的所有参数。
itr_n <- 3
v <- rep(NA, itr_n)
y <- rep(NA, itr_n)
e <- rep(NA, itr_n)
des <- rep(NA, itr_n)
res <- matrix(rep(NA, itr_n*itr_n), itr_n, itr_n) # this is a result matric to store
res[i, ] <- w #populating the row with info before we change w
for(i in 1:itr_n){
v[i]<- w %*% x[i,] #w[i,] was redundent since w is already a column vector
y[i] <- if(v[i] >= 0) 1 else -1
e[i] <- d[i] - y[i]
des[i] <- if(d[i] == y[i]) 1 else 0
res[i+1, ] <- w + (m*e[i]*x[i,]) #storing w in a res matrix
w <- res[i+1, ]
}