我尝试将我的R代码翻译成Julia,但我在julia代码中的感知器功能处于无限循环中,我无法找到我的错误。
代码的作用: 1.在[-1,1] ^ 2中制作100个随机数据点 2.在[-1,1]中生成2个随机点,它们之间的直线f用作 线性分离器 3.将下面和上面的2个等级(-1和1)中的100个点分类为f,ylist是-1和1的列表,具体取决于类。 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)
我总是愿意接受其他代码改进
答案 0 :(得分:3)
为了更全面地描述您自己找到的解决方案背后的问题,Julia将标量与具有一个元素的数组区别对待:
julia> 5 == [5]
false
因此,标量y[i]
永远不会测试等于矩阵v*data[i,:]'
。
您的解决方案,写y[i,:]
,确保左侧和右侧都是矩阵。另一种方法是确保双方都是标量,你可以通过提取RHS的第一个元素来做,例如sign((v*data[i,:]')[1])
。
然而,有一些更好的方法可以做到这一点(只有你想要更好的性能才有意义)。一些提示:
通常,如果你想要一维对象,你应该使用逗号而不是空格:
funkt = [1,m,b] # Gives a 1-d array, [1 m b] gives a 2-d array
ylist = sign(A*funkt)
由于存储内存的方式,提取列比行更有效,因此您可以考虑将A
定义为此处的转置。
dot
函数需要两个向量并计算它们的点积,这是一个标量。