Category Archives: Computing

Apuntes de Machine Learning

 

Introducción

En este y otros post, espero escribir algunas notas sobre Machine Learning.

A pesar que se utiliza hace muchos años, ultimamente he notado un aumento del abanico de tareas en la cual se aplica, tal vez, por el aumento en la cantidad de información que se recolecta a nivel mundial, el bajo costo de procesadores, sensores, sitios web de alto tráfico y la constante necesidad de ofrecer mejores servicios al usuario final.

Machine Learning se podría clasificar dentro del ámbito de la Inteligencia Artificial (Artificial Intelligence o AI) la cual a su vez es una rama dentro de las ciencias de la computación.

Gran parte del material presentado aquí ha sido extraído tanto de Internet (Machine Learning de Coursera.org, wikipedia, etc), libros y notas personales.

Qué es Machine Learning? Una definición, dada por Tom Mitchell dice algo así: “Es un programa de computador que aprende de la experiencia E, respecto a alguna tarea T y con medida de rendimiento o performance P, si el desempeño sobre la tarea T, medido por P, mejora con la experiencia E.” Otra definición más antigua, del año 1959, dada por Arturh Samuel dice así: “Es el campo de estudio que da a los computadores la habilidad para aprender sin haber sido explícitamente programada

Basado en la primera definición, utilizando el juego de ajedrez, se podría definir identificar:

  • E: Experiencia de jugar varias veces ajedrez.
  • T: La tarea de jugar ajedrez.
  • P: La probabilidad de ganar el siguiente juego.

No esta clara la traducción de Machine Learning al español, ya que a veces se utiliza “Aprendizaje de máquina” u otras veces “Aprendizaje automático”, por lo que seguiré utilizando el termino Machine Learning o ML en el siguiente texto.

En ML, existen dos tipos de aprendizaje:

  • Supervisado.
  • No supervisado.

Aprendizaje Supervisado (Supervised learning)

En aprendizaje supervisado, se cuenta con un conjunto de datos –dataset- para lo cual, ya se sabe cual es el resultado correcto o esperado, por ejemplo, podría ser información histórica con variables atmosféricas de un año para una ciudad y si ha llovido o no en cada día, por lo que los datos de entrada podría ser: presión atmosférica, temperatura, humedad relativa, velocidad y dirección del viento, y la variable de salida sería: “Con precipitación” o “Sin precipitación”.

El aprendizaje supervisado, se categoriza a su vez en:

  • Regresión (Regression)
  • Clasificación (Classification)

En el aprendizaje supervisado de tipo “regresión”, se intenta predecir resultados dentro de una salida continua, es decir, un valor numérico. En esta categoría, podemos encontrar problemas del tipo “Predecir el precio de un bien raíz precio, basado en sus atributos (real state price estimation)”, en ese caso, el precio será un número por lo tanto es del tipo regresión.

En el aprendizaje supervisado del tipo “Clasificación”, a diferencia del tipo regresión, se intenta predecir resultados discretos o dicho de otra manera, que dado un conjunto de datos de entrada, se intenta predecir una categoría o etiqueta, por ejemplo: {“Si”, “No”} o {“Comprar”, “Vender”} o {“Vertebrado”, “Invertebrado”}

Aprendizaje no supervisado (unsupervised learning)

En el aprendizaje no supervisado, se trabaja con problemas en los cuales no se sabe, o se sabe muy poco, respecto a los resultados que se desean predecir, se pueden encontrar estructuras a partir de los datos, sobre los cuales, no se conoce el efecto de las variables.

Se puede encontrar estructuras gracias al agrupamiento (clustering) de datos basado en las relaciones entre las variables de los datos de entrada, pero no sólo agrupamiento es la única forma de aprendizaje no supervisado. La memoria asociativa es un ejemplo de aprendizaje no supervisado.

Ejemplos de aprendizaje no supervisado:

Clustering: Dada una colección de datos de clientes, encontrar una forma de agruparlos, dado distintas variables, como ingreso, genero, compras, etc.

Asociación: Un doctor, con muchos años de experiencia, puede encontrar una asociación entre un conjunto de características, síntomas, registro históricos y una enfermedad.

Ahora, comencemos a ver un poco más en cada uno de los punto introducidos anteriormente.

Regresión lineal con una variable (Linear regression with one variable)

