// for each pair of other objects
Iterator<DBID> iter = data.iterDBIDs();
// Collect Explanation Vectors
while(iter.hasNext()) {
MeanVariance s2 = new MeanVariance();
DBID key1 = iter.next();
Iterator<DBID> iter2 = data.iterDBIDs();
if(objKey.equals(key1)) {
continue;
}
while(iter2.hasNext()) {
DBID key2 = iter2.next();
if(key2.equals(key1) || objKey.equals(key2)) {
continue;
}
double nenner = calcDenominator(kernelMatrix, objKey, key1, key2);
if(nenner != 0) {
double tmp = calcNumerator(kernelMatrix, objKey, key1, key2) / nenner;
double sqr = Math.sqrt(nenner);
s2.put(tmp, 1 / sqr);
}
}
explain.add(new FCPair<Double, DBID>(s2.getSampleVariance(), key1));
s.put(s2);
}
// build variance of the observed vectors
pq.add(new FCPair<Double, DBID>(s.getSampleVariance(), objKey));
//
LinkedList<DBID> expList = new LinkedList<DBID>();
expList.add(explain.remove().getSecond());
while(!explain.isEmpty()) {
DBID nextKey = explain.remove().getSecond();
if(nextKey.equals(objKey)) {
continue;
}
double max = Double.MIN_VALUE;
for(DBID exp : expList) {
if(exp.equals(objKey) || nextKey.equals(exp)) {
continue;
}
double nenner = Math.sqrt(calcCos(kernelMatrix, objKey, nextKey)) * Math.sqrt(calcCos(kernelMatrix, objKey, exp));
double angle = calcNumerator(kernelMatrix, objKey, nextKey, exp) / nenner;
max = Math.max(angle, max);
}
if(max < 0.5) {
expList.add(nextKey);
}
}
explaintab.put(objKey, expList);
}
System.out.println("--------------------------------------------");
System.out.println("Result: ABOD");
int count = 0;
while(!pq.isEmpty()) {
if(count > 10) {
break;
}
double factor = pq.peek().getFirst();
DBID key = pq.remove().getSecond();
System.out.print(data.get(key) + " ");
System.out.println(count + " Factor=" + factor + " " + key);
LinkedList<DBID> expList = explaintab.get(key);
generateExplanation(data, key, expList);
count++;