package gr.iti.mklab.visual.utilities; import java.util.Arrays; /** * This class contains vector normalization methods. * * @author Eleftherios Spyromitros-Xioufis * */ public class Normalization { /** * This method applies L2 normalization on a given array of doubles. The passed vector is modified by the * method. * * @param vector * the original vector * @return the L2 normalized vector */ public static double[] normalizeL2(double[] vector) { // compute vector 2-norm double norm2 = 0; for (int i = 0; i < vector.length; i++) { norm2 += vector[i] * vector[i]; } norm2 = (double) Math.sqrt(norm2); if (norm2 == 0) { Arrays.fill(vector, 1); } else { for (int i = 0; i < vector.length; i++) { vector[i] = vector[i] / norm2; } } return vector; } /** * This method applies L1 normalization on a given array of doubles. The passed vector is modified by the * method. * * @param vector * the original vector * @return the L1 normalized vector */ public static double[] normalizeL1(double[] vector) { // compute vector 1-norm double norm1 = 0; for (int i = 0; i < vector.length; i++) { norm1 += Math.abs(vector[i]); } if (norm1 == 0) { Arrays.fill(vector, 1.0 / vector.length); } else { for (int i = 0; i < vector.length; i++) { vector[i] = vector[i] / norm1; } } return vector; } /** * This method applies power normalization on a given array of doubles. The passed vector is modified by * the method. * * @param vector * the original vector * @param aParameter * the a parameter used * @return the power normalized vector */ public static double[] normalizePower(double[] vector, double aParameter) { for (int i = 0; i < vector.length; i++) { vector[i] = Math.signum(vector[i]) * Math.pow(Math.abs(vector[i]), aParameter); } return vector; } /** * This method applies Signed Square Root (SSR) normalization (component-wise square rooting followed be * L2 normalization) on a given array of doubles. The passed vector is modified by the method. * * @param vector * the original vector * @return the SSR normalized vector */ public static double[] normalizeSSR(double[] vector) { normalizePower(vector, 0.5); normalizeL2(vector); return vector; } }