Como ya se mencionó anteriormente, en los problemas de regresión, intentamos mapear variables de entrada a una variable de salida continua. Dado que regresión es una categoría dentro del aprendizaje supervisado, ya se tiene una idea del valor esperado.

Para poder predecir, ya sea un valor discreto o continuo, se utiliza una función, llamada en ML “Hipótesis”.

La función hipótesis, tiene la siguiente forma básica:

hypothesis

Suponiendo que se tiene el siguiente conjunto de datos:

x (entrada) y (salida)
0 4
1 7
2 7
3 8

La idea es poder asignar valores a theta cero y theta uno, con los cuales, se obtendrá un valor de y, para cada x.

Basado en la tabla anterior, podemos asignar un valor aleatorio  para theta 0 y theta 1, digamos 2 y 2 respectivamente, con lo cual queda nuestra función hipótesis de la siguiente manera:

hΘ (x) = 2 + 2x

Por la tanto, ya podemos conocer qué valor deberíamos obtener, si por ejemplo, x = 3, con esto, nos queda:

hΘ (x) = 2 + 2*3 = 8

Para el valor de x=8, la función predice exactamente el valor de salida mostrado en la tabla. Probemos con otro valor de x, ejemplo, x=1.

hΘ (x) = 2 + 2*1 = 4

Con x=1, obtenemos 4 con nuestra función de hipótesis, pero al ver la tabla, deberíamos haber obtenido 7, por lo que hay una diferencia de 7-4 = 3. Por lo tanto, podríamos pensar que los valores elegidos aleatoriamente para theta 0 y theta 1 no son tan buenos… Pero cómo saber si los valores asignados a theta son correctos y por lo tantos, nuestras predicciones serán correctas?

Para responder a esta pregunta y ayudar seleccionar valores óptimos para theta, se utiliza una función de costo.

Función de costo (Cost function)

Una función de costo, nos permite conocer que tan precisa es nuestra función de hipótesis, para ello, toma el promedio de todos los resultados aplicando la función hipótesis y los compara con los valores reales obtenidos (la columna “y” en la tabla anterior).

La función de costo, tiene la siguiente forma:

costfunction1

m: Es la cantidad de elementos, basado en nuestra tabla anterior, m=4.

Aplicando esta función, obtendremos un valor numérico el cual, mientras más  cercano a cero es, nos indica que mejor es nuestra hipótesis. Basicamente, si al aplicar la función de costo, obtenemos 0 (cero) como valor, estaríamos en una situación en la cual nuestra hipótesis, esta prediciendo correctamente cada valor y, para cada entrada x.

Ya hemos visto que nuestra función hipótesis nos permite predecir una variable, y la calidad de estas predicciones será medida utilizando la función de costo en base a una selección de theta 0 y theta 1, pero cómo podemos elegir un valor adecuado para theta 0 y theta 1?

Para esto, existe un algoritmo llamado Gradiente Descendente (Gradient Descent)

Gradiente Descendente

La idea o objetivo del algoritmo del Gradiente Descendente, es minimizar la función de costo, esto es, obtener los valores de theta, para los cuales, se obtiene el menor valor posible. Una forma de conocer para qué valores de theta 0 y theta 1 se obtiene el valor más bajo, es crear un gráfico con dos variables de entrada (theta o y theta 1) y aplicando la función de costo. La imagen siguiente, muestra esta situación, en la cual se ve una superficie en 3 dimensiones en forma de bowl, donde el punto más bajo, corresponde a la mejor selección de theta 0 y theta 1.

gradientdescent1

Para poder encontrar el valor óptimo o más bajo de theta (theta o y theta 1), se utiliza el siguiente algoritmo de gradient descent, el cual en cada iteración se desplaza en la dirección que lo acerca al punto más bajo, para ello utiliza el signo de la tangente en el punto actual (derivando la función). En el gráfico mostrado, se ve que existe un sólo punto donde la función converge, pero con otras funciones, es más difícil o casi imposible encontrar el punto más bajo. Más adelante se verá en mayor detalle este punto.

gradientdescentloop1

Al terminal el loop, theta 0 y theta 1 tienen los mejores valores para ser usados en la función de hipótesis.

Hasta el momento, se ha visto regresión lineal con una sola variable (univariate linear regression), pero ahora veremos análisis de regresión lineal con varias variables de entrada x1, x2,..xn

Regresión lineal con varias variables (multivariate linear regression)

