Skip to content

Instantly share code, notes, and snippets.

@yakreved
Last active August 29, 2015 13:59
Show Gist options
  • Save yakreved/10516843 to your computer and use it in GitHub Desktop.
Save yakreved/10516843 to your computer and use it in GitHub Desktop.
thm
class Network
attr_accessor :columns, :neurons_in_column,:connectedPerm,:desiredLocalActivity
def initialize
@minOverlap = 5
@neurons_in_column = 5
@connectedPerm = 0.5 #пороговое значение – минимальное значение перманентности при котором синапс считается «действующим» («подключенным»)
@columns = Array.new(10){Column.new}
@desiredLocalActivity = 3 #Параметр контролирующий число колонок победителей после шага подавления.
end
class Neuron
attr_accessor :synapse
def initialize
@synapse = Synapse.new
end
end
class Synapse
attr_accessor :input_source, :permanence
def initialize
@input_source = -1 #индекс элемента входа, с которым связан синапс
@permanence = rand
end
end
class Column
attr_accessor :overlap,:neurons, :boost
def initialize
@neurons = Array.new(1){Neuron.new}
@overlap = 0
@boost = 1
end
def connectedSynapses
res = []
@neurons.each do |n|
if n.synapse.permanence>= 0.5#connectedPerm
res.push(n.synapse)
end
end
res
end
def disconnectedSynapses
res = []
@neurons.each do |n|
if n.synapse.permanence< connectedPerm
res.push(n.synapse)
end
end
res
end
end
#Присоединяем синапсы к входным данным (Раз и навсегда)
def connectNetworkToInputs(size)
for i in 0 .. size -1 do
@columns.sample.neurons.sample.synapse.input_source = i
end
end
#Имплементация пространственного группировщика
def spaceGrouper(input)
#1.Overlap
def overlap(input)
@columns.each do |c|
c.overlap = 0
c.connectedSynapses.each do |s|
c.overlap = c.overlap + input[s.input_source]
end
if c.overlap < 1 then c.overlap =0 #5 = minOverlap
else
c.overlap= c.overlap*c.boost
end
end
end
#2.Ингибирование (подавление)
def ingibit
activeColumns = []
@columns.each do |c|
minLocalActivity = kthScore(neighbors(c), @desiredLocalActivity)
if c.overlap>0 and c.overlap>= minLocalActivity
activeColumns.push(c)
end
end
activeColumns
end
#Для заданного списка колонок возвращает их k-ое максимальное значение их перекрытий со входом.
def kthScore(colls,desiredLocalActivity)
if colls.length> desiredLocalActivity
colls.sort_by{|p| p.overlap}[desiredLocalActivity].overlap
else
colls.last.overlap
end
end
#Список колонок находящихся в радиусе подавления inhibitionRadius колонки c.
def neighbors(c)
@columns.slice(@columns.index(c)-10,@columns.index(c)+10)
end
#Фаза 3: Обучение
def learn(activeColumns)
activeColumns.each do |c|
c.connectedSynapses.each do |s|
s.permanence+= 0.1#permanenceInc
s.permanence = [1, s.permanence].min
end
c.connectedSynapses.each do |s|
s.permanence -= 0.1#permanenceDec
s.permanence = [0, s.permanence].max
end
#Здесь возможно будет заимплементено ускорение
end
end
overlap(input)
learn(ingibit)
end
end
#Testing
data = [1,0,1,0,1,0]
data2 = [0,1,0,1,0,1]
data3 = [1,1,0,1,0,1]
n = Network.new
n.connectNetworkToInputs(data.length)
n.spaceGrouper(data)
n.spaceGrouper(data2)
n.spaceGrouper(data)
n.spaceGrouper(data2)
n.spaceGrouper(data)
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source }
p "////"
n.spaceGrouper(data2)
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source }
p "////"
n.spaceGrouper(data3)
n.ingibit.map { |p| puts p.neurons[0].synapse.input_source }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment