Programación del algoritmo de agrupamiento K-means 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 En este reporte se resume el diseño y la implementación del algoritmo k-means con instrucciones de SQL. La implementación se desarrollo en el manejador Oracle 9i a través de procedimientos almacenados y con SQL dinámico. Para el diseño nos basamos en el modelo propuesto por [1], en cuyo artículo se comentan una serie de pasos sobre como sería posible implementarlo; sin embargo adolece de algunos puntos importantes que no son tan obvios y que son necesarios para poder desarrollarlo. Como en todo algoritmo, primero se detalla la entrada, seguido de la salida que se espera obtener, para finalizar explicando lo que se realiza para obtener el resultado.
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 ejemplo 1 se tiene la siguiente tabla: ALIMENTOS (Nombre, Proteína, Vitamina, Grasa, Azucar, Mineral) con los siguientes valores de ejemplo: Nombre Hamburguesa Papas Refresco Helado Malteada
Proteína 10 5 0 0 4
Vitamina 0 3 0 1 2
Grasa 10 15 0 7 10
Azúcar 0 12 23 33 37
Mineral 0 0 0.5 0 0
Tabla 1. Tabla alimentos.
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 n1 10 0 10 0 n2 5 3 15 12 n3 0 0 0 23 n4 n5
0 4
1 2
7 33 10 37
d5 0 0 0. 5 0 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 1 10 0 10 0 2 5 3 15 12 3 0 0 0 23 4 5
0 4
1 2
7 33 10 37
d5 0 0 0. 5 0 0
Tabla 3. Ejemplo de Tabla YH.
Salida El algoritmo recibe como salida tres matrices denominadas W, C y R, que representan los pesos, los centroides y las varianzas respectivamente. 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: d1 d2 d3 d4 d5
K1 K2 7 3 1 4 8 12 17 21 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 1 1 2 2 3 3 4 4 5 5
j Valor 1 7 2 3 1 1 2 4 1 8 2 12 1 17 2 21 1 0 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%). De manera complementaría también se dispone de una tabla llamada model que contiene las estadísticas del sistema como son el número de dimensiones tomadas en consideración, el número de grupos, el número de elementos o puntos, el promedio del error y la diferencia del promedio del error. La diferencia del promedio del error consiste en la diferencia del promedio del error calculado anteriormente contra el nuevo error obtenido, debido a la reubicación de los centroides de cada cluster. La tabla model en nuestro ejemplo es la siguiente: d k n I avg_q 5 2 5 3 0.3
dif_avg_q 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 1 2 3 4 5
J 1 2 1 2 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: Índice i j l
Rango Descripción 1 … n Número de puntos (elemento) 1…k Número de grupo 1…d Número de dimensión
Tabla 9. Nomenclatura de los índices empleados.
Se define la operación de transposición T como la lectura de un valor en forma de columna a la lectura en forma de fila. Por ejemplo, si se realizará la transposición o matriz transpuesta de la relación W (ver tabla 4), definida como Wt sería la siguiente: Valor
k1 0. 4
k2 0.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. La distancia euclidiana se calcula con la siguiente fórmula:
d(yi, Cj) = (yi - Cj)T (yi - Cj) = ∑d l=1 (yli – Clj)2 En donde nos dice que la distancia del punto yi con respecto al centroide Cj es igual a la diferencia entre yi y Cj transpuesta por la diferencia de yi y Cj. De modo generalizado, la fórmula se expresa como la sumatoria al cuadrado de las diferencias de los puntos y los centroides en cada dimensión. 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. De la relación Y se tomarán las dimensiones d1 y d2 por lo que nuestra tabla de ejemplo será la siguiente: N1 N2 N3 N4 N5
D1 d2 10 0 5 3 0 0 0 1 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:
d(y1 – c1) = (y1 – c1)T(y1 – c1) = ∑2l=1(yl1,cl1) = (y11 – C11)2 + (y21 – C21)2 En esta parte destacan dos puntos fundamentales. El primero de ellos, consiste en que no se han definidos los valores que contendrán los centroides de cada grupo para cada una de las dimensiones. La forma más fácil de implementarla consiste en tomar los valores de manera aleatoria. En este algoritmo así se han determinado los puntos tomando en cuenta muestras (‘samples’) en la tabla Y de un elemento. Otra opción distinta a esta circunstancia, podría ser el considerar los primeros valores de la tabla YH, en caso de que no se contará con una manera de obtenerlos de manera aleatoria, lo importante es establecer los que en primera instancia serán los centroides, los cuales pueden variar según se vaya ejecutando el algoritmo.
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.
Se puede notar que la tabla YV obtenida de la transposición de Y tendrá muchos atributos (columnas) a medida del número de puntos o elementos contenidos en la tabla Y. Esto es poco práctico para tablas con demasiados puntos, por lo que una mejor implementación de la tabla YV es la siguiente: i 1 1 2 2 3 3 4 4 5 5
l Valor 1 10 2 0 1 5 2 3 1 0 2 0 1 0 2 1 1 4 2 2
Tabla 14. Tabla YV optimizada.
Siguiendo la fórmula las distancias son las siguientes: d(y1,C1) = (10-3)2 + (0-2) 2 = 49 + 4 = 53 d(y1,C2) = (10-8)2 + (0-2)2 = 4 + 4 = 8 d(y2,C1) = (5-3)2 + (3-2)2 = 4 + 1 = 5 d(y2,C2) = (5-8)2 + (3-2)2 = 9 + 1 = 10 d(y3,C1) = (0-3)2 + (0-2)2 = 9 + 4 = 13 d(y3,C2) = (0-8)2 + (0-2)2 = 64 + 4 = 68 d(y4,C1) = (0-3)2 + (1-2)2 = 9 + 1 = 10 d(y4,C2) = (0-8)2 + (1-2)2 = 64 + 1 = 65
d(y5,C1) = (4-3)2 + (2-2)2 = 1 + 0 = 1 d(y5,C2) = (4-8)2 + (2-2)2 = 16 + 0 = 16 Estos valores que se obtienen, se almacenan en la tabla YD que tiene como filas la llave primaria el índice del punto (elemento) el índice del grupo y la distancia en el plano. La tabla YD de nuestro ejemplo es la siguiente: i 1 1 2 2 3 3 4 4 5 5
k 1 2 1 2 1 2 1 2 1 2
Distancia 53 8 5 10 13 68 10 65 1 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 1 2 3 4 5
J 2 1 1 1 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. Los pasos del algoritmo en general son los siguientes: 1. 2. 3. 4. 5. 6. 7.
Configuración.- Consiste en crear y cargar los datos de entrada. Inicialización.- Inicializar los centroides. Paso E.- Computar las k distancias por punto yi. Paso E.- Encontrar el centroide más cercano Cj para cada punto yi. Paso M.- Actualizar los pesos, centroides y varianzas: W, C y R. Paso M.- Actualizar la tabla de seguimiento del progreso de k-means (model). Repetir los pasos 3 a 6 hasta que el algoritmo converja.
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.
El cálculo de la distancia euclideana tiene una complejidad de O(dkn) lo que un procedimiento altamente costoso en tiempo de CPU para valores demasiados grande, sobre todo de n. Este se calcula realizando una sumatoria de los campos valor de la tabla YV y C reunidas por medio de su índice de dimensiones. 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. Para actualizar los valores en el paso M, se necesita actualizar la tabla de pesos, centroides y varianza; W, C y R respectivamente. La tabla de pesos se actualiza siempre con la cuenta de todos los puntos que estén sobre un grupo determinado en la tabla YNN. Posteriormente se divide el valor obtenido por el total de puntos (elementos) disponibles en la tabla model. 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 R de varianzas se obtiene al sacar el promedio de la diferencia del valor del punto y el nuevo valor calculado para el centroide para todas las dimensiones del grupo en el que está el elemento (punto). Para finalizar, en cada iteración se debe actualizar la tabla modelo. Se incrementa el número de iteraciones en uno por cada vez que se ejecuten los pasos E y M del algoritmo, y el valor del promedio de la diferencia del error, el cual se obtiene de la sumatoria de multiplicar el valor de la varianza de cada grupo por su peso correspondiente. 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 ha realizado algunas mejoras para aumentar la velocidad de ejecución del algoritmo y disminuir la carga de trabajo ocasionada por las consultas necesarias. Para aumentar la velocidad de procesamiento al realizar los cálculos de las estadísticas se implementaron tres nuevas tablas denominadas N, M y Q. N es de dimensiones k*1; mientras que M y Q son d*k y son análogas a W, C y R en dimensiones. N j almacena el número de puntos que están contenidos en un grupo en particular (N j = |Xj|). Mj almacena la sumatoria de dichos puntos (M j = ∑yi Є Xj yi) y Qj representa la sumatoria de los cuadrados de los puntos que se encuentran en el grupo j (Qj = ∑ yiЄXj yiTyi ). A través de estas nuevas matrices el cálculo de W, C y R se simplifica considerablemente. Wj = Nj / ∑k j=1 Wj; Cj = Mj / Nj, Rj = Qj /Nj – CjTCj.
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. Mientras que en WCR se asigna primeramente a W un valor de cero, después, dependiendo del grupo k del que se trate, W guardará la cantidad de elementos que coincidan en ese grupo, asignándole el valor de N correspondiente; se debe inicializar con cero al principio, en el supuesto de que un grupo quede vacío, ya que después se debe dividir tal valor entre la cantidad de elementos total, y si no se efectuará así, se generarían errores o inconsistencias. Todas las demás operaciones del algoritmo estándar se dejan igual.
Código SQL para Oracle 9i El código que se muestra a continuación corresponde con las instrucciones SQL que se siguen para desarrollar el algoritmo k-means; se toma como ejemplo una tabla Y con 3 campos; además, se van a crear dos grupos. El primer paso consiste en preparar las tablas que se van a utilizar. /* 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 model; CREATE TABLE model( d INT,k INT,n float,iteration INT,avg_q real,dif_avg_q real); INSERT INTO model SELECT 3,2,count(*),0,0.0,0.0 FROM YH; De tabla modelo se almacenan la cantidad de campos y grupos que se van a considerar, la cantidad de elementos que se van a agrupar, el primer cero indica el numero de iteraciones efectuadas y los siguientes valores representan el promedio del error y la diferencia del promedio del error, respectivamente. DROP TABLE YV; CREATE TABLE YV ( i int,l INT,val REAL); INSERT INTO YV SELECT i,1,y1 FROM YH; ... INSERT INTO YV SELECT i,3,y3 FROM YH; 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); DROP TABLE YD; CREATE TABLE YD (i int,j int,distance real); En este primer paso, en CH se toman como “muestras” los centroides iniciales los primeros dos elementos de YH. Estos centroides irán cambiando, según vaya ejecutándose el algoritmo. DROP TABLE CH; CREATE TABLE CH(j INT,y1 REAL,y2 REAL,y3 REAL); INSERT INTO CH SELECT 1,y1,y2,y3 FROM YH where i='1'; INSERT INTO CH SELECT 2,y1,y2,y3 FROM YH where i='2'; 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; Ahora se calculan las distancias mínimas y se encuentran los centroides más cercanos. /* 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; DROP TABLE YNN; CREATE TABLE YNN AS( SELECT YD.i,YD.j FROM YD,( SELECT i,min(distance) AS mindistance FROM YD GROUP BY i)YMIND WHERE YD.i=YMIND.i and YD.distance=YMIND.mindistance); 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; Los pasos E y M deben ejecutarse hasta alcanzar el número de iteraciones u obtener una diferencia de error deseada. Estos valores son observables en la tabla model. Para la versión optimizada, el código es muy semejante, variando un poco el cálculo de los pasos E y M. Los cambios se muestran a continuación. 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 DROP TABLE WCR; CREATE TABLE WCR (l int,j int,W real,C real,R real); INSERT INTO WCR SELECT 1,1,0,y1,1 FROM CH WHERE j=1 ... UNION SELECT 3,1,0,y3,1 FROM CH WHERE j=1; INSERT INTO WCR SELECT 1,2,0,y1,1 FROM CH WHERE j=2 ... UNION SELECT 3,2,0,y3,1 FROM CH WHERE j=2; El paso E ahora de calcula de esta manera. En esta ocasión, los cálculos estadísticos se llevan sobre NMQ. /* 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; DROP TABLE YNN; CREATE TABLE YNN AS (SELECT YD.i,YD.j FROM YD,(SELECT i,min(distance) AS mindistance FROM YD GROUP BY i)YMIND WHERE YD.i=YMIND.i and YD.distance=YMIND.mindistance);
DELETE FROM NMQ; INSERT INTO NMQ SELECT l,j,sum(1.0) AS N,sum(YV.val) AS M,sum(YV.val*YV.val) AS Q FROM YV,YNN WHERE YV.i=YNN.i GROUP BY l,j; El paso M ahora utiliza a NMQ para actualizar a WCR. W se debe actualizar por cada grupo que se desea formar. UPDATE WCR SET W=(select N from NMQ, WCR WHERE (NMQ.l=WCR.l AND NMQ.j=WCR.j)AND NMQ.j=1 group by N) WHERE WCR.j=1; ... UPDATE WCR SET C=CASE WHEN (select N from NMQ, WCR WHERE (NMQ.l=WCR.l AND NMQ.j=WCR.j)AND NMQ.j=1 group by N)>0 THEN (select M/N from NMQ WHERE NMQ.l=1 AND NMQ.j=1) ELSE C END R=CASE WHEN (select N from NMQ, WCR WHERE (NMQ.l=WCR.l AND NMQ.j=WCR.j)AND NMQ.j=1 group by N)>0 THEN (select Q/N - power((M/N),2) from NMQ WHERE NMQ.l=1 AND NMQ.j=1) ELSE R END WHERE WCR.l=1 AND WCR.j=1; ... UPDATE WCR SET C=CASE WHEN (select N from NMQ, WCR WHERE (NMQ.l=WCR.l AND NMQ.j=WCR.j)AND NMQ.j=2 group by N)>0 THEN (select M/N from NMQ WHERE NMQ.l=3 AND NMQ.j=2) ELSE C END R=CASE WHEN (select N from NMQ, WCR WHERE (NMQ.l=WCR.l AND NMQ.j=WCR.j)AND NMQ.j=2 group by N)>0 THEN (select Q/N - power((M/N),2) from NMQ WHERE NMQ.l=3 AND NMQ.j=2) ELSE R END WHERE WCR.l=3 AND WCR.j=2; UPDATE WCR SET W=W/(select n from model); UPDATE model set dif_avg_q=abs((SELECT sum(W*R) FROM WCR)-avg_q); UPDATE model SET avg_q=(SELECT sum(W*R) FROM WCR),iteration=iteration+1; De igual manera, los pasos E y M se repiten hasta que el algoritmo converja.
Referencias [1] Carlos Ordonez, “Programming the K-means Clustering Algorithm in SQL”. Publicado en KDD’04, del 22 al 25 de agosto de 2004, Seattle, Washington, USA.