jueves, 30 de septiembre de 2010
Promoviendo el cloud computing?
lunes, 6 de septiembre de 2010
El protocolo http messenger
Licencia de Joomla(La mejor sintesis de una licencia GNU que he visto)
![]() | ![]() |
Acerca de la Licencia GNU/GLP de Joomla OpensourceEl software Joomla CMS es de uso gratuito, y de libre distribución (OpenSource), bajo licencia pública general (GNU/GLP). [ver traducción no oficial al español de la licencia GNU de software libre] Es bueno que sepas que eres el propietario de TU sitio Joomla pero NO eres propietario del sistema Joomla que utilizas para el mismo (en el sentido en que no podrías venderlo como si fuese tuyo). Esto quiere decir que hay ciertas leyes de Copyright que hay que respetar. Ten en cuenta que el dinero que alguien paga por la construcción de un sitio utilizando Joomla no es por concepto de la compra del software (porque este es gratuito), sino que el cliente paga por los SERVICIOS que se derivan de Joomla: de instalación, configuración, diseño, y puesta en marcha del sitio, además del respectivo soporte. De todas formas, jamás nadie podrá "cobrar" por la utilización de Joomla o impedir que alguien utilice este sistema si no se violan los términos de la licencia GNU/GLP, además es necesario que sepas que el Copyright sobre los contenidos de cada sitio le pertenecen al propietario del mismo. Una cosa es el copyright de Joomla y otra muy distinta es el copyright de los contenidos de un determinado sitio. Resumiendo, en términos legales... Vos SÍ podés:
Vos NO podés ni debés:
En resumen: La filosofía opensource se basa en la cooperación de desarrollo y la iniciativa de compartir software libremente sin que los usuarios tengan que pagar licencias ni derechos por el uso del mismo. Obviamente hay una clara realidad: en este mundo de "tiempos escasos" nadie regala nada por altruísmo puro. Los mismos desarrolladores de Joomla por ejemplo realizan soporte y desarrollos basados en Joomla de forma comercial a negocios o empresas privadas que solicitan sus servicios. Por ello digamos que las herramientas opensource son gratuitas, pero el tiempo de los desarrolladores no lo son. Y el tiempo significa dinero. Cualquier persona puede crear sitios con Joomla y cobrar por sus servicios y aquel que no tenga tiempo o ganas de hacerlo, tendrá que pagar por ello de la misma manera en que una persona que no tenga o disponga del dinero para pagar un desarrollo web tendrá que disponer de tiempo, trabajo, esfuerzo, e investigación para lograr sus propósitos. fuente original:http://www.joomlaos.net/licencia-de-joomla.php |
miércoles, 1 de septiembre de 2010
Algo de ingeniería poco convensional
sábado, 16 de enero de 2010
Solo para variar
Mientras los hijos estaban pensando en cómo repartir los camellos, pasó por allí un sabio montado en su camello, al cual pidieron ayuda. El sabio juntó su camello con los 11 de los hijos.
Sabio: Bien, decidme cuántos camellos hay ahora.
Hijos: Hay doce camellos.
Sabio: Bien, la mitad de ellos, es decir, seis, serán para el hijo mayor. La cuarta parte de ellos, tres, para el hijo mediano. La sexta parte de ellos, dos, para el pequeño. He repartido en total los doce camellos, y sobra uno, el mío. El testamento se ha cumplido.
Los tres hijos quedaron conformes con el reparto, y el sabio se fue con su camello. En realidad el testamento no se ha cumplido al 100%, pues el hijo mayor tiene 6 camellos de 11, es decir, 6/11, que es algo más que 1/2. El mediano tiene 4 camellos de 11, es decir, 3/11, algo mayor que 1/4. Y el pequeño tiene 2 camellos de 11, es decir, 2/11, algo mayor que 1/6. Como se ve, el 1/12 sobrante se lo han repartido entre todos.
miércoles, 26 de noviembre de 2008
Support Vector Machine
Bien y eso que!, bueno, bueno vamos a ver como se hace un svm para el proceso de aprendizaje supervisado de una compuerta xor. Puesto que en internet se encuentra mucha información acerca del tema, no voy a reparar en detalles, como lo serian los optimizadores de lagrange y las funciones kernel y todo el principio matemático(matrices, derivadas, sistemas de ecuaciones, etc), ya que mi objetivo es mostar una manera rápida de construir un svm con python y sympy, sin complicados procedimientos matemáticos, claro que también se puede hacer en matlab, pero bueno no nos gustan las cajas negras y por eso no lo hacemos en matlab.
Primero vamos a derivar manualmente, respecto de a1, a2, a3, a4:
a1 + a2 + a3 + a4 + a1*a4 + a2*a4 + a3*a4 - a1*a2 - a1*a3 - a2*a3 - 9*a1^2/2 - 9*a2^2/2 - 9*a3^2/2 - 9*a4^2/2
Y luego solucionamos el sistema de ecuaciones.
No, es una broma!, para eso tenemos las rutinas proporcionadas por sympy para no quebrarnos la cabeza.
Bien veamos el codigo.
from sympy import *
xor = [[-1,-1],[-1,1],[1,-1],[1,1]]
signos = [-1,1,1,-1]
literals = var('a1 a2 a3 a4')
equis = var('x1 x2')
alfa = []
for i in range(len(xor)):
alfa.append(signos[i] * literals[i])
alfas = Matrix(alfa)
k = zeros(len(xor))
for i in range(len(xor)):
for j in range(len(xor)):
k[i,j] = (1+(Matrix(xor[j]).transpose() * Matrix(xor[i]))[0])**2
ecuation = (alfas.transpose() * k * alfas)[0] * -1/2
for i in literals:
ecuation += i
siseq = diff(ecuation, literals)
solution = solve(siseq, literals)
def kernel(list):
nlist=[]
for i in list:
nlist.append([1, i[0]**2, i[0]*i[1]*sqrt(2), i[1]**2, i[0]*sqrt(2), i[1]*sqrt(2)])
return nlist
kersol = kernel(xor)
w = Matrix([0,0,0,0,0,0])
for i in range(len(xor)):
w += signos[i]*Matrix(kersol[i]) * solution[literals[i]]
compxor = Matrix(kernel([equis])[0]).transpose() * w
#entonces compxor nos debe dar como resultado -x1*x2 y es asi como se comporta una compuerta xor, donde x1 y x2 son la entradas, mas que ovio verdad.
Aquí vemos una imagen que nos representa dos clases ya separadas, esta imagen la tome de la aplicacion en linea: http://svm.dcs.rhbnc.ac.uk/pagesnew/GPat.shtml. Espero que este siempre disponible en línea, si no ya hare mi propia aplicación para graficar los resultados de la svm.
martes, 11 de noviembre de 2008
Matematicas con python
Sympy es una librería para calculo simbolico (cas), -¿qué es eso del calculo simbólico?, -a pues es una maravilla, se trata de un muy completo ambiente que puede hacer operaciones matemáticas entre números reales y símbolos. por ejemplo se pueden hacer operaciones como 2*a+4*a=6a, -¿y bien y esto tan sencillo para que puede servir?. A pues nos habre todo un mundo de posibilidades de calculo, por que este principio no solo aplica a la aritmética, sympy puede hacer operaciones de matrices, integración simbólica, algebra lineal, entre otras operaciones tal como lo haríamos en el cuaderno que llevamos a clases, además de las bondades del lenguaje de programación python.
Para mostrar algo de las posibilidades ilimitadas de cálculo de sympy voy a mostrar parte del código de un clasificador bayesiano, que es una técnica de reconocimiento de patrones, elaborado como tarea para la asignatura de inteligencia artificial en el Itesi.
#Como primera parte aquí tenemos dos vectores con par de puntos (x,y), que nos representan dos patrones linealmente separables:
w1 = [[2, 6], [3, 4], [3, 8], [4, 6]]
w2 = [[1, -2], [3, 0], [3, -4], [5, -2]]
#Ahora procederemos ha hacer algunas operaciones algebraicas y de matrices para separar la clase w1
#nótese que en la línea de abajo se dan de alta algunas variables simbólicas
vars = var('x y')
size = len(vars)
#este es un procedimiento para a calcular la media de un vector
#hasta aquí es solo código python
def mean(vector, dim):
mean = [0,0]
for i in range(0,dim):
for j in vector:
mean[i] += j[i]
mean[i]/=len(vector)
return mean
m1 = mean(w1, size)
#lo interesante viene a continuación, se trata de la conversión entre vectores y matrices
#y sus consecuentes operaciones
def matriz_sigma_inversa(vector, mean):
array_mtx = range(0,len(vector))
sum_mtx = zeros(len(mean))
for i in array_mtx:
array_mtx[i] = Matrix(vector[i]) - Matrix(mean)
sum_mtx += (array_mtx[i] * array_mtx[i].transpose())
return (sum_mtx * 1/len(vector)).inv()
#es aquí donde se realizan las operaciones simbólicas entre números y literales "x", "y"
def matriz_vector_mean(mean, literals):
return Matrix(literals) - Matrix(mean)
#wow podria ser esto mas facil!!!
mtx_sig_w1 = matriz_sigma_inversa(w1, m1)
mtx_med_w1 = matriz_vector_mean(m1, vars)
mtx_tran_w1 = matriz_vector_mean(m1, vars).transpose()
det_w1 = mtx_sig_w1.det()
#ahora tenemos la ecuación de la clase w1, hacer esto para la clase w2
gw1 = (mtx_tran_w1 * mtx_sig_w1 * mtx_med_w1 * -1/2)[0] + (ln(det_w1)*-1/2 + ln(0.5)).evalf()
#igualamos ha cero la ecuación
bayes = gw1-gw2
#y finalmente despejamos "y", lo cual nos dará como resultado una ecuación cuadrática
#que al ser graficado nos mostrara el hiperplano que separa alas clases w1 de w2
solve(bayes, y)
Bien eso es fácil, no son muchas operaciones pero imaginemos un vector de tres dimensiones con muchos mas puntos para graficar, esto si que llevaría mucho tiempo hacer a la antigua.
Ahora veamos la grafica con gnuplot de un espacio vectorial de tres dimenciones.
Por supuesto que esto se puede hacer todo desde python, ya hablaremos de la maravilla de gnuplot en otra ocacion..
