-
Notifications
You must be signed in to change notification settings - Fork 1
/
optimize.py
44 lines (33 loc) · 1.65 KB
/
optimize.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
import random
import numpy
from scipy.optimize import fmin_l_bfgs_b
from classifier import Classifier
MAX_ITERATIONS = 50
def optimize_parameters(feature_extractor, word_problems, unique_templates,
wp_template_map):
wp_template_indices = [wp_template_map[wp.labeled_example.index]
for wp in word_problems]
ordered_features = feature_extractor.ordered_features
feature_count = len(ordered_features)
weights = numpy.array([random.random() for _ in range(feature_count)])
classifier = Classifier(feature_extractor, weights, unique_templates)
# TODO(Eric): add regularization
# L^{2} norm and \lambda = 0.1
def func_to_min(parameters):
classifier.parameters = parameters
return -classifier.log_likelihood(word_problems, wp_template_indices,
unique_templates)
# TODO(Eric): verify that the negative here is correct
def gradient(parameters):
classifier.parameters = parameters
return -classifier.log_likelihood_gradient(word_problems,
wp_template_indices,
unique_templates)
optimal, final_value, details = fmin_l_bfgs_b(func_to_min, weights,
fprime=gradient,
maxfun=MAX_ITERATIONS,
maxiter=MAX_ITERATIONS)
print('final_value: {}'.format(final_value))
print('details: {}'.format(details))
classifier.parameters = optimal
return classifier