【问题标题】:stuck in an infinite loop, julia code陷入无限循环,朱莉娅代码
【发布时间】: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)

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

【问题讨论】:

  • 很明显,您的 yv 分配在 Julia 中的作用与在 R 中的不同。仅在 y 的子集上运行内部循环(在两种语言中)并查看实际值是您生成的。
  • 我想我发现了问题,sign(v*data[i,:]') 产生一个整数,而 y[i] 是一个浮点数。
  • 找到了解决办法:在for循环中将y[i]改为y[i,:]。

标签: r julia


【解决方案1】:

为了更完整地描述您自己找到的解决方案背后的问题,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 函数采用两个向量并计算它们的点积,这是一个标量。

【讨论】:

  • 谢谢,希望能尽快了解julia。这是一门很棒的语言。我做了这个例子来测试 R 中相同的东西的速度,结果非常好。
猜你喜欢
  • 2018-11-27
  • 2023-03-30
  • 2014-04-26
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 2014-02-04
  • 2014-12-31
  • 2017-01-15
相关资源
最近更新 更多