我正在MATLAB中编写一些机器学习代码,我代表一个带有邻接矩阵A的图形,以及用以下方式定义矩阵Z的图形聚类。
答:如果节点i和节点j之间存在边缘,则a_ij为1。否则为0。 Z:如果节点j在簇i中,则z_ij为1。否则为0。
我正在计算一个矩阵N,它是簇之间的边数,按以下方式定义:
N:n_ij是集群i中节点与集群j中节点之间的边数。 n_ii是集群i内的边数。
N可以通过以下方式计算:
N = zAz'
其中z'是z转置的。
如果我有很多节点,那么计算这需要一些时间,但这不是问题。问题是,我将节点从群集移动到群集很多次,每次我想计算N.
所以问题如下:鉴于我知道N,然后我将节点i从集群c_1移动到集群c_2,如何以有效的方式更新N?
答案 0 :(得分:2)
从Z到Z + U,更新
N←N + Z(AU')+(UA)Z'+ UAU'
Z←Z + U。
Z和U(和A,如果它对你的图有意义)应该有稀疏表示。理论上,至少,这或多或少在编译代码中我将在C中做什么:扫描i的邻居,减少与i的旧集群之间的边数并将边数增加到从我的新集群。在实践中,您可能需要转置Z以使其与Matlab的稀疏矩阵表示对齐,并通过替换两个整行来执行更新Z←Z + U,以便新归零的条目不被视为非零。