Octave / Matlab
El lenguaje Octave permite que ahorres un gran tiempo en el desarrollo de los algoritmos
(prototipos), y una vez que las ideas estén trabajadas puedes implementar estos algoritmos en
otros lenguajes como C++, Java, Python, R.
1. Operaciones básicas
- Operaciones elementales
+ Sumar
- Restar
* Multiplicar
/ Dividir
^ Potencia
Sqrt ( # ) Raíz cuadrada
- Operaciones lógicas
== Igualdad
~= Diferente
&& Y
|| O
Xor ( x , y ) O
- Variables
X=1 Asignar el valor “1 “a una variable “x”
X= 'hola' Asignar un valor en cadena (no numérico) a una variable
“x”
X= (3>=1) Asignar un valor de 1 (verdadero) o 0 (falso) mendiante
X=1 (V) una operación lógica.
disp (x) Muestra el valor de la variable “x”
disp(sprintf('%0.3f',s)) Muestra el valor de una variable “s” con un determinado
numero de decimales (en este caso 3), el %0.3f (significa
que al valor de “s” se muestran 3 dígitos después del
punto
format long Permite escribir los formatos largos del valor de una
variable, desde que se escribe este comando todo lo
demás se escribirá en formato largo.
format short Reestablece al formato corto, después de haber usado el
format long
- Matrices
A= [ a b c …; a b c …; a b c El punto y coma divide las filas de una matriz.
…]
V=1:0.2:2 Establecer V en el montón de elementos que comienzan a
partir de 1. Y incrementos y pasos de 0.1 hasta que
llegues hasta 2.
V=1:6 Los valores de la matriz van de 1 a 6 en pasos de 1.
ones (a,b) Comando que genera una matriz de “1” de “a x b”
(# filas, # columnas)
zeros (a,b) Comando que genera una matriz de “0” de “a x b”
(# filas, # columnas)
rand (a,b) Comando que genera una matriz de números aleatorios
(# filas, # columnas) ( con una distribución uniforme de 0 a 1) de “a x b”
randn (a,b) Comando que genera una matriz de números de una
(# filas, # columnas) distribución Gaussiana o normal con media 0 y una
desviación estándar de 1 de “a x b”
eye (a) Matriz identidad de “a x a”
size (a) Tamaño de la matriz “a”
size (a,1) Muestra el # de filas de “a”
size (a,2) Muestra el # de columnas de “a”
length (a) Tamaño de la dimensión más larga de “a”
En general se usa este comando para los vectores
A(a,b) Muestra la posición a,b de un valor dentro de la matriz A
Nombre de matriz
(# fila, # columna)
A(a,: ) Muestra todos los elementos de la fila a
A(:,b ) Muestra todos los elementos de la columna b
A([a b c],: ) Muestra todos los elementos de las filas a b c
A(a,: ) = [ x ; y ; z] Cambiar los elementos de la fila a por los elementos x y z
A = [A,[x;y;z]] Agregar los valores x y z en una columna a la derecha de
la matriz
A(:) Colocar todos los elementos de una matriz A en una sola
columna
C=[A B] ó [A,B] Concatenar dos matricez A y B (hacia el lado derecho) , en
una matriz C
C=[A ; B] Concatenar dos matricez A y B (hacia abajo) , en una
matriz C
- General
% Agregar comentarios
PS1('valor ') Cambiar el título de las líneas.
; Suprime la salida impresa
hist(x) Generar un histograma de una variable
hist(x,50) Generar un histograma de una variable, con más cubos o
compartimientos
help nombre del comando Abre toda la documentación de ayuda de un determinado
comando – Oprime Q para salir de la ayuda
Comando 1, comando 2 La coma se usa para ejecutar múltiples comandos, se
conoce como comandos encadenados por comas.
2. Cargar y colocar datos
pwd Muestra la ruta donde se encuentra Octave
cd ' nueva dirección' Cambiar la ruta
ls Enumera los directorios de una dirección
load nombre del archivo Cargar datos de archivos dentro de un directorio
load (' nombre del archivo')
who Muestra las variables que tengo en mi espacio de trabajo
whos Muestra una lista detallada de las variables, su tamaño, el
espacio que ocupa y el tipo de datos:
clear Borra todas las variavles
clear nombre de la variable Borrar una variable
save nombre del Guardar en el disco en un formato binario (.mat) un poco
archivo.mat nombre de la más comprimido para que ocupe menos espacio
variable
save nombre del archivo.txt Guardar en el disco en un formato visible para los
nombre de la variable -ascii humanos, en formato de texto ASCII
3. Informática en datos
A.*B Multiplica cada elemento de la matrices que se encuentran
en la misma posición ( 2x3 * 2x3)
2.*A Multiplica cada elemento de una matriz por un valor
1./A Divide un valor entre cada elemento de una matriz
A. ^2 Potencia de todos los elementos de una matriz
log (v) Logaritmo de cada elemento del vector o matriz v
Exp (v) Exponencial de los elementos de v
Abs(v) Valor absoluto de los elementos de v
-v Cambia el signo de los elementos de v
V + ones (length(v),1) ó Aumentar en uno todos los elementos de v
V+ 1 ó
V+ ones(3,1)
A' Transpuesta de una matriz A
Max ( A) Cuando A es de una sola fila, devuelve el valor max
[val,ind]=max(A) Valor máximo de una fila y su posicicón
A<3 Muestra en cada elemento si es verdadero (1) y si es falso
(0)
find(a<3) Muestra la posición que tienen los valores menores a 3
solo funciona con una fila.
magic (a) Devuelve una matriz cuadrada de a x a, y tienen la
propiedad de que cada fila, cada columna y las diagonales
se suman a la misma cosa
[f,c]=find(A>=7) f se refiere a la posición en la fila, y c la posición en la
columna, y muestra las posiciones de los números
mayores a 7.
sum(a) Cuando A tiene una sola fila suma todos los elementos.
prod(a) Cuando A tiene una sola fila multiplica todos lo elementos
floor(a) Redondea los elementos de A al número entero menor
ceil(a) Redondea los elementos de A al número entero mayor
max (a,[],1) Toma el valor máximo de la matriz A, pero por columnas.
max (a,[],2) Toma el valor máximo de la matriz A, pero por filas.
max(max(a)) ó Máximo valor de toda una matriz A
max(A(:)
A(:) Convertir A en un vector
sum(a,1) Suma cada columna de la matriz A
sum(a,2) Suma cada fila de la matriz A
sum(sum(a.*eye(#))) Sumar la diagonal de una matriz
Flipud(A) Cambia el sentido de una matriz
Pinv(A) Calcula la inversa de una matriz
4. Trazado de datos
En el desarrollo de algoritmos algunos trazos simples (plots) , puede darte un mejor
sentido de lo que hace un algoritmo y realizar una revisión de lo que esta haciendo y de
lo que debería de hacer. Ej. Trazar la función de costos theta para asegurar que la
gradiente descendente este convergiendo. Te dan una idea de como mejorar tu
algoritmo.
- Herramientas para el trazado y visualización de datos. (Gráficas)
plot(x,y) Trazar una función
plot(x,y); Trazar varias funciones en un mismo gráfico.
hold on; El r es para que el gráfico sea de otro color
plot(x,y1, ' r ')
xlabel('nombre del eje ') Etiquetar el eje “y”
ylabel('nombre del eje ') Etiquetar el eje “y”
legend('nombre de gráfica', Legenda del gráfico
'nombre de gráfica')
title('nombre del título') Título de la gráfica
print -png 'nombre del Guardar un gráfico
archivo.png'
help plot Visualizar otros formatos de archivos
close Cerrar el gráfico
figure(1); plot(x,y); Visualizar dos gráficas a la misma vez
figure(2); plot(x1,y1);
subplot (f,c,posición) Divide la cuadricula en cierto numero de posiciones “filas,
columnas “ , y permite agregar gráficos en distintas
posiciones.
*El primer subplot es el que determina la división en filas y
columnas
axis([xinicio xfin yinicio y Cambiar el la visualización del gráfico a dentro del los
fin]) rangos del gráfico actual de “x” y “y”
clf; Borrar los gráficos
imagesc(A) Dibujar una cuadricula de colores, un color por cada valor
de una matriz “A”
imagesc(A), colorbar, color Son 3 comandos, el 2do coloca una escala de colores para
map color ( gray ) los valores de la matriz, y el tercero especifica las
tonalidades del color
5. Controles: For, while, if
V= zeros(10,1) -> Crear un vector
- For
For i=1:10, Empieza en 1 y termina en 10 , crea un ciclo para la operación
V(i) = 2 ^ i; La operación que realizara cuando i tome los valores del 1 al 10,
la operación la ira realizando varias veces.
End;
- While
i= 1; El valor de i empieza en 1
while i<=5, Mientras i sea menor o igual a 5 ejecuto la operación
v(i)=100; Operación
i=i+1, Luego incremento el valor de i en uno por cada interacción
end;
i= 1; El valor de i empieza en 1
while true, Mientras i sea menor o igual a 5 ejecuto la operación
v(i)=999; Operación
i=i+1, Luego incremento el valor de i en uno por cada interacción
if i==6, Cuando el valor de i sea igual a 6 se hace una interrupción
break; Y termina, para eso se usa el break
end; Termino del if
end; Termino del while
- If / else
if v(1) == 1 Si el valor es 1
disp('el valor es uno') Mostrar el valor es uno
elseif v(1) == 2 O si el valor es 2
disp('el valor es dos') Mostrar el valor es 2
else O si el valor es diferente a las condiciones iniciales del if y los
elseif
disp('el valor es otro') Mostrar el valor es otro
end;
- ¿Cómo definir funciones y como usarlas?
Paso 1: Crear un archivo con el nombre de la función y la extensión .m (Puedo usar
WordPad para editar esta función)
function y = cuadradodelnumero(x)
y=x^2;
Paso 2: En Octave cuando quiero usar esa función, es necesario cambiar el directorio
con cd al lugar donde se encuentra la función que hemos definido.
cd 'C:\Users\acer\Desktop'
Paso 3: Utilizo la función
cuadradodelnumero(5)
Octave te permite definir funciones que devuelven varios valores o varios argumentos
Paso 1:
Function [y1,y2] = cuadradoycubo(x)
Y1=x^2;
Y2=x^3;
*Esto es algo propio del lenguaje de Octave
Paso 3:
[y1,y2]=cuadradoycubo(5)
- Rutas de búsqueda
Modificar la ruta de búsqueda
Addpath('C:\Users\acer\Desktop') y así agregamos ese directorio a la ruta de búsqueda
de octave.
Entonces a pesar de estar en un directorio diferente encontrara siempre las funciones de
los directorios de las rutas de navegación.
- Función de Costos J
Función para calcular la función de costos de j theta para los diferente svalores
1. Definir la matriz de diseño (datos)
X=[ 1 1; 1 2;1 3] (eje x)
Y=[1; 2; 3] (eje y)
2. Asignamos los valores de theta
Theta=[0;1];
3. Definir la función de costos
Function J=costFunctionJ(x, y, theta)
m= size(x, 1); %número de ejemplos de práctica, x es el número de filas
predictions = x*theta
sqrErrors= (predictions-y). ^2 %errores del programa
J= 1/(2*m) * sum(sqrerrors);
6. Vectorización
Aprovechar las bibliotecas de algebra lineal numérica, en lugar de escribir código
ustedes mismos, permite tener un código más eficiente, haciendo que se ejecute mucho
más rápido, además se escribe menos código, haciendo que la implementación sea más
simple.
Las funciones que se usen dependerán de la biblioteca que se está usando, puede que
tengan diferente sintaxis.
Hipótesis de regresión lineal: Calcular h(x) o y
Implementación sin vectorizar Implementación con vectorización
θT X
Donde si n = 2 entonces
n
θ0 x0
hθ ( x )=∑ θjXj
j=0 θ= θ1 x= x 1
θ2 x2[] []
X y theta son vectores
predicción = 0 % valor inicial de h(x) Prediccion = theta’*x
for j = 1:n+1
predicción=predicción + theta(j)*X(j)
end;
En vez de escribir todas esas líneas de código, se usa solo una línea, usando algebra lineal numérica
para tener el producto de estos vectores.
Gradiente descendente
m
1
θ j ≔θ j−α ∑ (hθ ¿ ( x ( i) )− y ( i)) x j(i ) ¿
m i =1
Asumiendo que tenemos dos características (n=2) donde j=[0,1,2]; las actualizaciones
simultaneas de theta:
m
1
θ0 ≔θ0 −α ∑ (h θ¿ ( x( i) )− y (i) )x 0(i) ¿
m i=1
m
1
θ1 ≔θ1−α ∑ (hθ ¿ ( x (i ) )− y (i )) x1(i) ¿
m i=1
m
1
θ2 ≔θ2−α ∑ (h ¿ ( x (i ) )− y (i )) x 2(i) ¿
m i=1 θ
Implementación con vectorización
θ ≔θ – αδ
*Representa una resta vectorial
Donde:
θ=Rn−1
δ =Rn −1
α =Es un n ú mero real
δ0
[]
m
1 ( i) (i ) (i)
δ = ∑ (hθ ¿ ( x ) − y ) x j δ= δ 1 ¿
m i=1
δ2
Donde:
( hθ ( x( i) )− y (i) )=Es un nú mero real
x 0(i )
x j(i )=Rn−1 x(i)= x 1(i )
x2
(i )[]
La sumatoria representa lo siguiente:
( hθ ( x( 1) )− y ( 1) ) x 0(1) + ( hθ ( x( 2) )− y ( 2) ) x 0(2) …+ ( hθ ( x( m) ) − y (m )) x 0(m)
Si se usa la regresión lineal con 100 o 1000 características y se utiliza una
implementación vectorizada, se ejecutará mucho más rápido si tuviésemos un bucle for.