Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import matplotlib.pyplot as plt
- import numpy as np
- from numpy import array
- import math
- import Image
- rt = lambda x:math.sqrt(x)
- arr = lambda x : np.array(x)
- def normal_function(mu,sigma):
- mu = np.array([mu])
- 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)
- def findClass(nos,classes):
- index = -1
- for i in range(classes.shape[0]):
- if nos < classes[i]:
- index = i
- break
- return index
- def BayesClassfier(mu,sigma,prior,n,label):
- label1 = label+'_n'+str(n)
- data_set = np.zeros((n,mu.shape[1]))
- category = np.zeros(data_set.shape[0])
- Iprior = np.zeros(prior.shape)
- Iprior[0] = prior[0]
- for i in range(1,Iprior.shape[0]):
- Iprior[i] = Iprior[i-1] + prior[i]
- for i in range(data_set.shape[0]):
- index = findClass(np.random.rand(1)[0],Iprior)
- data_set[i] = np.random.multivariate_normal(mu[index],sigma[index],1)
- category[i] = index+1
- train_set = data_set[:(data_set.shape[0]/2),:]
- train_cat = category[:(category.shape[0]/2)]
- test_set = data_set[(data_set.shape[0]/2):,:]
- test_cat = category[(category.shape[0]/2):]
- est_mu = np.zeros(mu.shape)
- est_sigma = np.zeros(sigma.shape)
- category_size = np.zeros(prior.shape)
- est_prior = np.zeros(prior.shape)
- for i in range(train_set.shape[0]):
- index = train_cat[i] - 1
- est_mu[index] = est_mu[index] + train_set[i]
- category_size[index] += 1
- for i in range(category_size.shape[0]):
- est_mu[i] = est_mu[i]/category_size[i]
- est_prior[i] = category_size[i]/train_set.shape[0]
- for i in range(train_set.shape[0]):
- index = train_cat[i]-1
- data = np.array([train_set[i]]) - est_mu[index]
- est_sigma[index] = est_sigma[index] + np.dot(data.T,data)
- for i in range(category_size.shape[0]):
- est_sigma[i] = est_sigma[i]/category_size[i]
- prob = [normal_function(est_mu[i],est_sigma[i]) for i in range(prior.shape[0])]
- misclassification_rate = 0.0
- for i in range(test_set.shape[0]):
- mix_density = np.zeros(prior.shape)
- for j in range(prior.shape[0]):
- mix_density[j] = est_prior[j]*prob[j](test_set[i])
- index = np.argmax(mix_density)+1
- if index != test_cat[i]:
- misclassification_rate += 1
- misclassification_rate /= test_set.shape[0]
- fo = open(label1+'.txt','wb')
- printLine = "misclassification rate of "+label1+" is "+str(misclassification_rate)
- print printLine
- fo.write(printLine+'\n')
- prob_or = [normal_function(mu[i],sigma[i]) for i in range(prior.shape[0])]
- misclassification_rate_or = 0.0
- for i in range(data_set.shape[0]):
- mix_density = np.zeros(prior.shape)
- for j in range(prior.shape[0]):
- mix_density[j] = prior[j]*prob_or[j](data_set[i])
- index = np.argmax(mix_density)+1
- if index != category[i]:
- misclassification_rate_or += 1.0
- misclassification_rate_or /= data_set.shape[0]
- printLine = "misclassification rate of (original) "+label1+" is "+str(misclassification_rate_or)
- print printLine
- fo.write(printLine+'\n\ndata: \n')
- #wr_pol = csv.writer(open('tr_pol.txt','wb'),delimiter=' ')
- imageMatrix = np.zeros((64,64),dtype=np.uint8)
- grayBW = 255/(prior.shape[0]-1)
- for x in range(imageMatrix.shape[0]):
- ref_x = x*10.0/(imageMatrix.shape[0]-1) -5
- for y in range(imageMatrix.shape[1]):
- ref_y = y*10.0/(imageMatrix.shape[1]-1)-5
- ref_data = np.array([[ref_x,ref_y]])
- mix_density = np.zeros(prior.shape)
- for j in range(prior.shape[0]):
- mix_density[j] = est_prior[j]*prob[j](ref_data)
- index = np.argmax(mix_density)
- imageMatrix[x][y] = math.ceil(grayBW*index)
- image = Image.fromarray(imageMatrix).rotate(90)
- fname = label1+'.png'
- image.save(fname)
- if n == 3000:
- imageMatrix = np.zeros((64,64),dtype=np.uint8)
- grayBW = 255/(prior.shape[0]-1)
- for x in range(imageMatrix.shape[0]):
- ref_x = x*10.0/(imageMatrix.shape[0]-1) -5
- for y in range(imageMatrix.shape[1]):
- ref_y = y*10.0/(imageMatrix.shape[1]-1)-5
- ref_data = np.array([[ref_x,ref_y]])
- mix_density = np.zeros(prior.shape)
- for j in range(prior.shape[0]):
- mix_density[j] = prior[j]*prob_or[j](ref_data)
- index = np.argmax(mix_density)
- imageMatrix[x][y] = math.ceil(grayBW*index)
- image = Image.fromarray(imageMatrix).rotate(90)
- fname = label+'_original.png'
- image.save(fname)
- '''
- fig = plt.figure()
- plt.imshow(image)
- fig.suptitle(label)
- plt.gray()
- plt.show()
- '''
- #Given Data
- mu1 = arr([0,0])
- mu2 = arr([0,1])
- mu3 = arr([1,0.5])
- sigma1 = arr([[1,0],[0,1]])
- sigma2 = arr([[2,-1],[-1,2]])
- sigma3 = arr([[1,0.5],[0.5,2]])
- mu = arr([mu1,mu2])
- sigma = arr([sigma1,sigma1])
- prior = arr([0.5,0.5])
- 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'],\
- [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']]
- nos = [200,500,1000,3000]
- for case in cases:
- for n in nos:
- BayesClassfier(case[0],case[1],case[2],n,case[3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement