Estoy escribiendo algunos códigos de Aprendizaje automático en MATLAB, y estoy representando un gráfico con una matriz de adyacencia A, y un agrupamiento del gráfico con una matriz Z definida de las siguientes maneras.Optimizando el código vectorizado para la adyacencia de gráficos
A: a_ij es 1 si hay un borde entre el nodo iy el nodo j. 0 de lo contrario. Z: z_ij es 1 si el nodo j está en el grupo i. 0 de lo contrario.
Estoy calcular una matriz de N, que es el número de aristas entre las agrupaciones, que se define de la siguiente manera:
N: n_ij es el número de aristas entre los nodos en el grupo I y nodos en el grupo j. n_ii es el número de bordes dentro del cluster i.
N se puede calcular por:
N = zAz'
donde z' es-z transpuesta.
Si tengo muchos nodos, entonces calcular esto lleva algo de tiempo, pero ese no es el problema. El problema es que muevo los nodos del clúster al clúster muchas veces, y cada vez que quiero calcular N.
Así que el problema es el siguiente: dado que sé N, y que luego muevo el nodo i del clúster c_1 al clúster c_2, ¿cómo puedo actualizar N de manera eficiente?
Supongo que olvidé indicar que a veces necesito crear un nuevo clúster y que a veces necesito eliminar clústeres. ¿Cómo debería crear U al construir una nueva, o eliminar un clúster? – utdiscant
Agregue un clúster vacío: agregue una fila cero a Z y una fila/columna a N. Elimine un clúster vacío: invierta este proceso. Si realmente quiere fusionar dos clusters, hay una forma mejor de actualizar N que mover un vértice a la vez (reemplace las dos filas de Z con su suma, luego reemplace las dos filas y luego las columnas de N con su suma). – foobar