julia代码卡在无限循环中

时间:2013-12-30 21:41:33

标签: r julia

我尝试将我的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)

我总是愿意接受其他代码改进

1 个答案:

答案 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函数需要两个向量并计算它们的点积,这是一个标量。