En la mayoría de los casos, nos encontramos en situaciones en las cuales nuestro conjunto de datos tiene más de una variable o atributo de entrada. Por ejemplo, en la predicción de precios de bienes raíces, los atributos o características podrían ser: Superficie de la propiedad en m², número de habitaciones, número de baños, valor promedio de bien raíz en el vecindario.

MulivariateLinearRegression

El texto anterior, fue tomado del curso de Machine Learning en coursera.org.
 

Ahora, re-escribimos la función hipótesis para que acepte varias características o atributos (x₁, x₂,.. xn), quedando de la siguiente forma:

multivariatehypotesis

Ya que tenemos entrada de varios atributos, podemos representar con matrices el conjunto de m entradas y n atributos, tal como se muestra en la siguiente matriz X:
multivariatematrixDe esta manera, en vez de trabajar con elementos individuales, se utiliza vectores para representar tanto las características de una instancia de prueba, así como se utiliza también un vector para representar a teta.

Función de costo para multiples variables (multivariate cost function)

Actualizamos entonces ahora la función de costo para regresión lineal multivariable. y con una flecha encima, representa el vector de la variable de salida, ya no es número único, si que que este vector representa al conjunto entero de salida.

multivariatecostfunction

 

Lo siguiente, será actualizar el algoritmo del descenso del gradiente (gradient descent)

 

 

 

Advertisements

Instalar Kit de desarrollo Java 7 (Install JDK 7 on ubuntu 12.04)

Las últimas versiones de Ubuntu, como la 10.04, no incluye los respositorios para instalar Java JDK 7 debido a problemas con licencias de software. (Ahora viene con OpenJDK)

Los pasos para instalar esta versión en Ubuntu, lo puedes encontrar en el blog  Shine PHP (en inglés)

Keywords: Install JDK 7 in ubuntu

Saludos,

Álvaro Brange


A “RESTful API” in just 3 minutes with Python and Bottle

Hi. This post show a simple and fast way of implement a API server using web services in python

Ingredientes:

Python, Bottle and Route (if you wish test it using a curl style command from python)

Installation (From Terminal)

sudo pip install bottle
sudo pip install requests

Once installed, run python and write (or paste):

from bottle import route, run
@route('/hello')
def hello():
 return "Hello World!"
run(host='localhost', port=8080, debug=True)

After that server is running, open a new terminal console with python and run the following commands to test you server. Note that we a using here a CURL linux’s like command for Python. (Also you could open the  url directly in you browser):

import requests
for i in xrange(1000):
requests.get('http://localhost:8080/hello/world', auth=('user', 'pass'))

And there you are!
Bye


The sigmoid or activation function and their uses

From Wikipedia:

“Many natural processes, including those of complex system learning curves, exhibit a progression from small beginnings that accelerates and approaches a climax over time. When a detailed description is lacking, a sigmoid function is often used. A sigmoid curve is produced by a mathematical function having an “S” shape. Often, sigmoid function refers to the special case of the logistic function shown at right and defined by the formula”

When you are faced to a mathematical problem, where is necessary to find a output value, (given a continue input ) that behave like near to Boolean, for example, in simulated neural networks or in very range of problem, could be necessary to use this function and adapt it to our needs.

As was previously stated, the graph of sigmoid function has “S” shape, but could be necessary to change the shape of it “s” or their position.

In the previous formula, we have added a and b.

If you change a, for instance, a=10, you will get a short “S”, if you let a=20, “S” will be more short.

If you change b, it will let you move your S in the graph, allowing let it not centred on zero. For example, if you input range (domain of function) is between 0.0 and 1.0, you could need the following function:

Where y=0.5, when x=0.5.

You can see it graph using Google calculator here

I found more information about this function on Dr. Mark Humphrys webpage

Regards,

Álvaro


vi Editor Commands

Hi,

I found a listed of commands to work with vi editor in linux. That’s all folks

Captura de pantalla vi

Captura de pantalla vi - Pantalla capturada con Cmd+Shift+4 y luego Space Bar

 

General Startup
To use vi: vi filename
To exit vi and save changes: ZZ or :wq
To exit vi without saving changes: :q!
To enter vi command mode: [esc]
Counts
A number preceding any vi command tells vi to repeat
that command that many times.
Cursor Movement

h move left (backspace)

j move down

k move up

l move right (spacebar)

[return] move to the beginning of the next line

$ last column on the current line

0 move cursor to the first column on the
current line

