/******************************************************************************* * Copyright 2012 University of Southern California * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This code was developed by the Information Integration Group as part * of the Karma project at the Information Sciences Institute of the * University of Southern California. For more information, publications, * and related projects, please see: http://www.isi.edu/integration ******************************************************************************/ package edu.isi.karma.modeling.semantictypes.mycrf.map ; import edu.isi.karma.modeling.semantictypes.mycrf.crfmodel.CRFModelFieldOnly; import edu.isi.karma.modeling.semantictypes.mycrf.fieldonly.LblFtrPair; import edu.isi.karma.modeling.semantictypes.mycrf.globaldata.GlobalDataFieldOnly; import edu.isi.karma.modeling.semantictypes.mycrf.graph.GraphFieldOnly; import edu.isi.karma.modeling.semantictypes.mycrf.math.LargeNumber; import edu.isi.karma.modeling.semantictypes.myutils.Prnt; /** * This class predicts the semantic class given an example. * * @author amangoel * */ public class MAPFieldOnly { GlobalDataFieldOnly globalData ; public MAPFieldOnly(GlobalDataFieldOnly globalData) { this.globalData = globalData ; } public void findMap(String file) { CRFModelFieldOnly crfModel = globalData.crfModel ; GraphFieldOnly graph = new GraphFieldOnly(file, false, globalData) ; double largestExp = -1000000 ; int mostLikelyLabelIndex = -1 ; for(int l=0;l<globalData.labels.size();l++) { double exp = 0 ; for(int f=0;f<crfModel.ffs.size();f++) { LblFtrPair ff = crfModel.ffs.get(f) ; if (ff.labelIndex == l && graph.node.features.contains(ff.feature)) { exp = exp + crfModel.weights[f] ; } } if (exp > largestExp) { largestExp = exp ; mostLikelyLabelIndex = l ; } } Prnt.prn("For file : " + file + " The most likely label is " + globalData.labels.get(mostLikelyLabelIndex)) ; } public double[] probabilitiesForLabels(GraphFieldOnly graph) { double[] exps, prob; LargeNumber[] potentials; LargeNumber totalPotential ; exps = weightedFeatureFunctionSums(graph); potentials = new LargeNumber[globalData.labels.size()] ; totalPotential = new LargeNumber(0.0, 0) ; for(int i=0;i<globalData.labels.size();i++) { potentials[i] = LargeNumber.makeLargeNumberUsingExponent(exps[i]) ; totalPotential.plusEquals(potentials[i]) ; } prob = new double[globalData.labels.size()] ; for(int i=0;i<globalData.labels.size();i++) { prob[i] = LargeNumber.divide(potentials[i], totalPotential) ; } return prob ; } public double[] weightedFeatureFunctionSums(GraphFieldOnly graph) { CRFModelFieldOnly crfModel; double[] exps; crfModel = globalData.crfModel ; exps = new double[globalData.labels.size()] ; for(int ffIndex = 0 ; ffIndex < crfModel.ffs.size(); ffIndex++) { LblFtrPair ff; ff = crfModel.ffs.get(ffIndex) ; if (graph.node.features.contains(ff.feature)) { exps[ff.labelIndex]+=crfModel.weights[ffIndex] ; } } return exps; } }