Statistiques
| Révision :

root / tmp / org.txm.analec.rcp / src / JamaPlus / AFC.java @ 3093

Historique | Voir | Annoter | Télécharger (1,94 ko)

1 481 mdecorde
/*
2 481 mdecorde
 * To change this template, choose Tools | Templates
3 481 mdecorde
 * and open the template in the editor.
4 481 mdecorde
 */
5 481 mdecorde
package JamaPlus;
6 481 mdecorde
7 481 mdecorde
/**
8 481 mdecorde
 *
9 481 mdecorde
 * AFC analyse factorielle des correspondances (optimisé mémoire)
10 481 mdecorde
 * mat :  matrice binaire (0. ou 1.) profil des lignes (un individu par ligne, un caractère par colonne)
11 481 mdecorde
 * CP: composantes principales,
12 481 mdecorde
 * VP: valeurs d'inertie,
13 481 mdecorde
 * CG: centres de gravité des CP contenant un même caractère (non calculé dans cette version)
14 481 mdecorde
 * [p,q] = size(mat); p:nb de lignes, q:nb de col
15 481 mdecorde
 *
16 481 mdecorde
 * @author Bernard
17 481 mdecorde
 */
18 481 mdecorde
public class AFC {
19 481 mdecorde
20 481 mdecorde
  private double[][] CP;
21 481 mdecorde
  private double[] VP;
22 481 mdecorde
  private int p, q, n;
23 481 mdecorde
24 481 mdecorde
  AFC(Matrix Arg) {
25 481 mdecorde
    Matrix mat = Arg.copy();
26 481 mdecorde
    mat = mat.nulColumnSuppression();
27 481 mdecorde
    p = mat.getRowDimension();
28 481 mdecorde
    q = mat.getColumnDimension();
29 481 mdecorde
    n = Math.min(Math.min(p, q), 5); // n : nombre de composantes principales calculées
30 481 mdecorde
    if (n == 0) return;
31 481 mdecorde
    if (n == 1) {
32 481 mdecorde
      CP = new double[p][1];
33 481 mdecorde
      VP = new double[1];
34 481 mdecorde
      return;
35 481 mdecorde
    }
36 481 mdecorde
    double f = mat.elementSum();
37 481 mdecorde
    if (f == 0) return;
38 481 mdecorde
    mat = mat.timesEquals(1 / f);
39 481 mdecorde
    Matrix r = mat.lineSum();
40 481 mdecorde
    Matrix r1 = r.arrayInverse();
41 481 mdecorde
    Matrix r2 = r.arraySqrt();
42 481 mdecorde
    Matrix r3 = r2.arrayInverse();
43 481 mdecorde
    Matrix c = mat.columnSum();
44 481 mdecorde
    Matrix c1 = c.arrayInverse();
45 481 mdecorde
    Matrix c2 = c.arraySqrt();
46 481 mdecorde
    Matrix c3 = c2.arrayInverse();
47 481 mdecorde
    mat = mat.firstColumnTimesEqual(r3);
48 481 mdecorde
    mat = mat.firstLineTimesEqual(c3);
49 481 mdecorde
    SingularValueDecomposition svd = mat.svd();
50 481 mdecorde
    Matrix cp = svd.getU();
51 481 mdecorde
    Matrix vp = new Matrix(svd.getSingularValues(), 1);
52 481 mdecorde
    cp = cp.getMatrix(0, p - 1, 1, n - 1);
53 481 mdecorde
    cp = cp.firstColumnTimesEqual(r2);
54 481 mdecorde
    vp = vp.getMatrix(0, 0, 1, n - 1);
55 481 mdecorde
    cp = cp.firstLineTimesEqual(vp);
56 481 mdecorde
    cp.fixColumnSigns();
57 481 mdecorde
    cp = cp.firstColumnTimesEqual(r1);
58 481 mdecorde
    CP = cp.getArray();
59 481 mdecorde
    VP = vp.getColumnPackedCopy();
60 481 mdecorde
  }
61 481 mdecorde
62 481 mdecorde
  public Matrix getCP() {
63 481 mdecorde
    if (CP == null) return null;
64 481 mdecorde
    return new Matrix(CP, p, n - 1);
65 481 mdecorde
  }
66 481 mdecorde
67 481 mdecorde
  public double[] getVP() {
68 481 mdecorde
    return VP;
69 481 mdecorde
  }
70 481 mdecorde
}