Indexing problem

131 views
Skip to first unread message

Patrik Waldmann

unread,
Nov 16, 2016, 1:36:57 PM11/16/16
to julia-users
Hi,

I'm an R user trying to learn Julia. I got hold of some code from the Knet package that I was playing around with. My goal is to set values to zero in a loop based on a logical expression, but I cannot figure out how the indexing works. Any help would be appreciated (the problem lies in w[1,(w[1].<z)&(w[1].>-(z))] = 0):

using Knet
predict(w,x) = w[1]*x .+ w[2]
lambda = 2
z = Array{Float64}(1,13)
loss(w,x,y) = sumabs2(y - predict(w,x)) / size(y,2)
lossgradient = grad(loss)
function train(w, data; lr=.1)
    for (x,y) in data
        dw = lossgradient(w, x, y)
        z[:] = lr * lambda
        w[1] -= lr * dw[1]
        w[2] -= lr * dw[2]
        w[1,(w[1].<z)&(w[1].>-(z))] = 0
    end
    return w
end
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data"
rawdata = readdlm(download(url))
x = rawdata[:,1:13]'
x = (x .- mean(x,2)) ./ std(x,2)
y = rawdata[:,14:14]'
w = Any[ 0.1*randn(1,13), 0 ]
niter = 25
lossest = zeros(niter)
for i=1:niter; train(w, [(x,y)]); lossest[i]=loss(w,x,y); end


Best regards,

Patrik

Jeffrey Sarnoff

unread,
Nov 17, 2016, 12:58:14 AM11/17/16
to julia-users
good things to know about how indexing works


The indices for a Vector, or a column or row of a Matrix start at 1

```
length(avector)   # gets the number of elements in avector

avector[1]        # gets the first item in avector
avector[end]      # gets the final item in avector 
avector[1:end]    # gets all elements of avector

int_column_vector = [10, 20, 30]
 10
 20
 30

int_column_vector[1]
 10
# do not use zero as an index
int_column_vector[ ]
ERROR: BoundsError:
# do not use false, true as indices because avec[ false ] means avec[ 0 ]

```

in ` w[1,(w[1].<z)&(w[1].>-(z))] = 0 `, the second index can simplify to `false`   (consider this)
```
avec = [ 10, 20, 30 ]
avec1 = avec[ 1 ] 
avec1 == avec[ 1 + false ]
avec2 = avec[  2 ]
avec2 == avec[ 1 + true ] 
```

As a start, recheck indexing expressions, be more sure they do what you want them to do.

Patrik Waldmann

unread,
Nov 17, 2016, 4:39:14 AM11/17/16
to julia-users
I guess I should have explained my problem clearer. If I run the code without w[1,(w[1].<z)&(w[1].>-(z))] = 0, and do:
dump(w)
Array{Any}((2,))
  1:
Array{Float64}((1,13))
[-0.681392 0.595298 … 0.893845 -3.5044]
  2: Float64 22.447679788630705

and
println(w[1])
[-0.681392 0.595298 -0.394906 0.776983 -1.11178 3.11679 -0.0984956 -2.18501 0.928204 -0.484802 -1.86844 0.893845 -3.5044]

println(w[1,1])
[-0.681392 0.595298 -0.394906 0.776983 -1.11178 3.11679 -0.0984956 -2.18501 0.928204 -0.484802 -1.86844 0.893845 -3.5044]

println(w[1,:])
Any[
[-0.681392 0.595298 -0.394906 0.776983 -1.11178 3.11679 -0.0984956 -2.18501 0.928204 -0.484802 -1.86844 0.893845 -3.5044]]


This is very confusing for an R user like me. How do I access the column indexes of w[1] and apply the logical expression w[1,(w[1].<z)&(w[1].>-(z))] = 0 ?

Patrik

Simon Byrne

unread,
Nov 17, 2016, 5:51:09 AM11/17/16
to julia-users
I'm not familiar with the package in question, but this line:

w = Any[ 0.1*randn(1,13), 0 ]

may be what is causing the problem. It is creating a 2-element Vector, the first element of which is a 1x13 Matrix, and the second element is a scalar 0. The analogous object in R would be:

W = list(matrix(0.1*rnorm(13),nrow=1), 0)

In Julia, extraneous dimensions have an implicit index of 1 (this is a matlab-ism, and may disappear in future), so w[1], w[1,1], w[1,1,1] are all identical (and equivalent to W[[1]] in R). w[1,:] is a bit of an odd case in that it returns a 1-element Vector containing a Matrix, but would be equivalent to W[1] in R.

I think what you may want is actually

w[1][(w[1].<z) & (w[1].>-(z))]

which can be written more clearly as

w[1][-z .< w[1] .< z]


-Simon

Patrik Waldmann

unread,
Nov 17, 2016, 10:24:31 AM11/17/16
to julia-users
OK, that works fine. Thanks. I think it would be a good idea to drop the matlab-ism in future versions.

Patrik
Reply all
Reply to author
Forward
0 new messages