afryca.ase.Snippet
Library
pca
var pca = (typeof exports === "undefined")?(function pca() {}):(exports);
if(typeof global !== "undefined") { global.pca = pca; }
pca.PCA = function(preferences, isDecisionMatrix) {
//Initialize DM matrix
var dm = pca.createConsensusMatrix(preferences.length, preferences[0][0].length);
var alternativesPreferencesExperts = [];
var preference;
var alternativesPreferences;
for(var ex = 0; ex < preferences.length; ex++){
preference = preferences[ex];
alternativesPreferences = pca.computeAlternativesDominance(preference, isDecisionMatrix);
alternativesPreferencesExperts[ex] = pca.substractMeanAlternativesDominance(alternativesPreferences);
pca.addRowToDecisionMatrix(dm, alternativesPreferencesExperts[ex], ex);
}
//Compute covariance-variance matrix
var mcov = pca.computeCovarianceMatrix(dm);
//Descomposition
var descomposition = pca.generateDescomposition(mcov);
//Eigen values
var eigenValues = pca.generateEigenValues(descomposition);
var maxIndexes = pca.getMaxEigenValue(eigenValues);
var max1 = maxIndexes[0];
var max2 = maxIndexes[1];
var eigenValue1 = eigenValues[max1];
var eigenValue2 = eigenValues[max2];
//EigenVectors
var eigenVector1 = pca.generateEigenVector(descomposition, max1);
var eigenVector2 = pca.generateEigenVector(descomposition, max2);
//Coordinates
var result = new Array(2);
result[0] = new Array(preferences.length);
result[1] = new Array(preferences.length);
for(var expert = 0; expert < preferences.length; expert++) {
result[0][expert] = pca.computeCoordinate(alternativesPreferencesExperts[expert], eigenVector1);
result[1][expert] = pca.computeCoordinate(alternativesPreferencesExperts[expert], eigenVector2);
}
return result;
}
pca.createConsensusMatrix = function(rows, cols) {
var matrix = [];
for(var i = 0; i < rows; i++) {
matrix[i] = [];
for(var j = 0; j < cols; j++) {
matrix[i][j] = 0;
}
}
return matrix;
}
pca.computeAlternativesDominance = function(preference, isDecisionMatrix) {
var numberOfAlternatives = preference[0].length;
if(isDecisionMatrix) {
var numberOfCriteria = preference.length;
var values = []
var acum;
for (var i = 0; i < numberOfAlternatives; i++) {
acum = 0;
for (var j = 0; j < numberOfCriteria; j++) {
acum += preference[j][i];
}
acum /= numberOfCriteria;
values[i] = acum;
}
return values;
} else {
var cm = pca.createConsensusMatrix(numberOfAlternatives, numberOfAlternatives);
var value, value1, value2;
for (var i = 0; i < (numberOfAlternatives - 1); i++) {
for (var j = (i + 1); j < numberOfAlternatives; j++) {
value1 = preference[i][j];
value2 = preference[j][i];
value = value1 - value2;
if (value > 0) {
cm[i][j] = value;
cm[j][i] = 0;
} else {
cm[j][i] = -value;
cm[i][j] = 0;
}
}
}
return pca.computeDominanceValues(cm);
}
}
pca.computeDominanceValues = function(cm) {
var values = [];
var value;
var max;
for (var i = 0; i < cm.length; i++) {
max = 0;
for (var j = 0; j < cm.length; j++) {
if (i != j) {
value = cm[j][i];
if (value > max) {
max = value;
}
}
}
values[i] = Math.round(max * 100.0) / 100.0;
}
return values;
}
pca.substractMeanAlternativesDominance = function(alternativesPreferences) {
var mean = 0;
for(var i = 0; i < alternativesPreferences.length; ++i) {
mean += alternativesPreferences[i];
}
mean /= alternativesPreferences.length;
for(var i = 0; i < alternativesPreferences.length; ++i) {
alternativesPreferences[i] -= mean;
}
return alternativesPreferences;
}
pca.addRowToDecisionMatrix = function(dm, alternativesPreferences, expert) {
for(var i = 0; i < dm[0].length; ++i) {
dm[expert][i] = alternativesPreferences[i];
}
}
pca.computeCovarianceMatrix = function(dm) {
var mx = MatrixUtils.createRealMatrix(dm);
var cov = new Covariance(mx).getCovarianceMatrix();
return cov.getData();
}
pca.generateDescomposition = function(preferencesAux) {
var matrix = MatrixUtils.createRealMatrix(preferencesAux);
var descomposition = new EigenDecomposition(matrix);
return descomposition;
}
pca.generateEigenValues = function(descomposition) {
var eigenValues = descomposition.getRealEigenvalues();
var eigenValuesAux = new Array(eigenValues.length);
for(var h = 0;h < eigenValues.length; h++) {
eigenValuesAux[h] = Math.round(eigenValues[h] * 1000) / 1000;
}
return eigenValuesAux;
}
pca.generateEigenVector = function(descomposition, max) {
var eigenVector = descomposition.getEigenvector(max);
var eigenVectorAux = [];
for(var h = 0;h < eigenVector.getDimension(); h++){
eigenVectorAux[h] = eigenVector.getEntry(h);
}
return eigenVectorAux;
}
pca.getMaxEigenValue = function(eigenValues) {
var max1 = -1;
var indexMax1;
for(var i = 0; i < eigenValues.length; ++i) {
if(max1 < eigenValues[i]) {
max1 = eigenValues[i];
indexMax1 = i;
}
}
var indexMax2;
var max2 = -1;
for(var i = 0; i < eigenValues.length; ++i) {
if(i != indexMax1) {
if(max2 < eigenValues[i]) {
max2 = eigenValues[i];
indexMax2 = i;
}
}
}
var indexes = [];
indexes[0] = indexMax1;
indexes[1] = indexMax2;
return indexes;
}
pca.computeCoordinate = function(v1, v2) {
var acum = 0;
for(var i = 0; i < v1.length; ++i) {
acum += v1[i] * v2[i];
}
return acum;
}
pca.PCA3D = function(preferences, isDecisionMatrix) {
//Initialize DM matrix
var dm = pca.createConsensusMatrix(preferences.length, preferences[0][0].length);
var alternativesPreferencesExperts = [];
var preference;
var alternativesPreferences;
for(var ex = 0; ex < preferences.length; ex++){
preference = preferences[ex];
alternativesPreferences = pca.computeAlternativesDominance(preference, isDecisionMatrix);
alternativesPreferencesExperts[ex] = pca.substractMeanAlternativesDominance(alternativesPreferences);
pca.addRowToDecisionMatrix(dm, alternativesPreferencesExperts[ex], ex);
}
//Compute covariance-variance matrix
var mcov = pca.computeCovarianceMatrix(dm);
//Descomposition
var descomposition = pca.generateDescomposition(mcov);
//Eigen values
var eigenValues = pca.generateEigenValues(descomposition);
var maxIndexes = pca.getMaxEigenValue3D(eigenValues);
//Indexes of maximal eigen values
var max1 = maxIndexes[0];
var max2 = maxIndexes[1];
var max3 = maxIndexes[2];
var eigenValue1 = eigenValues[max1];
var eigenValue2 = eigenValues[max2];
var eigenValue3 = eigenValues[max3];
//EigenVectors
var eigenVector1 = pca.generateEigenVector(descomposition, max1);
var eigenVector2 = pca.generateEigenVector(descomposition, max2);
var eigenVector3 = pca.generateEigenVector(descomposition, max3);
//Coordinates
var result = new Array(2);
result[0] = new Array(preferences.length);
result[1] = new Array(preferences.length);
result[2] = new Array(preferences.length);
for(var expert = 0; expert < preferences.length; expert++) {
result[0][expert] = pca.computeCoordinate(alternativesPreferencesExperts[expert], eigenVector1);
result[1][expert] = pca.computeCoordinate(alternativesPreferencesExperts[expert], eigenVector2);
result[2][expert] = pca.computeCoordinate(alternativesPreferencesExperts[expert], eigenVector3);
}
return result;
}
pca.getMaxEigenValue3D = function(eigenValues) {
var max1 = -1;
var indexMax1;
for(var i = 0; i < eigenValues.length; ++i) {
if(max1 < eigenValues[i]) {
max1 = eigenValues[i];
indexMax1 = i;
}
}
var indexMax2;
var max2 = -1;
for(var i = 0; i < eigenValues.length; ++i) {
if(i != indexMax1) {
if(max2 < eigenValues[i]) {
max2 = eigenValues[i];
indexMax2 = i;
}
}
}
var indexMax3;
var max3 = -1;
for(var i = 0; i < eigenValues.length; ++i) {
if(i != indexMax1 && i != indexMax2) {
if(max3 < eigenValues[i]) {
max3 = eigenValues[i];
indexMax3 = i;
}
}
}
var indexes = [];
indexes[0] = indexMax1;
indexes[1] = indexMax2;
indexes[2] = indexMax3;
return indexes;
}
pca