adding array of numbers

C

Chris Bond

Given a file that looks like so:
7 ==> training Set length
11 ==> file length
1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 0
1 0 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 0 1 0 1 1 1 1
1 1 0 1 0 1 1 0
0 0 0 1 0 1 0 1
1 1 0 0 1 0 0 1
1 1 0 0 0 0 0 0
0 1 0 1 0 1 1 0
1 1 1 1 1 0 0 0 ==>end of file
#training set #Answer
For now, I need to do this : get the dotProduct of the vector training
set and weight vector, and if that number is > 0 , output 1 ,else output
0. later in the problem I compare that to the answer, but I'm not there
yet. Here is what I have(with tests) to try to get 1 training set to add
up all numbers(without the dotProduct of weights) using IO.readlines,
splitting each line using split, for loops to get an array of integers
to be added together to get output for Perceptron_Bond object named
einstein. coding is as follows
class Perceptron_Bond

attr_reader :weights, :eek:utput
attr_writer :weights, :eek:utput
def initialize(input, weights)
@weights = weights
@input =input
end


def output
y = @input.inject(0) {|sum, element | sum+element}
@output=y
end
end
str = ARGV[0]
inputs = Array.new
inputs1 = Array.new
inputsNum = Array.new
setArr = Array.new
answers = Array.new
arr = IO.readlines(str)


arr.shift
arr.shift

arr.each { |y| inputs1.push(y.split)}
inputs1.each do|x|
answers.push(x.last)
x.pop
end
for i in 0...inputs1.length
setArr= Array.new
for j in 0...inputs1.length
inputsNum[j] = Array.new
inputsNum[j].push(Integer(inputs1[j]))
if j==(inputs1.length-1) then
inputs = inputsNum
end
end
puts inputs.to_s

end
puts inputs.to_s
puts inputs[2][1].class ==> Array #i want fixnum

initWeights = Array.new(inputs.length) { |index| index =0 }
einstein = Perceptron_Bond.new(inputs[0] , initWeights)
puts einstein.output #should produce fixnum 2
i get an error as well in output telling me I cannot coerce an Array to
a fixnum
Im guessing its stemming from the nested for loops I have, but I am just
stumped
I need help in a bad way, please.

Attachments:
http://www.ruby-forum.com/attachment/524/somefile.rb
 
A

Axel Etzold

-------- Original-Nachricht --------
Datum: Thu, 4 Oct 2007 00:39:09 +0900
Von: Chris Bond <[email protected]>
An: (e-mail address removed)
Betreff: adding array of numbers
Given a file that looks like so:
7 ==> training Set length
11 ==> file length
1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 0
1 0 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 0 1 0 1 1 1 1
1 1 0 1 0 1 1 0
0 0 0 1 0 1 0 1
1 1 0 0 1 0 0 1
1 1 0 0 0 0 0 0
0 1 0 1 0 1 1 0
1 1 1 1 1 0 0 0 ==>end of file
#training set #Answer
For now, I need to do this : get the dotProduct of the vector training
set and weight vector, and if that number is > 0 , output 1 ,else output
0. later in the problem I compare that to the answer, but I'm not there
yet. Here is what I have(with tests) to try to get 1 training set to add
up all numbers(without the dotProduct of weights) using IO.readlines,
splitting each line using split, for loops to get an array of integers
to be added together to get output for Perceptron_Bond object named
einstein. coding is as follows
class Perceptron_Bond

attr_reader :weights, :eek:utput
attr_writer :weights, :eek:utput
def initialize(input, weights)
@weights = weights
@input =input
end


def output
y = @input.inject(0) {|sum, element | sum+element}
@output=y
end
end
str = ARGV[0]
inputs = Array.new
inputs1 = Array.new
inputsNum = Array.new
setArr = Array.new
answers = Array.new
arr = IO.readlines(str)


arr.shift
arr.shift

arr.each { |y| inputs1.push(y.split)}
inputs1.each do|x|
answers.push(x.last)
x.pop
end
for i in 0...inputs1.length
setArr= Array.new
for j in 0...inputs1.length
inputsNum[j] = Array.new
inputsNum[j].push(Integer(inputs1[j]))
if j==(inputs1.length-1) then
inputs = inputsNum
end
end
puts inputs.to_s

end
puts inputs.to_s
puts inputs[2][1].class ==> Array #i want fixnum

