/**
* GeDBIT.index.algorithms.Correlation
*
* Copyright Information:
*
* Change Log:
* 2012.4: Added by Kewei Ma
*/
package GeDBIT.index.algorithms;
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.doublealgo.Statistic;
public class Correlation {
/**
* Use correlation matrix to do select pivots
*
* @param distance
* matrix
* @param pivots
* number
* @return pivots
*/
public static int[] runCor(DoubleMatrix2D matrix, int numP) {
// pivots
int result[] = new int[numP];
// whether data point is selected as pivot
boolean isChosen[] = new boolean[matrix.rows()];
// correlation matrix
DoubleMatrix2D coMatrix = Statistic.covariance(matrix);
// choose the first pivot with largest variance
for (int i = 1; i < coMatrix.rows(); i++) {
if (coMatrix.get(i, i) > coMatrix.get(result[0], result[0])) {
result[0] = i;
}
}
// set it true
isChosen[result[0]] = true;
// select rest pivots
if (numP > 1) {
Statistic.correlation(coMatrix);
for (int i = 1; i < numP; i++) {
double minCor[] = new double[i];
int minCorIndics[] = new int[i];
for (int j = 0; j < i; j++) {
for (int k = 0; k < coMatrix.rows(); k++) {
if (isChosen[k] == false) {
if (Math.abs(coMatrix.get(k, result[j])) < Math
.abs(coMatrix.get(minCorIndics[j],
result[j]))) {
minCorIndics[j] = k;
minCor[j] = Math
.abs(coMatrix.get(k, result[j]));
}
}
}
}
// pick largest ones as pivots
int index = 0;
for (int j = 1; j < minCorIndics.length; j++) {
if (minCor[j] > minCor[index])
index = j;
}
result[i] = minCorIndics[index];
isChosen[minCorIndics[index]] = true;
}
}
return result;
}
}