^ move cursor to first nonblank column on the
current line

w move to the beginning of the next word or
punctuation mark

W move past the next space

b move to the beginning of the previous word
or punctuation mark

B move to the beginning of the previous word,
ignores punctuation

e end of next word or punctuation mark

E end of next word, ignoring punctuation

H move cursor to the top of the screen

M move cursor to the middle of the screen

L move cursor to the bottom of the screen
Screen Movement

G move to the last line in the file

xG move to line x

z+ move current line to top of screen

z move current line to the middle of screen

z- move current line to the bottom of screen

^F move forward one screen

^B move backward one line

^D move forward one half screen

^U move backward one half screen

^R redraw screen
( does not work with VT100 type terminals )

^L redraw screen
( does not work with Televideo terminals )
Inserting

r replace character under cursor with next
character typed

R keep replacing character until [esc] is hit

i insert before cursor

a append after cursor

A append at end of line

O open line above cursor and enter append mode
Deleting

x delete character under cursor

dd delete line under cursor

dw delete word under cursor

db delete word before cursor
Copying Code

yy (yank)’copies’ line which may then be put by
the p(put) command. Precede with a count for
multiple lines.
Put Command
brings back previous deletion or yank of lines,
words, or characters

P bring back before cursor

p bring back after cursor

Find Commands

? finds a word going backwards

/ finds a word going forwards

f finds a character on the line under the
cursor going forward

F finds a character on the line under the
cursor going backwards

t find a character on the current line going
forward and stop one character before it

T find a character on the current line going
backward and stop one character before it

; repeat last f, F, t, T
Miscellaneous Commands

. repeat last command

u undoes last command issued

U undoes all commands on one line

xp deletes first character and inserts after
second (swap)

J join current line with the next line

^G display current line number

% if at one parenthesis, will jump to its mate

mx mark current line with character x

‘x find line marked with character x

NOTE: Marks are internal and not written to the file.
Line Editor Mode
Any commands form the line editor ex can be issued
upon entering line mode.

To enter: type ‘:’

To exit: press[return] or [esc]
ex Commands
For a complete list consult the
UNIX Programmer’s Manual
READING FILES
copies (reads) filename after cursor in file
currently editing

:r filename
WRITE FILE

:w saves the current file without quitting
MOVING

:# move to line #

:$ move to last line of file
SHELL ESCAPE
executes ‘cmd’ as a shell command.

:!’cmd’

From: http://www.cs.rit.edu/~cslab/vi.html

 


PreyProject te ayuda a recuperar tu computador robado

 

 

 

 

El servicio que ofrece PreyProject.com (empresa Chilena) te permite obtener información de tu computador robado. Esta información incluye:

  • Mapa de la ubicación en la cual se encuentra tu computador
  • Capturas de pantallas, de lo que esta viendo la persona que tiene tu computador. Con esto podrías obtener el nombre de la persona que actualmente tiene tu computador
  • Fotos tomadas desde la cámara de tu computador, con la cual podrías ver al ladrón de tu computador.
  • Otra información como programas abiertos, archivos editados, IP, etc.

Además puedes enviar mensajes, bloquear o hacer sonar una alarma en el computador.

Para utilizar este servicio debes descargar un programa desde su sitio web http://preyproject.com/ e instalarlo en tu computador o teléfono. Actualmente esta disponible para Max OS X, Windows y algunas plataformas de Linux y Android (iOS está en fase de prueba). Personalmente instalé el programa e hice algunas pruebas indicando el computador como robado y funcionó correctamente. El servicio es gratuito hasta 3 dispositivos.

Espero que no tengamos que hacer uso de la aplicación, pero si fuese necesario, espero que sea de ayuda.

Nota: Existe también otra empresa http://hiddenapp.com/ que tiene una aplicación similar, pero sólo para Macs y es pagada.

Saludos,
Álvaro


Apache Error: (13)Permission denied: access to

If you got this error message in your Apache error log,  you could check if the reason of this is that it folder on which the server is trying get access is readable by Apache user (www-data in Ubuntu by default). In order to test this condition, you could try:

work as root user

sudo -s

#su – www-data

#cd /yourDirctory

#cat NameOfYourFileInYourDirectory

if you get “can’t cd to yourDirectory” or similar is due that Apache user can’t access to the file or directory.

PD:
See error log from console:
#tail -f /var/log/apache2/error.log