Advertisement
sau003

Image classification

Mar 20th, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.01 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from numpy import array
  4. import math
  5. import Image
  6.  
  7. rt = lambda x:math.sqrt(x)
  8. arr = lambda x : np.array(x)
  9. def normal_function(mu,sigma):
  10.     mu = np.array([mu])
  11.     return lambda x:np.exp(-np.dot(np.dot((x-mu),np.linalg.inv(sigma)),(x-mu).T)/2.0)/((((2*math.pi)**mu.shape[1])*np.linalg.det(sigma))**.5)
  12.    
  13. def findClass(nos,classes):
  14.     index = -1
  15.     for i in range(classes.shape[0]):
  16.         if nos < classes[i]:
  17.             index = i
  18.             break
  19.     return index
  20.    
  21. def BayesClassfier(mu,sigma,prior,n,label):
  22.    
  23.     label1 = label+'_n'+str(n)
  24.     data_set = np.zeros((n,mu.shape[1]))
  25.     category = np.zeros(data_set.shape[0])
  26.     Iprior = np.zeros(prior.shape)
  27.     Iprior[0] = prior[0]
  28.     for i in range(1,Iprior.shape[0]):
  29.         Iprior[i] = Iprior[i-1] + prior[i]
  30.    
  31.     for i in range(data_set.shape[0]):
  32.         index = findClass(np.random.rand(1)[0],Iprior)
  33.         data_set[i] =  np.random.multivariate_normal(mu[index],sigma[index],1)
  34.         category[i] = index+1
  35.    
  36.     train_set = data_set[:(data_set.shape[0]/2),:]
  37.     train_cat = category[:(category.shape[0]/2)]
  38.     test_set = data_set[(data_set.shape[0]/2):,:]
  39.     test_cat = category[(category.shape[0]/2):]
  40.  
  41.     est_mu = np.zeros(mu.shape)
  42.     est_sigma = np.zeros(sigma.shape)
  43.     category_size = np.zeros(prior.shape)
  44.     est_prior = np.zeros(prior.shape)
  45.    
  46.     for i in range(train_set.shape[0]):
  47.         index = train_cat[i] - 1
  48.         est_mu[index] = est_mu[index] + train_set[i]
  49.         category_size[index] += 1
  50.    
  51.     for i in range(category_size.shape[0]):
  52.         est_mu[i] = est_mu[i]/category_size[i]
  53.         est_prior[i] = category_size[i]/train_set.shape[0]
  54.  
  55.     for i in range(train_set.shape[0]):
  56.         index = train_cat[i]-1
  57.         data = np.array([train_set[i]]) - est_mu[index]
  58.         est_sigma[index] = est_sigma[index] + np.dot(data.T,data)
  59.    
  60.     for i in range(category_size.shape[0]):
  61.         est_sigma[i] = est_sigma[i]/category_size[i]
  62.     prob = [normal_function(est_mu[i],est_sigma[i]) for i in range(prior.shape[0])]
  63.     misclassification_rate = 0.0
  64.     for i in range(test_set.shape[0]):
  65.         mix_density = np.zeros(prior.shape)
  66.         for j in range(prior.shape[0]):
  67.             mix_density[j] = est_prior[j]*prob[j](test_set[i])
  68.            
  69.         index = np.argmax(mix_density)+1
  70.         if index != test_cat[i]:   
  71.             misclassification_rate += 1    
  72.    
  73.    
  74.     misclassification_rate /= test_set.shape[0]
  75.     fo = open(label1+'.txt','wb')
  76.    
  77.     printLine = "misclassification rate of "+label1+" is "+str(misclassification_rate)
  78.     print printLine
  79.     fo.write(printLine+'\n')
  80.    
  81.     prob_or = [normal_function(mu[i],sigma[i]) for i in range(prior.shape[0])]
  82.    
  83.     misclassification_rate_or = 0.0
  84.     for i in range(data_set.shape[0]):
  85.         mix_density = np.zeros(prior.shape)
  86.         for j in range(prior.shape[0]):
  87.             mix_density[j] = prior[j]*prob_or[j](data_set[i])
  88.         index = np.argmax(mix_density)+1
  89.         if index != category[i]:
  90.             misclassification_rate_or += 1.0
  91.    
  92.     misclassification_rate_or /= data_set.shape[0]
  93.     printLine = "misclassification rate of (original) "+label1+" is "+str(misclassification_rate_or)
  94.     print printLine
  95.     fo.write(printLine+'\n\ndata: \n')
  96.     #wr_pol = csv.writer(open('tr_pol.txt','wb'),delimiter=' ')
  97.    
  98.     imageMatrix = np.zeros((64,64),dtype=np.uint8)
  99.     grayBW  = 255/(prior.shape[0]-1)
  100.     for x in range(imageMatrix.shape[0]):
  101.         ref_x = x*10.0/(imageMatrix.shape[0]-1) -5
  102.         for y in range(imageMatrix.shape[1]):
  103.             ref_y = y*10.0/(imageMatrix.shape[1]-1)-5
  104.             ref_data = np.array([[ref_x,ref_y]])
  105.             mix_density = np.zeros(prior.shape)
  106.             for j in range(prior.shape[0]):
  107.                 mix_density[j] = est_prior[j]*prob[j](ref_data)
  108.            
  109.             index = np.argmax(mix_density)
  110.             imageMatrix[x][y] = math.ceil(grayBW*index)
  111.  
  112.     image = Image.fromarray(imageMatrix).rotate(90)
  113.     fname = label1+'.png'
  114.     image.save(fname)
  115.    
  116.     if n == 3000:
  117.         imageMatrix = np.zeros((64,64),dtype=np.uint8)
  118.         grayBW  = 255/(prior.shape[0]-1)
  119.         for x in range(imageMatrix.shape[0]):
  120.             ref_x = x*10.0/(imageMatrix.shape[0]-1) -5
  121.             for y in range(imageMatrix.shape[1]):
  122.                 ref_y = y*10.0/(imageMatrix.shape[1]-1)-5
  123.                 ref_data = np.array([[ref_x,ref_y]])
  124.                 mix_density = np.zeros(prior.shape)
  125.                 for j in range(prior.shape[0]):
  126.                     mix_density[j] = prior[j]*prob_or[j](ref_data)
  127.            
  128.                 index = np.argmax(mix_density)
  129.                 imageMatrix[x][y] = math.ceil(grayBW*index)
  130.  
  131.         image = Image.fromarray(imageMatrix).rotate(90)
  132.         fname = label+'_original.png'
  133.         image.save(fname)
  134.     '''
  135.     fig = plt.figure()
  136.     plt.imshow(image)
  137.     fig.suptitle(label)
  138.     plt.gray()
  139.     plt.show()
  140.     '''
  141. #Given Data
  142. mu1 = arr([0,0])
  143. mu2 = arr([0,1])
  144. mu3 = arr([1,0.5])
  145. sigma1 = arr([[1,0],[0,1]])
  146. sigma2 = arr([[2,-1],[-1,2]])
  147. sigma3 = arr([[1,0.5],[0.5,2]])
  148.  
  149. mu = arr([mu1,mu2])
  150. sigma = arr([sigma1,sigma1])
  151. prior = arr([0.5,0.5])
  152.  
  153. cases = [[arr([mu1,mu2]),arr([sigma1,sigma1]),arr([0.5,0.5]),'case1'],[arr([mu1,mu2]),arr([sigma1,sigma1]),arr([0.6,0.4]),'case2'],\
  154.     [arr([mu1,mu2]),arr([sigma1,sigma2]),arr([0.6,0.4]),'case3'],[arr([mu1,mu2,mu3]),arr([sigma1,sigma2,sigma3]),arr([0.3,0.4,0.3]),'case4']]
  155. nos = [200,500,1000,3000]
  156.  
  157. for case in cases:
  158.     for n in nos:
  159.         BayesClassfier(case[0],case[1],case[2],n,case[3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement