1

R コードを Julia に変換しようとしましたが、Julia コードのパーセプトロン関数が無限ループになっていて、間違いを見つけることができません。

コードの動作: 1. [-1,1]^2 で 100 個のランダムなデータ ポイントを作成します。 fの上下2クラス(-1と1)で100点、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)

私は常に他のコードの改善にオープンです

4

1 に答える 1

3

自分で見つけた解決策の背後にある問題をより完全に説明するために、Julia は 1 つの要素を持つ配列とは異なる方法でスカラーを扱います。

julia> 5 == [5]
false

そのため、スカラーy[i]が行列 と等しいとテストされることはありませんv*data[i,:]'

あなたのソリューションは、書くためy[i,:]に、左辺と右辺の両方が行列であることを保証します。別の方法は、RHS の最初の要素を抽出することで、両側がスカラーであることを確認することですsign((v*data[i,:]')[1])

ただし、これを行うためのより良い方法があります (パフォーマンスを向上させたい場合にのみ重要です)。いくつかのヒント:

  • 一般に、1 次元のオブジェクトが必要な場合は、スペースではなくコンマを使用する必要があります。

    funkt = [1,m,b]  # Gives a 1-d array, [1 m b] gives a 2-d array
    ylist = sign(A*funkt)
    
  • メモリの格納方法により、行よりも列を抽出する方がはるかに効率的であるため、Aここにあるものの転置として定義することを検討してください。

  • このdot関数は 2 つのベクトルを取り、それらの内積 (スカラー) を計算します。

于 2013-12-31T11:25:49.467 に答える