def initMixtureModel(data, hyperParams): # Initialize parameter data structs C = hyperParams.C K = hyperParams.K mixture = [1.0 / C] * C multinomials = [] for c in range(0, C): randomMultinomial = ST.drawFromDirichlet(hyperParams.componentDirich) multinomials.append(randomMultinomial) return MME.MultinomialMixtureModel(C, K, multinomials, mixture)
def readSingleTreeFromInfile(reader): next = reader.next() mixture = map(float, next) if (len(mixture) == 0): return None # We've reached a terminal node multinomials = [] for i in range(0, len(mixture)): row = reader.next() multinomials.append(map(float, row)) K = 2 if (len(multinomials) > 0): K = len(multinomials[0]) return MME.MultinomialMixtureModel(len(mixture), K, multinomials, mixture)
def initMixtureModel(data, hyperParams): # Initialize parameter data structs C = hyperParams.C K = hyperParams.K mixture = [1.0 / C] * C multinomials = [] for c in range(0, C): multinomials.append([0.0] * K) denominator = sum(data[c]) + sum(hyperParams.componentDirich) for k in range(0, K): numerator = float(data[c][k]) + hyperParams.componentDirich[k] multinomials[c][k] = numerator / denominator return MME.MultinomialMixtureModel(C, K, multinomials, mixture)
def updateMixtureModel(data, params, hyperParams, batchSize, learnRate): minibatch = makeMinibatch(data, batchSize) # Initialize parameter data structs C = params.C K = params.K mixtureCounts = [0.] * C multinomialCounts = [] for c in range(0, C): mixtureCounts[c] += hyperParams.mixtureDirich[c] multinomialCounts.append([0.] * K) for k in range(0, K): multinomialCounts[c][k] += hyperParams.componentDirich[k] # Loop through the data and update param data structs for row in minibatch: cProbs = MME.getComponentProbabilitiesForCounts(row, params) for c in range(0, C): mixtureCounts[c] += cProbs[c] for k in range(0, K): multinomialCounts[c][k] += row[k] * cProbs[c] # Update the mixture probabilities sumMixtureCounts = sum(mixtureCounts) for c in range(0, C): mixtureCounts[c] /= sumMixtureCounts mixtureCounts[c] = learnRate * mixtureCounts[c] + ( 1 - learnRate) * params.mixture[c] # Update the multinomial probabilities for c in range(0, C): multinomialSum = sum(multinomialCounts[c]) for k in range(0, K): multinomialCounts[c][k] /= multinomialSum multinomialCounts[c][k] = learnRate * multinomialCounts[c][k] + ( 1 - learnRate) * params.multinomials[c][k] return MME.MultinomialMixtureModel(C, K, multinomialCounts, mixtureCounts)