def adjustHigherOrder(self, evidence, order, maximumDiscount):
def criterion(discount):
disc = tuple(num.maximum(0.0, discount))
sm = self.modelFactory.sequenceModel(evidence, disc)
ll = self.develSample.logLik(sm, self.shallUseMaximumApproximation)
crit = - ll \
- sum(num.minimum(discount, 0)) \
+ sum(num.maximum(discount - maximumDiscount, 0))
print discount, ll, crit # TESTING
return crit
initialGuess = self.discounts[-1]
firstDirection = None
if initialGuess is None:
initialGuess = 0.1 * num.arange(1, order+2, dtype=num.float64)
elif len(initialGuess) < order+1:
oldGuess = initialGuess
oldSize = len(initialGuess)
initialGuess = num.zeros(order+1, dtype=num.float64)
initialGuess[:oldSize] = oldGuess
initialGuess[oldSize:] = oldGuess[-1]
elif len(initialGuess) > order+1:
initialGuess = initialGuess[:order+1]
else:
previous = self.discounts[-2]
if previous is not None and len(previous) == order+1:
firstDirection = initialGuess - previous
if not num.sometrue(num.abs(firstDirection) > 1e-4):
firstDirection = None
directions = num.identity(order+1, dtype=num.float64)
directions = directions[::-1]
if firstDirection is not None:
directions = num.concatenate((firstDirection[num.newaxis,:], directions))
directions *= 0.1
print directions # TESTING
discount, ll = Minimization.directionSetMinimization(
criterion, initialGuess, directions, tolerance=1e-4)
discount = num.maximum(0.0, discount)
return discount, -ll
评论列表
文章目录