/
Q2.py
85 lines (64 loc) · 2.4 KB
/
Q2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import kmeans as km
import numpy as np
from mylib import gausspdf
import mylib as mylib
import gmm as gmm
from scipy.stats import multivariate_normal
import pdb
import functools
def density_gmm(sample, params):
"""density for gauss mixture model"""
pdf = 0
for param in params:
center, deviation, weight = param
pdf += weight*gausspdf(sample, center, deviation)
#multivariate_normal(mean = center, cov = deviation).pdf(sample)
return pdf
def density_gmm_m(samples, params):
"""density for gauss mixture model, but a multiply of several independent gmm"""
pdf = 1
for param, sample in zip(params, samples):
pdf *= density_gmm(sample, param)
return pdf
if __name__ == '__main__':
trainA = list(np.loadtxt('trainA.txt'))
trainB = list(np.loadtxt('trainB.txt'))
testA = list(np.loadtxt('testA.txt'))
testB = list(np.loadtxt('testB.txt'))
trains = (trainA, trainB)
tests = (testA, testB)
ks = (2, 4, 6)
n_classes = len(trains)
paramses = [None]*n_classes
#for i in range(n_classes):
# train = trains[i]
# paramses[i] = gmm.gmm(k, train, 4)
#
#print(paramses)
classifier = functools.partial(mylib.classifier, density = density_gmm_m)
def dotest(k, max_iter):
print('Model Number is ' + str(k))
input("Press Enter to Continue: ")
for i in range(n_classes):
train = trains[i]
d = np.shape(train)[1]
dparams = [None]*d
for j in range(d):
dparams[j] = gmm.gmm(k,[x[j] for x in train], max_iter)
paramses[i] = dparams
for i, params in enumerate(paramses):
print("Class " + str(i))
for j, param in enumerate(params):
print(" Dimension " + str(j))
for l, m in enumerate(param):
print(' Model ' + str(l))
print(m)
input('Params calculated, Press Enter to stat true rate: ')
testlen = len(testA) + len(testB)
rate1 = mylib.statTrueRate(testA, paramses, classifier, 0 ) / testlen
rate2 = mylib.statTrueRate(testB, paramses, classifier, 1 ) / testlen
print(rate1 + rate2)
input('Files loaded, Press Enter to Continue: ')
for k in ks:
dotest(k, max_iter=4)
# classifier()