Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1101
II Semestre 2010
[<=] [home] [<>] [\/] [=>]
CI-1101 Programación 1

Tarea #7 [solución]

Operaciones matriciales para regresión lineal múltiple

ID,NOMBRE,KG,MTS
1,Ana,45,1.5
2,Karla,47,1.49
3,Luisa,48,1.51
4,Carlos,51,1.51
5,Enrique,54,1.52
6,María,54,1.54
7,Daniel,57,1.55
8,Silvia,56,1.56
9,Ronald,60,1.56
10,Laura,63,1.58
11,Leo,66,1.57
12,Sandra,64,1.6
13,Eddy,69,1.59
14,Mauro,70,1.62
15,Patricia,62,1.61
16,Julia,61,1.64
17,Roberto,70,1.65
18,Francisco,66,1.66
19,Andrea,57,1.68
20,Juan,63,1.67
21,Raúl,64,1.7
22,Ivannia,60,1.71
23,Jorge,67,1.72
24,Luis,69,1.74
25,Guillermo,67,1.75
26,Rosa,63,1.76
27,Elena,65,1.75
28,Rodolfo,75,1.76
29,Mario,78,1.77
30,Ileana,69,1.78
31,Santiago,81,1.78
32,William,84,1.79
33,Mayela,72,1.79
34,Flor,75,1.8
35,Javier,87,1.81
36,Isabel,77,1.82
37,Fabricio,88,1.82
38,Sonia,81,1.83
39,Claudia,83,1.84
40,Víctor,90,1.83
41,Fernando,93,1.84
42,Beatriz,86,1.85
43,Diego,95,1.86
44,Mariana,90,1.88
45,Teodora,92,1.87
46,Federico,99,1.88
47,Danilo,102,1.9
48,Jaime,107,1.92

      En esta tabla están las mediciones que se les hizo a un grupo de personas con el fin de determinar si es posible predecir el peso de una persona a partir de su altura. Para lograr un mejor ajuste, en el modelo de regresión lineal múltiple se usa tanto la altura, como el cuadrado de la altura y el cubo de la altura. En fórmulas matemáticas, el modelo es el siguiente:
      peso = a + b*altura + c * (altura)*(altura) + d (altura)*(altura)*(altura) + err
Aquí, el valor (err) es el error de ajuste. Si usamos la notación abreviada Y==peso y X==altura, la fórmula matemática de la regresión es la siguiente:
      Yi = a + bXi + cXi2 + dXi3 + err
Al hacer la regresión lineal múltiple se logra encontrar los valores óptimos para el vector B[]=(a,b,c,d) que tiene 4 valores porque la cantidad de columnas de X[][] es 4.

      Para obtener la regresión, usted debe construir primero la matriz X a partir de los valores de la tabla. La matriz X tiene 48 filas porque se dispone de las mediciones (peso:altura) para 48 personas. X tiene estas 4 columnas:

      Para implementar su programa, usted debe grabar en el archivo "p1-ta-7.csv" el contenido de la tabla de valores (puede copiar todos esos valores al editor de DrJava para luego guardarlos). Luego utilize la clase Scanner junto con el método String.split() para leer todos el contenido del archivo almacenado en formato CSV:

     String  ln = null, str[] = null;
     Scanner sc = new Scanner( new File("p1-ta-7.csv") );
     // lee ID,NOMBRE,KG,MTS
     ln = sc.nextLine(); // desecha el primer renglón del archivo
     while ( sc.hasNextLine() ) {
         ln  = sc.nextLine();
         str = ln.split( "," );
         // etc...
     }

La fórmula para resolver la regresión lineal es la siguiente:
      B = ( ( XTX )-1 XT Y )
en donde MT es la matriz traspuesta de M y la matriz M-1 es la inversa de M.


Las instrucciones específicas para usar la biblioteca JAMA son las siguientes:

      Para esta tarea programada usted debe enviarme estos archivos:

  1. PesoAltura.java
  2. PesoAltura.drjava
  3. CARNET.docx
  4. CARNET.html
  5. CARNET.url

Consulta:
Profe: Para obtener los campos de la matriz, en lugar de usar el String.split(), ¿puedo usar la biblioteca JavaCSV?
Respuesta:
Por supuesto, aunque para esta tarea programada es suficiente usar String.split(). Podés jalar la biblioteca completa de aquí:
http://sourceforge.net/projects/javacsv/
Consulta:
Profe: ¿Cómo hago para calcular el tamaño de la matriz? El problema que tengo es que si la hago pequeña se me revienta el programa, pero si la hago muy grande se me desperdicia mucho el espacio.
Respuesta:
La solución más simple es leer 2 veces el archivo que contiene los datos. En la primera vez uno cuenta los renglones, y luego usa ese número para crear la matriz.
    // Se brinca el renglón inicial ID,NOMBRE,KG,MTS
    final int nFILS = cuentaLineas(ARCHIVO)-1; // no cuenta ID,
    final int nCOLS = 4;

    Matrix X = new Matrix( nFILS, nCOLS ); // Y = X * B
    Matrix Y = new Matrix( nFILS, 1 );
En este ejemplo, cuentaLineas() es un método estático. Sí es muy importante acordarse de cerrar el archivo después de leerlo en cuentaLineas(), pues de lo contrario en la segunda lectura ya no quedaría nada por leer.
Consulta:
Profe: Traté de abrir el archivo "p1-ta-7.csv" pero no me abre. ¿Qué hago?
Respuesta:
Lo más simple es crear una hoja de cálculo vacía y luego importar los datos en la hoja. El formato CSV usa una coma (",") como delimitador.

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 7 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2010
Derechos de autor reservados © 2010
[home] <> [/\]