package CFM;
/*
* Balanced Mutual Information (BMI)
* calcola il grado di associazione tra due termini
*/
public class BMI implements CorrelationFunction{
private double beta;
private static final double def_beta=0.51f;
private static PMI mi = new PMI();
public BMI(){
this(def_beta);
}
public BMI(double b){
this.beta=b;
}
public double calculateCorrelation(double p_x, double p_y, double p_x_y) {
double p_nx_ny = 1 - (p_x + p_y - p_x_y); // Pr(!x,!y)
double p_x_ny = p_x - p_x_y; // Pr(x, !y)
double p_nx_y = p_y - p_x_y; // Pr(!x, y)
double p_nx = 1 - p_x; // Pr(!x)
double p_ny = 1 - p_y; // Pr(!y)
double mi_x_y, mi_nx_ny, mi_x_ny, mi_nx_y;
double bmi;
mi_x_y = mi.calculateCorrelation(p_x, p_y, p_x_y);
mi_nx_ny = mi.calculateCorrelation(p_nx, p_ny, p_nx_ny);
mi_x_ny = mi.calculateCorrelation(p_x, p_ny, p_x_ny);
mi_nx_y = mi.calculateCorrelation(p_nx, p_y, p_nx_y);
bmi = beta * ( p_x_y * mi_x_y + p_nx_ny * mi_nx_ny)
- (1 - beta) * ( p_x_ny * mi_x_ny + p_nx_y * mi_nx_y);
return bmi;
}
}