001/**
002 * 
003 */
004package org.dllearner.algorithms.isle.metrics;
005
006import org.dllearner.algorithms.isle.index.Index;
007import org.semanticweb.owlapi.model.OWLEntity;
008
009/**
010 * Chi Squared
011 * @author Andre Melo
012 *
013 */
014public class ChiSquareRelevanceMetric extends AbstractRelevanceMetric {
015
016        public ChiSquareRelevanceMetric(Index index) {
017                super(index);
018        }
019        
020        private double chiSquareIteration(double fXY, double e_fXY) {
021                return Math.pow(fXY - e_fXY, 2)/e_fXY;  
022        }
023
024        @Override
025        public synchronized double getRelevance(OWLEntity entityA, OWLEntity entityB){
026                double fA = index.getNumberOfDocumentsFor(entityA);
027                double fB = index.getNumberOfDocumentsFor(entityB);
028                double N = index.getTotalNumberOfDocuments();
029                
030                if (N==0 || fA==0 || fB==0)
031                        return 0;
032                
033                double fAB = index.getNumberOfDocumentsFor(entityA, entityB);
034                
035                double e_fAB = fA*fB/N; // Expected frequency of A and B assuming independence
036                
037                double chi2 = 0;
038                
039                // X=A          and     Y=B
040                chi2 += chiSquareIteration(fAB, e_fAB);
041                // X=A          and     Y=not B
042                chi2 += chiSquareIteration(fA-fAB, fA-e_fAB);
043                // X=not A      and     Y=B
044                chi2 += chiSquareIteration(fB-fAB, fB-e_fAB);
045                // X=not A      and     Y=not B
046                chi2 += chiSquareIteration(N-fA-fB+fAB, N-fA-fB+e_fAB);
047                
048                return chi2;
049        }
050        
051        @Override
052        public synchronized double getNormalizedRelevance(OWLEntity entityA, OWLEntity entityB){
053                return Double.NaN;
054        }
055
056}