【发布时间】:2013-12-30 21:41:33
【问题描述】:
我尝试将我的 R 代码翻译成 Julia,但我在 Julia 代码中的感知器函数处于无限循环中,我找不到错误。
代码的作用: 1.在[-1,1]^2中做100个随机数据点 2.在[-1,1]中生成2个随机点,它们之间的直线f作为 线性分隔符 3.将100分分为f上下2个类(-1和1),ylist是-1和1s的列表,视类而定。 4. 用感知算法为f建立一个假设
R 代码:
#library(MASS)
#library(ggplot2)
n <- 100
datam <- matrix(c(rep(1,n), 2*runif(n)-1, 2*runif(n)-1), n)
a <- 2*runif(2)-1
b <- 2*runif(2)-1
f <- lm(a ~ b)
fff <- coef(f)
test <- c(1, fff[1], fff[2])
ylist <- sign(datam %*% test)
perceptron = function(datam, ylist) {
w <- c(1,0,0)
made.mistake = TRUE
while (made.mistake) {
made.mistake=FALSE
for (i in 1:n) {
if (ylist[i] != sign(t(w) %*% datam[i,])) {
w <- w + ylist[i]*datam[i,]
made.mistake=TRUE
}
}
}
return(w=w)
}
perceptron(datam,ylist)
朱莉娅代码:
n = 100
fp = [2*rand(2)-1 for i = 1:2 ]
A = [ones(n,1) c=2*rand(n)-1 d=2*rand(n)-1]
m = (fp[2][2]-fp[1][2])/(fp[2][1]-fp[1][1])
b = fp[2][2]-m*fp[2][1]
funkt = [1 m b]
ylist = sign(A*funkt')
w = A\ylist
function perceptron(data, y)
v = [1 0 0]
mistake = true
while mistake
mistake = false
for i = 1:n
if y[i] != sign(v*data[i,:]')
v = v + y[i]*data[i,:]
mistake = true
end
end
end
return v
end
perceptron(A,ylist)
我总是愿意接受其他代码改进
【问题讨论】:
-
很明显,您的
y或v分配在 Julia 中的作用与在 R 中的不同。仅在y的子集上运行内部循环(在两种语言中)并查看实际值是您生成的。 -
我想我发现了问题,sign(v*data[i,:]') 产生一个整数,而 y[i] 是一个浮点数。
-
找到了解决办法:在for循环中将y[i]改为y[i,:]。