Statistiques
| Révision :

root / tmp / org.txm.analec.rcp / src matt / JamaPlus / SparseAFC.java @ 3100

Historique | Voir | Annoter | Télécharger (2,27 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
import JamaPlus.SparseSVD.SparseSVDException;
8 481 mdecorde
9 481 mdecorde
/**
10 481 mdecorde
 /**
11 481 mdecorde
 *
12 481 mdecorde
 * SparseAFC analyse factorielle des correspondances (matrices creuses)
13 481 mdecorde
 * mat :  matrice binaire (0. ou 1.) profil des lignes (un individu par ligne, un caractère par colonne)
14 481 mdecorde
 * CP: composantes principales,
15 481 mdecorde
 * VP: valeurs d'inertie,
16 481 mdecorde
 * CG: centres de gravité des CP contenant un même caractère (non calculé dans cette version)
17 481 mdecorde
 * [p,q] = size(mat); p:nb de lignes, q:nb de col
18 481 mdecorde
 *
19 481 mdecorde
 * @author Bernard Victorri
20 481 mdecorde
 */
21 481 mdecorde
public class SparseAFC {
22 481 mdecorde
  private double[][] CP;
23 481 mdecorde
  private double[] VP;
24 481 mdecorde
  private int p, q, n;
25 481 mdecorde
26 481 mdecorde
  SparseAFC(SparseMatrix Arg) throws SparseSVDException {
27 481 mdecorde
    SparseMatrix mat = Arg.copy();
28 481 mdecorde
    mat.nulColumnSuppression();
29 481 mdecorde
    p = mat.getRowDimension();
30 481 mdecorde
    q = mat.getColumnDimension();
31 481 mdecorde
    n = Math.min(Math.min(p, q), 5);
32 481 mdecorde
    // n : nombre de composantes principales espérées (pas plus de 5)
33 481 mdecorde
    if (n == 0) return;
34 481 mdecorde
    if (n == 1) {
35 481 mdecorde
      CP = new double[p][1];
36 481 mdecorde
      VP = new double[1];
37 481 mdecorde
      return;
38 481 mdecorde
    }
39 481 mdecorde
    double f = mat.elementSum();
40 481 mdecorde
    if (f == 0) return;
41 481 mdecorde
    mat = mat.timesEquals(1 / f);
42 481 mdecorde
    Matrix r = mat.lineSum();
43 481 mdecorde
    Matrix r1 = r.arrayInverse();
44 481 mdecorde
    Matrix r2 = r.arraySqrt();
45 481 mdecorde
    Matrix r3 = r2.arrayInverse();
46 481 mdecorde
    Matrix c = mat.columnSum();
47 481 mdecorde
    Matrix c1 = c.arrayInverse();
48 481 mdecorde
    Matrix c2 = c.arraySqrt();
49 481 mdecorde
    Matrix c3 = c2.arrayInverse();
50 481 mdecorde
    mat = mat.firstColumnTimesEqual(r3);
51 481 mdecorde
    mat = mat.firstLineTimesEqual(c3);
52 481 mdecorde
    SparseSVD svd = mat.svd(n);
53 481 mdecorde
    Matrix cp = svd.getU();
54 481 mdecorde
    Matrix vp = new Matrix(svd.getSingularValues(), 1);
55 481 mdecorde
    n = vp.getColumnDimension();
56 481 mdecorde
    // peut-être moins de composantes principales effectivement calculées
57 481 mdecorde
     if (n == 0) return;
58 481 mdecorde
    if (n == 1) {
59 481 mdecorde
      CP = new double[p][1];
60 481 mdecorde
      VP = new double[1];
61 481 mdecorde
      return;
62 481 mdecorde
    }
63 481 mdecorde
    cp = cp.getMatrix(0, p - 1, 1, n - 1);
64 481 mdecorde
    cp = cp.firstColumnTimesEqual(r2);
65 481 mdecorde
    vp = vp.getMatrix(0, 0, 1, n - 1);
66 481 mdecorde
    cp = cp.firstLineTimesEqual(vp);
67 481 mdecorde
    cp.fixColumnSigns();
68 481 mdecorde
    cp = cp.firstColumnTimesEqual(r1);
69 481 mdecorde
    CP = cp.getArray();
70 481 mdecorde
    VP = vp.getColumnPackedCopy();
71 481 mdecorde
  }
72 481 mdecorde
73 481 mdecorde
  public Matrix getCP() {
74 481 mdecorde
    if (CP == null) return null;
75 481 mdecorde
    return new Matrix(CP, p, n - 1);
76 481 mdecorde
  }
77 481 mdecorde
78 481 mdecorde
  public double[] getVP() {
79 481 mdecorde
    return VP;
80 481 mdecorde
  }
81 481 mdecorde
}