Esempio n. 1
0
  public void testRule(NumericalRule rule, int minSupport, float minAccuracy) throws SQLException {
    // System.out.println("!!!"+rule.getRuleString()+"!!!");

    String prediction = rule.getHead().getConstant();
    int positivesCount = 0;
    int negativesCount = 0;

    String sparql = createTestQuery(rule);

    // System.out.println(sparql);

    long t = System.currentTimeMillis();
    ResultSet rs = (ResultSet) qh.executeQuery(sparql);
    // System.out.println("Executed in "+(System.currentTimeMillis()-t));

    float overallAcc =
        ((float)
                ArrayTools.sum(
                    ArrayTools.multiply(
                        rule.getAccuracyDistribution(), rule.getSupportDistribution())))
            / ((float) ArrayTools.sum(rule.getSupportDistribution()));

    float[] acc =
        ArrayTools.getAccuraciesWithMinSupport(
            rule.getSupportDistribution(), rule.getBodySupportDistribution(), minSupport);

    String ranges = "";

    for (int i = 0; i < acc.length; i++) {
      if (acc[i] >= minAccuracy) ranges += "+";
      else ranges += "-";
    }
    // System.out.println(ranges);

    // ArrayTools.print(acc);

    float lastNum = Float.NaN;
    while (rs.next()) {
      float num = rs.getFloat(1);
      String observation = rs.getString(2).replaceAll("\"", "");
      int count = rs.getInt(3);

      int bucket = histogram.getBucket(num);
      if (acc[bucket] >= minAccuracy) {
        if (prediction.equals(observation)) positivesCount += count;
        else negativesCount += count;
      }

      lastNum = num;
    }

    int coveringCount = positivesCount + negativesCount;
    float predictionAccuracy = ((float) positivesCount) / (((float) (coveringCount)));
    // System.out.println(rule.getRuleString() + "\n[" + predictionAccuracy + "," + coveringCount +
    // "] = ("+positivesCount+"/"+negativesCount+")");
    rule.observedConfidence = predictionAccuracy;
    rule.observedPositives = positivesCount;
    rule.observedNegatives = negativesCount;
    rule.observedOverallConfidence = overallAcc;
  }