rendered paste bodyimport mathimport randomimport Imageimport ImageDrawimport timeclass neuron: def __init__ (self, dims): self.dims = dims self.weights=[] self.delta = 0 for i in range(self.dims): self.weights.append(0) self.randomize() def randomize(self): for i in range(self.dims): self.weights[i] = random.random() / float(5) def compete(self, input_data): summ = 0 for i in range(self.dims): summ += (float(input_data[i]) - self.weights[i])**2 self.response = math.sqrt(summ) return self.response def adapt(self, input_data, alpha, distance): for i in range(self.dims): self.weights[i] += alpha * distance * (float(input_data[i]) - self.weights[i])def euclid(va, vb): summ = 0 for i in range(len(va)): summ += (float(va[i]) - float(vb[i]))**2 return math.sqrt(summ)def drawit2d(): im = Image.new('RGBA',(600,600),(255,255,255)) img = ImageDraw.Draw(im) for j in range(len(layer)): for k in range(len(layer[j])): x = layer[j][k].weights[0]*40 y = layer[j][k].weights[1]*40 img.point((x,y),fill=(0,0,0)) if (k > 0): xx = layer[j][k-1].weights[0]*40 yy = layer[j][k-1].weights[1]*40 img.line(((x,y),(xx,yy)),fill=(255,0,0)) if (j > 0): xx = layer[j-1][k].weights[0]*40 yy = layer[j-1][k].weights[1]*40 img.line(((x,y),(xx,yy)),fill=(255,0,0)) im.show()def drawit(filename): ### INITIALIZE IMAGE im = Image.new('RGBA',(600,600),(255,255,255)) img = ImageDraw.Draw(im) borders = 30 ### CREATE SOM OUTPUT ARRAY som=[] for j in range(len(layer)): som.append([]) for k in range(len(layer[j])): som[j].append([]) ### CLASSIFY DATA for i in range(len(data)): winner_index_a = 0 winner_index_b = 0 winner_response = 100 for j in range(len(layer)): for k in range(len(layer[j])): response = layer[j][k].compete(data[i]) if (response < winner_response): winner_index_a = j winner_index_b = k winner_response = response som[winner_index_a][winner_index_b].append(lines[i].split()[4]) ### FIND BIGGEST DISTANCE max_dist = 0 for j in range(len(layer)): for k in range(len(layer[j])): if (k > 0): dist = euclid(layer[j][k].weights, layer[j][k-1].weights) if (dist > max_dist): max_dist = dist if (j > 0): dist = euclid(layer[j][k].weights, layer[j-1][k].weights) if (dist > max_dist): max_dist = dist dst_factor = float(255) / float(max_dist) ### FIT NETWORK INTO FRAME siz_factor = float(600-borders*2) / float(len(layer)) ### DRAW IT for j in range(len(layer)): for k in range(len(layer[j])): ### NOT LEFTMOST if (k > 0): dist = 255 - (dst_factor * euclid(layer[j][k].weights, layer[j][k-1].weights)) y = (j*siz_factor) + borders + siz_factor x = (k*siz_factor) + borders yy = (j*siz_factor) + borders xx = x img.line( ((x,y),(xx,yy)), fill=(dist,dist,dist) ) xoff=0 yoff=0 for i in range(len(som[j][k])): if ((i % 5) == 0): yoff = 0 if (i!=0): xoff+=10 img.text((x+10,y+10+(i*15)-siz_factor), som[j][k][i], fill=(255,0,0)) yoff+=15 ### NOT TOPMOST if (j > 0): dist = 255 - (dst_factor * euclid(layer[j][k].weights, layer[j-1][k].weights)) y = (j*siz_factor) + borders x = (k*siz_factor) + borders + siz_factor yy = y xx = (k*siz_factor) + borders img.line( ((x,y),(xx,yy)), fill=(dist,dist,dist) ) xoff=0 yoff=0 for i in range(len(som[j][k])): if ((i % 5) == 0): yoff = 0 if (i!=0): xoff+=10 img.text((x+10-siz_factor+xoff,y+10+yoff), som[j][k][i], fill=(255,0,0)) yoff+=15 im.save(filename)def graph_image(filename, epochs, log): #print "drawing" max_vert = 0 min_vert = 0 width = 200 border = 30 ## CREATE IMAGE im = Image.new('RGBA',(600+2*border,width+2*border),(255,255,255)) img = ImageDraw.Draw(im) ## SET VERTICAL WEIGHT FACTOR #for i in range(len(log)-1): # for j in range(len(log[i])): # for k in range(len(log[i][j])): # if (max_vert < log[i][j][k]): # max_vert = log[i][j][k] for i in range(len(log[0])): if (max_vert < log[0][i]): max_vert = log[0][i] if (max_vert == 0): max_vert = 1 ## ACHTUNG BEJBE !!! vw_factor = float(width) / float(max_vert) ## SET HORIZONTAL FACTOR factor = float(600) / float(epochs) ## DRAW GRID for i in range(6): jj = float(width) / float(5) * i img.line(((0+border,width-jj+border),(600+border,width-jj+border)),fill=(220,220,220)) ## DRAW WEIGHT VAL #for i in range(6): # jj = float(width) / float(5) * i # if (i == 0): # ff = '0.00' # else: # ff = '%.2f' % ( i * (float(max_vert) / float(5))) # img.text( (5,width-jj+border-6), str(ff), fill=(0,0,255) ) ## DRAW ERROR VAL for i in range(6): jj = float(width) / float(5) * i if (i == 0): ff = '0 %' else: ff = '%.0f' % ( i * (float(max_vert) / float(5))) + " %" img.text( (635,width-jj+border-6), str(ff), fill=(255,0,0) ) ## PROCESS LOG for ind in range(len(log[0])-1): ## MIGHT HAVE BEEN INTERRUPTED epoch = ind #vahos=[] #for i in range(len(log)-1): # vahos.append(log[i][ind]) wrongright = log[len(log)-1][ind] i=0 ### GRAPH WEIGHTS #for k in range(len(vahos)): # color_add = float(255) / float(len(vahos)) # for j in range(len(vahos[k])): # if (ind != 0): # xa = (ind-1)*factor + border # ya = width - log[k][ind-1][j]*vw_factor + border # xb = ind*factor + border # yb = width - vahos[k][j]*vw_factor + border # img.line(((xa,ya),(xb,yb)),fill=(0,k*color_add,255)) # else: # xb = ind*factor + border # yb = width - vahos[k][j]*vw_factor + border # img.point((xb,yb),fill=(0,k*color_add,255)) ### GRAPH WRONG / RIGHT #if (ind != 0): #xa = (ind-1)*factor + border #ya = width - log[len(log)-1][ind-1]*vw_factor + border #xb = ind*factor + border #yb = width - wrongright*vw_factor + border #img.line(((xa,ya),(xb,yb)),fill=(255,0,0)) #img.line(((xa,ya-1),(xb,yb-1)),fill=(255,0,0)) #else: xb = ind*factor + border yb = width - wrongright*vw_factor + border img.point((xb,yb),fill=(255,0,0)) im.save(filename)def readit(filename): f = file(filename,"r") lines = [] lines = f.readlines() kaka = [] for i in range(len(lines)): #kaka.append( lines[i].split()[1:] )#animals kaka.append( lines[i].split()[:2347] )#iris.dat return (kaka,lines)### FIRST THE INPUT DATAlines = [](data,lines) = readit("D:/wrk/social_net/vectors_2007_5_13.txt")#data=[]#for i in range(10):# for j in range(10):# data.append((i,j))### SOME VARIABLESdimensions = 2347template = [6,6]epochs_order = 2000epochs_convergence = 800 * template[0] * template[1]epochs = epochs_order + epochs_convergenceinitial_alpha = 0.1initial_distance = math.sqrt(template[0]**2 + template[1]**2)t_one = float(epochs_order) / math.log(initial_distance)log=[]log.append([]) #The Winner Distancesdatum = "%d_%d_%d-%d" % (time.localtime()[2],time.localtime()[1],time.localtime()[3],time.localtime()[4])### THE COMPUTATION ITSELF ### FILL THE LAYER layer=[]for i in range(template[0]): layer.append([]) for j in range(template[1]): layer[i].append(neuron(dimensions))#drawit()for i in range(epochs): ### COMPETITION rnd = int(random.random() * len(data)) winner_index_a = 0 winner_index_b = 0 winner_response = 100 avg_response = 0 for j in range(len(layer)): for k in range(len(layer[j])): response = layer[j][k].compete(data[rnd]) if (response < winner_response): winner_index_a = j winner_index_b = k winner_response = response ### LOG IT log[0].append(winner_response) ### ADAPTATION if (i < epochs_order): distance_factor = initial_distance * math.exp(-float(i) / t_one) alpha = initial_alpha * math.exp(-float(i)/float(epochs_order)) else: distance_factor = 1 alpha = 0.01 for j in range(len(layer)): for k in range(len(layer[j])): euclid_dst = (winner_index_a - j)**2 + (winner_index_b - k)**2 dst = math.exp( -euclid_dst / 2*(distance_factor**2) ) layer[j][k].adapt(data[rnd], alpha, dst)##GRAPH ITgraph_image("d:/wrk/code/SOM/error_"+datum+".jpg", epochs, log)for i in range(len(data)): winner_index_a = 0 winner_index_b = 0 winner_response = 100 for j in range(len(layer)): for k in range(len(layer[j])): response = layer[j][k].compete(data[i]) if (response < winner_response): winner_index_a = j winner_index_b = k winner_response = response print str(lines[i].split()[4]) + ": "+str(winner_index_a)+" : "+str(winner_index_b)print "finished"drawit("d:/wrk/code/SOM/img_"+datum+".jpg")