All pastes #558446 Raw Edit

gnd som

public python v1 · immutable
·published 2007-06-11 12:00 UTC
rendered paste body
import 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")