Documente Academic
Documente Profesional
Documente Cultură
en SQL
Juan Carlos Olivares Rojas
Ismael Rafael Ponce Medellín
Laboratorio de Sistemas Distribuidos
Centro Nacional de Investigación y Desarrollo Tecnológico (CENIDET)
Cuernavaca, Morelos, México
{jcolivares04c, rafaxzero04c}@cenidet.edu.mx
Entrada
El algoritmo recibe como entrada una tabla Y = {y1, y2, … , yn} la cual contiene d
dimensiones y n puntos (tuplas) que se desean agrupar en k grupos. Por ejemplo1 se
tiene la siguiente tabla:
ALIMENTOS (Nombre, Proteína, Vitamina, Grasa, Azucar, Mineral) con los siguientes
valores de ejemplo:
El algoritmo k-means trabaja con datos numéricos por que se basa en el cálculo de
distancias euclidianas entre los puntos para agrupar; por lo que la tabla Y de este
ejemplo sería la siguiente:
1
Cabe hacer mención que tanto los datos como los ejemplos mostrados en este reporte,
no están basados en hechos reales.
D1 d2 d3 d4 d5
n1 10 0 10 0 0
n2 5 3 15 12 0
n3 0 0 0 23 0.5
n4 0 1 7 33 0
n5 4 2 10 37 0
Tabla 2. Tabla Y de la relación alimentos.
Como puede observarse esta tabla, al igual que todas las demás Y es de dimensiones
n*d, donde existe una equivalencia entre cada punto n y cada dimensión d. Al tener esta
nueva tabla, se pierde el identificador de cada elemento, por lo que se define una nueva
relación que contiene como índice una clave primaria con valores autoincrementales.
Esta nueva tabla YH quedaría de la siguiente forma:
i d1 d2 d3 d4 d5
1 10 0 10 0 0
2 5 3 15 12 0
3 0 0 0 23 0.5
4 0 1 7 33 0
5 4 2 10 37 0
Tabla 3. Ejemplo de Tabla YH.
Salida
Las tablas C y R son de dimensiones d*k, por lo que si en nuestro ejemplo se quisiesen
realizar agrupaciones de los puntos (elementos) en dos grupos donde se tuvieran los
elementos más saludables y los que no, k sería igual a 2. Donde k1 representaría el
grupo de alimentos saludables y k2 los que no son tan saludables. Por lo que se tendría
una tabla como la siguiente:
K1 K2
d1 7 3
d2 1 4
d3 8 12
d4 17 21
d5 0 1
Tabla 4. Ejemplo de tabla C y R.
Por ejemplo, si la tabla fuese la relación C, de los valores anteriores, indicarían que en
d3k2, el centroide del atributo grasa en el grupo 2 es de 12 unidades.
Como puede apreciarse el tamaño de esta tabla depende fundamental del número de
dimensiones y del número de grupos, por lo que al ser estos demasiado grandes la
información a consultar se dificulta un poco, por lo que la mejor forma de
implementarse es la siguiente:
l j Valor
1 1 7
1 2 3
2 1 1
2 2 4
3 1 8
3 2 12
4 1 17
4 2 21
5 1 0
5 2 1
Tabla 5. Ejemplo de tabla C y R optimizadas para el algoritmo.
Trabajando los valores de forma vertical, permite un mejor acceso a los mismos,
facilitando sobre todo su utilización al momento de efectuar cálculos que los involucren,
como los necesarios para calcular la medida del error.
La tabla W que indica los pesos de cada uno de los clusters, es de dimensión k*1. Por lo
que, para nuestro ejemplo estaría dada como sigue:
Peso
K1 0.4
K2 0.6
Tabla 6. Ejemplo de Tabla W.
En este caso, el valor de 0.4 de k1 nos índica que el 40% de los puntos (elementos) de la
relación Y caen sobre este grupo. La sumatoria de todos los pesos da como resultado la
unidad (100%).
d k n I avg_q dif_avg_q
5 2 5 3 0.3 0.2
Tabla 7. Tabla model.
En este caso los valores de esta tabla nos indica que la relación analizada tiene 5
dimensiones que se ha decidido agrupar en 2 grupos, donde la cantidad de elementos
(puntos) es 5, que hasta el momento se han realizado 3 iteraciones en el algoritmo, el
promedio del error es 0.3 y la diferencia del promedio del error es de 0.2.
Estos tres últimos valores son muy importantes ya que ayudan a determinar en que
momento debe el algoritmo detenerse. El algoritmo se puede terminar cuando se haya
realizado un número prefijado de iteraciones o bien, cuando la diferencia del promedio
del error tienda a 0 (o que ya no cambie); se puede prefijar un límite para este valor.
Por último, se define la relación YNN como la relación que contiene todos los
elementos (puntos) de Y representados por su índice o clave primaria respectiva y el
valor del grupo al cual fueron asignados. Por ejemplo, si se tiene la siguiente tabla
YNN:
I J
1 1
2 2
3 1
4 2
5 2
Tabla 8. Ejemplo de tabla YNN.
Esta nos índica que el elemento número uno de nuestra relación Y está en el grupo 1.
Para nuestro ejemplo, esta tabla nos indica que tanto las hamburguesas como los
refrescos (elementos 1 y 3) están el grupo 1 definido como saludable; mientras que en el
grupo 2 definido como menos saludable se encuentran los elementos de papas, helado y
malteada.
Proceso
Para el desarrollo del algoritmo se han tomado tres índices que indican la relación entre
las tablas y sus elementos. Dichos índices ayudan a relacionar tablas y agilizar en cierta
medida los procesos de E/S tal y como se muestra a continuación:
k1 k2
Valor 0. 0.
4 6
Tabla 10. La transposición de W definida como Wt.
Se define como X1, … Xk a los subconjuntos de Y que pertenecen a cada grupo. Donde
se cumple la siguiente propiedad Xj ^ Xj’ = 0 si j < > j’; es decir, ningún elemento de Y
se encuentra agrupado en dos o más grupos distintos. Al unir los subconjuntos X1, … ,
Xk se obtiene Y.
La parte medular del algoritmo consiste en el cálculo de la distancia euclidiana entre los
puntos (elementos) y un valor de referencia (centroide) para cada grupo. En base a esta
distancia se agrupan los elementos en donde se obtenga la distancia más corta de los
centroides.
Para dejar en claro este concepto, se tomará un ejemplo de una relación Y con dos
dimensiones, ya que hasta tres dimensiones es posible graficar y que dicha gráfica sea
entendida sin problemas.
D1 d2
N1 10 0
N2 5 3
N3 0 0
N4 0 1
N5 4 2
Tabla 11. Tabla Y de ejemplo para el cálculo de dimensiones.
Si se quisiera calcular la distancia que hay entre el punto 1 (elemento n1) y el centroide
1 (C1) se aplicaría la fórmula:
En este caso se ha tomado en cuenta que se tienen dos grupos, y se han determinado los
centroides iniciales como sigue:
k1 K2
d1 3 8
d2 2 2
Tabla 12. Tabla C de centroides para el cálculo de distancias.
El otro punto consiste en que al obtener los valores del punto (elemento) en la tabla Y se
necesita acceder por fila, mientras que en la tabla C y en el resto de las demás tablas se
accede por columna, por lo que se necesita cambiar todas las tablas para que se adapte a
la forma de Y o cambiar Y. Por razones de rendimiento como se explica en el artículo
que se tomo como base, se optó por cambiar Y por lo que para la implementación del
algoritmo, se tiene una nueva tabla Y transpuesta denominada YV, la cual tiene en las
filas las dimensiones y en las columnas los puntos. Por lo que la nueva tabla YV
quedaría de la siguiente forma:
n1 n2 n3 n4 n5
D1 10 5 0 0 4
D2 0 3 0 1 2
Tabla 13. Ejemplo de tabla YV.
i l Valor
1 1 10
1 2 0
2 1 5
2 2 3
3 1 0
3 2 0
4 1 0
4 2 1
5 1 4
5 2 2
Tabla 14. Tabla YV optimizada.
i k Distancia
1 1 53
1 2 8
2 1 5
2 2 10
3 1 13
3 2 68
4 1 10
4 2 65
5 1 1
5 2 16
Tabla 15. Tabla de distancias YD.
Con los valores mínimos de la distancia se llena la tabla YNN, la cual en este caso
tendría los valores que se muestran a continuación. Estos valores indican en primer
instancia a que grupo pertenece cada punto (elemento) de Y.
i J
1 2
2 1
3 1
4 1
5 1
Tabla 16. Tabla YNN obtenida de la ejecución del algoritmo.
En la figura 1, se muestra como quedan asignados los grupos de los elementos (puntos)
con los centroides calculados. En el primer grupo están aquellos elementos que tienen
menos proteína y vitaminas, y el grupo dos los que tienen mayor proteína y vitamina.
En este análisis se puede observar que aunque se tienen dos dimensiones, la de mayor
peso o importancia es la de proteína que determina el grupo, la dimensión vitamina no
es tan relevante debido a que los elementos tienen valores semejantes.
Gráfica de la relación Y
3.5
d2 (Vitamina)
3
2.5
2 Elementos
1.5 Centroides
1
0.5
0
0 1 2 3 4 5 6 7 8 9 10 11
d1 (Proteína)
Figura 1. Agrupación de los elementos de la relación Y definida en este ejemplo.
A través de los ejemplos que se han descrito, se han determinado la mayoría de los
pasos del algoritmo, a continuación sólo se describirán aquellos pasos omitidos y
aquellos que necesitan de mayor explicación.
Para el cálculo de los centroides iniciales es necesario disponer una tabla temporal que
almacene los centroides iniciales, a dicha tabla se ha denominado CH (de CHorizontal)
por que se obtiene de YH al sacar una muestra aleatoria (un punto) para cada grupo por
lo que siguiendo el ejemplo definido anteriormente, CH quedaría de la siguiente forma:
k d1 d2
1 5 3
2 0 1
Tabla 17. Ejemplo de tabla CH.
Los valores de esta tabla se obtuvieron al azar al tomar como muestra el punto 2 y 4. De
aquí se obtiene la tabla C con su transposición por lo que se obtendría la tabla C como
sigue:
k1 k2
d1 5 0
d2 3 1
Tabla 18. Tabla C obtenida de CH.
Para encontrar el centroide más cercano para un punto determinado se necesitan dos
pasos. Primero, calcular la distancia mínima de todos los puntos para cada grupo, dichas
distancias se calculan en la tabla YD; segundo, la distancia mínima se obtiene a partir de
estar almacenando el índice del punto y su grupo en la tabla YNN.
La tabla de centroides se actualiza con el promedio de todos los valores de los puntos
que se encuentran en el mismo grupo en una dimensión en especial.
La tabla modelo puede utilizarse para determinar el momento en el que se debe detener
la ejecución del algoritmo, ya sea tomando en cuenta el numero de iteraciones
efectuadas, o considerando la diferencia entre el promedio de la diferencia de error de la
iteración anterior con respecto a la última.
Algoritmo optimizado
Se puede observar que tener varias tablas por separadas no es óptimo, debido a esto se
remplazó dichas tablas por una sola, en este caso NMQ (l, j, N, M, Q) y también WCR
(l, j, W, C, R). Lo importante de juntar N, M y Q en la misma tabla, es que con una
misma instrucción se pueden actualizar todos sus valores.
/* inicialización */
DROP TABLE YH;
CREATE TABLE YH AS (
SELECT
sum(1) over(order by 1 rows unbounded preceding) AS i
,y ,y2 ,y3 FROM Y );
DROP TABLE W;
CREATE TABLE W (j int,w float);
DROP TABLE C;
CREATE TABLE C(l int,j int,val real);
DROP TABLE R;
CREATE TABLE R(l int,j int,val real);
INSERT INTO C
SELECT 1,1,y1 FROM CH WHERE j=1
...
UNION SELECT 3,1,y3 FROM CH WHERE j=1;
INSERT INTO C
SELECT 1,2,y1 FROM CH WHERE j=2
...
UNION SELECT 3,2,y3 FROM CH WHERE j=2;
/* paso E*/
DELETE FROM YD;
INSERT INTO YD SELECT i,j,sum( power((YV.val - C.val),2))
FROM YV,C WHERE YV.l=C.l GROUP BY i,j;
Por último, se actualizan las tablas W, C y R, así como model, donde se van
registrando los cambios.
/* Paso M*/
DELETE FROM W;
INSERT INTO W SELECT j,count(*) FROM YNN GROUP BY j;
UPDATE W SET w=w/(select n from model);
DELETE FROM C;
INSERT INTO C SELECT l,j,avg(YV.val) FROM YV,YNN
WHERE YV.i=YNN.i GROUP BY l,j;
DELETE FROM R;
INSERT INTO R SELECT C.l,C.j,avg( power((YV.val-C.val),2) )
FROM C,YV,YNN WHERE YV.i=YNN.i and YV.l=C.l and YNN.j=C.j GROUP BY
C.l,C.j;
UPDATE model set dif_avg_q=abs((SELECT sum(W*R.val) FROM R,W WHERE
R.j=W.j)-avg_q);
UPDATE model SET avg_q=(SELECT sum(W*R.val) FROM R,W WHERE
R.j=W.j),iteration=iteration+1;
Dentro del paso de inicialización, en vez de crear las tablas W, C y R se crea una
sola, WCR. Además, la inicialización que se hacia en C, ahora se efectúa en WCR
/* E step */
DELETE FROM YD;
INSERT INTO YD SELECT YV.i,WCR.j,sum( power((YV.val-WCR.C),2) )
FROM YV,WCR WHERE YV.l=WCR.l GROUP BY YV.i,WCR.j;
El paso M ahora utiliza a NMQ para actualizar a WCR. W se debe actualizar por
cada grupo que se desea formar.
Referencias