initWeights = Array.new(inputs.length) { |index| index =0 }
einstein = Perceptron_Bond.new(inputs[0] , initWeights)
puts einstein.output #should produce fixnum 2
i get an error as well in output telling me I cannot coerce an Array to
a fixnum
Im guessing its stemming from the nested for loops I have, but I am just
stumped
I need help in a bad way, please.

Attachments:
http://www.ruby-forum.com/attachment/524/somefile.rb


Dear Chris,

if I understand you correctly, a first problem is that you need
to get the scalar product of two vectors.

I'd like to suggest that you use GSL

http://www.gnu.org/software/gsl/

and its Ruby bindings ruby-gsl

http://rb-gsl.rubyforge.org/

to do these manipulations - they have them implemented in C code,
so the actual computations are faster than in Ruby, besides the
fact that you don't have to recode everything by yourself.

I have written some code below to extract a matrix and the answer
vector from a file, and to calculate the dot product.

I think you can go on from there ... or just ask again :)


Best regards,

Axel


---------------------------------------------


require "gsl"

=begin

I assume that the file "dat.txt" contains

1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 0
1 0 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 0 1 0 1 1 1 1
1 1 0 1 0 1 1 0
0 0 0 1 0 1 0 1
1 1 0 0 1 0 0 1
1 1 0 0 0 0 0 0
0 1 0 1 0 1 1 0
1 1 1 1 1 0 0 0

=end

text=IO.readlines("dat.txt")
matrix_lines=[]
answer_vec=[]
text.each{|entry|
s=entry.split(/ +/)
matrix_lines<<s[0...-1].collect{|y| eval(y).to_f}
answer_vec<<eval(s[-1]).to_f
}


matrix=Matrix.alloc(matrix_lines.flatten,11,7)
answer_vec=Vector.alloc(answer_vec)
matrix_vector=Vector.alloc(matrix.column(0).to_a)

p matrix_vector.to_a
p answer_vec.to_a

# dot-product of the first column vector of the Matrix with answer
p matrix_vector*(answer_vec.col)
 
R

Robert Klemme

------=_Part_9445_21260210.1191503530356
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

2007/10/3 said:
Given a file that looks like so:
7 ==> training Set length
11 ==> file length
1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 0
1 0 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 0 1 0 1 1 1 1
1 1 0 1 0 1 1 0
0 0 0 1 0 1 0 1
1 1 0 0 1 0 0 1
1 1 0 0 0 0 0 0
0 1 0 1 0 1 1 0
1 1 1 1 1 0 0 0 ==>end of file
#training set #Answer
For now, I need to do this : get the dotProduct of the vector training
set and weight vector, and if that number is > 0 , output 1 ,else output
0. later in the problem I compare that to the answer, but I'm not there
yet. Here is what I have(with tests) to try to get 1 training set to add
up all numbers(without the dotProduct of weights) using IO.readlines,
splitting each line using split, for loops to get an array of integers
to be added together to get output for Perceptron_Bond object named
einstein. coding is as follows
class Perceptron_Bond

attr_reader :weights, :eek:utput
attr_writer :weights, :eek:utput
def initialize(input, weights)
@weights = weights
@input =input
end


def output
y = @input.inject(0) {|sum, element | sum+element}
@output=y
end
end
str = ARGV[0]
inputs = Array.new
inputs1 = Array.new
inputsNum = Array.new
setArr = Array.new
answers = Array.new
arr = IO.readlines(str)


arr.shift
arr.shift

arr.each { |y| inputs1.push(y.split)}
inputs1.each do|x|
answers.push(x.last)
x.pop
end
for i in 0...inputs1.length
setArr= Array.new
for j in 0...inputs1.length
inputsNum[j] = Array.new
inputsNum[j].push(Integer(inputs1[j]))
if j==(inputs1.length-1) then
inputs = inputsNum
end
end
puts inputs.to_s

end
puts inputs.to_s
puts inputs[2][1].class ==> Array #i want fixnum

initWeights = Array.new(inputs.length) { |index| index =0 }
einstein = Perceptron_Bond.new(inputs[0] , initWeights)
puts einstein.output #should produce fixnum 2
i get an error as well in output telling me I cannot coerce an Array to
a fixnum
Im guessing its stemming from the nested for loops I have, but I am just
stumped
I need help in a bad way, please.

Attachments:
http://www.ruby-forum.com/attachment/524/somefile.rb


I am not sure whether I understood properly which of the vectors you
want to multiply with which ones. Is this what you want?

Kind regards

robert

------=_Part_9445_21260210.1191503530356
Content-Type: application/x-ruby; name="weights.rb"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="weights.rb"
X-Attachment-Id: f_f7dafgtt

