

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/machinelearningdatabases/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


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[ 0 ] 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.
On Wednesday, November 16, 2016 at 1:36:57 PM UTC5, Patrik Waldmann wrote: 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 = "<a href="https://archive.ics.uci.edu/ml/machinelearningdatabases/housing/housing.data" target="_blank" rel="nofollow" onmousedown="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" onclick="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;">https://archive.ics.uci.edu/ml/machinelearningdatabases/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


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]
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
On Thursday, November 17, 2016 at 6:58:14 AM UTC+1, Jeffrey Sarnoff wrote:
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[ 0 ] 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.
On Wednesday, November 16, 2016 at 1:36:57 PM UTC5, Patrik Waldmann wrote: 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 = "<a onmousedown="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" onclick="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" href="https://archive.ics.uci.edu/ml/machinelearningdatabases/housing/housing.data" target="_blank" rel="nofollow">https://archive.ics.uci.edu/ml/machinelearningdatabases/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


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 2element 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 matlabism, 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 1element 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
Simon
On Thursday, 17 November 2016 09:39:14 UTC, Patrik Waldmann wrote: 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]
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
On Thursday, November 17, 2016 at 6:58:14 AM UTC+1, Jeffrey Sarnoff wrote:
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[ 0 ] 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.
On Wednesday, November 16, 2016 at 1:36:57 PM UTC5, Patrik Waldmann wrote: 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 = "<a href="https://archive.ics.uci.edu/ml/machinelearningdatabases/housing/housing.data" rel="nofollow" target="_blank" onmousedown="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" onclick="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;">https://archive.ics.uci.edu/ml/machinelearningdatabases/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


OK, that works fine. Thanks. I think it would be a good idea to drop the matlabism in future versions.
Patrik
On Thursday, November 17, 2016 at 11:51:09 AM UTC+1, Simon Byrne wrote: 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 2element 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 matlabism, 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 1element 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
Simon
On Thursday, 17 November 2016 09:39:14 UTC, Patrik Waldmann wrote: 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]
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
On Thursday, November 17, 2016 at 6:58:14 AM UTC+1, Jeffrey Sarnoff wrote:
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[ 0 ] 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.
On Wednesday, November 16, 2016 at 1:36:57 PM UTC5, Patrik Waldmann wrote: 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 = "<a onmousedown="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" onclick="this.href='https://www.google.com/url?q\x3dhttps%3A%2F%2Farchive.ics.uci.edu%2Fml%2Fmachinelearningdatabases%2Fhousing%2Fhousing.data\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEkept5MM0sLtzR9aSXgkHVT_K8A';return true;" href="https://archive.ics.uci.edu/ml/machinelearningdatabases/housing/housing.data" target="_blank" rel="nofollow">https://archive.ics.uci.edu/ml/machinelearningdatabases/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

