On suppose que les données sont des réels.
La classe Data contient donc simplement
Length : entier donnant le nombre de valeurs par donnée
Values : un tableau de double contenant les valeurs
NormValues : un tableau contenant les valeurs normalisées
Cluster : un lien vers le Cluster associé
Donnons 2 constructeurs, l’un par défaut, l’autre initialisant les valeurs de ’values’ :
1. class Data implements Cloneable {
2. /**nb of values in a data*/
3. int length;
4. /**the values*/
5. private double[]values;
6. /**the values, normalized*/
7. double[]normValues;
8. /**cluster associated to the data*/
9. Cluster cluster;
10.
11. /**
12. * define the values, the normValues and the length
13. * @param _length the nb of values*/
14. public Data(int _length) {
15. length = _length;
16. values = new double[length];
17. normValues= new double[length];
18. }
19. /**
20. * initialize the values, the length and define the normValues
21. * @param tab the list of values*/
22. public Data(double ...tab) {
23. this(tab.length);
24. values = Arrays.copyOf(tab, tab.length);
25. }
Il y a différentes méthodes de normalisation, ici, nous utiliserons simplement une division de chaque valeur (compétence maitrisée i) par le maximum trouvé dans son vecteur/sa colonne.
Si max est un tableau de double, le remplissage du tableau des valeurs normalisées s’écrit :
1. /**create the array of normalized values
2. * @param maxs arrays of maximal values*/
3. void normalize(double[]maxs) {
4. normValues = new double[length];
5. Arrays.setAll(normValues, i->values[i]/maxs[i]);
6. }
Ajoutons une méthode permettant de calculer la distance entre une donnée et une autre en se basant sur les valeurs normalisées :
1. /**compute the euclidian distance between the current value and another one
2. * @param o the Other value to be compared with
3. * @return the distance between the current data and the other*/
4. public double distNorm(Data o) {
5. double sum = 0;
6. for(int i=0; i<length; i++)
7. sum += Math.pow(normValues[i] - o.normValues[i], 2);
8. return Math.sqrt(sum);
9. }
Ajoutons aussi une méthode toString() qui retourne la liste des valeurs en les formatant à 2 chiffres après la virgules.. :
1. /** @return the list of the values * */
2. @Override
3. public String toString() {
4. StringBuilder sb = new StringBuilder("(");
5. String sep=", ";
6. for(double v:values)
7. sb.append(String.format(Locale.ENGLISH,"%.2f", v)).append(sep);
8. sb.append(")");
9. return sb.toString();
Ajoutons une méthode de clonage
1. /** @return a clone of the data*/
2. protected Data clone() {
3. Data copy = new Data(values);
4. copy.normValues = Arrays.copyOf(normValues, length);
5. return copy;
6. }
Ainsi qu’un ensemble de fonctions d’accès aux données (getters et setters), cf. le fichier attaché.