IyFydWJ5CgpzdW0gPSBmaWxlX2xlbiA9IG5pbAoKREFUQS5lYWNoIGRvIHxsaW5lfAogIGlmIHN1
bS5uaWw/CiAgICBzZXRfc2l6ZSA9IGxpbmVbL1xkKy9dLnRvX2kKICAgIHN1bSA9IEFycmF5Lm5l
dyhzZXRfc2l6ZSwgMCkKICBlbHNpZiBmaWxlX2xlbi5uaWw/CiAgICBmaWxlX2xlbiA9IGxpbmVb
L1xkKy9dLnRvX2kKICBlbHNpZiBmaWxlX2xlbiA+IDAKICAgIG51bXMgPSBsaW5lLnNjYW4oL1sw
MV0rLykubWFwIHt8c3wgcy50b19pKDIpfQogICAgc3VtLnNpemUudGltZXMgZG8gfGl8CiAgICAg
IHN1bVtpXSArPSBudW1zW2ldCiAgICBlbmQgaWYgbnVtc1stMV0gIT0gMAogICAgZmlsZV9sZW4g
LT0gMQogIGVuZAplbmQKCnAgc3VtCgpfX0VORF9fCiA3ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA9PT4gdHJhaW5pbmcgU2V0IGxlbmd0aAogMTEgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgPT0+IGZpbGUgbGVuZ3RoCiAxICAwICAwICAwICAwICAxICAwICAgICAgIDAKIDAgIDEgIDEg
IDEgIDAgIDAgIDEgICAgICAgMAogMSAgMCAgMSAgMCAgMSAgMCAgMSAgICAgICAxCiAxICAwICAx
ICAxICAxICAxICAxICAgICAgIDEKIDAgIDAgIDEgIDAgIDEgIDEgIDEgICAgICAgMQogMSAgMSAg
MCAgMSAgMCAgMSAgMSAgICAgICAwCiAwICAwICAwICAxICAwICAxICAwICAgICAgIDEKIDEgIDEg
IDAgIDAgIDEgIDAgIDAgICAgICAgMQogMSAgMSAgMCAgMCAgMCAgMCAgMCAgICAgICAwCiAwICAx
ICAwICAxICAwICAxICAxICAgICAgIDAKIDEgIDEgIDEgIDEgIDEgIDAgIDAgICAgICAgMCA9PT5l
bmQgb2YgZmlsZQoK
------=_Part_9445_21260210.1191503530356--
 
C

Chris Bond

Robert said:
I am not sure whether I understood properly which of the vectors you
want to multiply with which ones. Is this what you want?

Kind regards

robert

The problem was to make a perceptron learning algorithm. you take the 1
1 0 0 1 0 0 string then initially multiply it by the weight vector
of all 0s. The output is the dot product of the two vectors. Then you
compare that output to the answers that are on the right. If the
perceptron did not fire(0), when it should have, you add the dot product
to the old weight vector, and the converse(1 when it should be 0) you
subtract
here is the speudocode
w= random vector
repeat
Get input x
Get neuron output y = (1 if w ⋅ x ≥ 0; otherwise 0)
Find correct output y#
Compute error e= y# − y
If e ≠ 0
w= w + ex
until w stops changing

hope that helps
 
A

ara.t.howard

Given a file that looks like so:
7 ==> training Set length
11 ==> file length
1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 0
1 0 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 0 1 0 1 1 1 1
1 1 0 1 0 1 1 0
0 0 0 1 0 1 0 1
1 1 0 0 1 0 0 1
1 1 0 0 0 0 0 0
0 1 0 1 0 1 1 0
1 1 1 1 1 0 0 0 ==>end of file
#training set #Answer


not answering your question, but you *really* want to be using NArray

http://narray.rubyforge.org/

kind regards.

a @ http://drawohara.com/
 
C

Chris Bond

ok, so I got the thing to work, with just arrays, but now i want to ask
the user if he/she wants to go through the set again, with 'yes' and
'no' as the values, and what I end up with is an infinite loop.

while gets != 'no'
einstein.input.each_index { |x| einstein.c_weights(einstein.input[x],
einstein.weights, matrix_ans[x][0]) }
end

I was wandering if having the ARGV[0] as the filename has anything to do
with it.

Attachments:
http://www.ruby-forum.com/attachment/640/somefile.rb
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,065
Latest member
OrderGreenAcreCBD

Latest Threads

Top