Sunteți pe pagina 1din 13

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 ejemplo1 se
tiene la siguiente tabla:

ALIMENTOS (Nombre, Proteína, Vitamina, Grasa, Azucar, Mineral) con los siguientes
valores de ejemplo:

Nombre Proteína Vitamin Grasa Azúcar Mineral


a
Hamburguesa 10 0 10 0 0
Papas 5 3 15 12 0
Refresco 0 0 0 23 0.5
Helado 0 1 7 33 0
Malteada 4 2 10 37 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 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

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:

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%).

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 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:

Índice Rango Descripción


i 1 … n Número de puntos (elemento)
j 1…k Número de grupo
l 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:

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.

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:

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:

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 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.

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 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.

Los pasos del algoritmo en general son los siguientes:

1. Configuración.- Consiste en crear y cargar los datos de entrada.


2. Inicialización.- Inicializar los centroides.
3. Paso E.- Computar las k distancias por punto yi.
4. Paso E.- Encontrar el centroide más cercano Cj para cada punto yi.
5. Paso M.- Actualizar los pesos, centroides y varianzas: W, C y R.
6. Paso M.- Actualizar la tabla de seguimiento del progreso de k-means (model).
7. 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 (Nj = |Xj|). Mj
almacena la sumatoria de dichos puntos (Mj = ∑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.

S-ar putea să vă placă și