【问题标题】:Need a specific example of U-Matrix in Self Organizing Map需要一个自组织图中的 U-Matrix 的具体例子
【发布时间】:2026-02-08 22:15:01
【问题描述】:

我正在尝试开发一个使用 SOM 分析数据的应用程序。但是,在完成培训后,我无法找到一种可视化结果的方法。我知道 U-Matrix 是其中一种方法,但我无法正确理解。因此,我要求一个具体而详细的示例如何构建 U-Matrix。

我还在U-matrix and self organizing maps 阅读了一个答案,但它仅指 1 行映射,3x3 映射怎么样?我知道对于 3x3 地图:

m(1) m(2) m(3)
m(4) m(5) m(6)
m(7) m(8) m(9)

我必须创建一个 5x5 矩阵:

u(1)   u(1,2)     u(2)   u(2,3)     u(3)
u(1,4) u(1,2,4,5) u(2,5) u(2,3,5,6) u(3,6)
u(4)   u(4,5)     u(5)   u(5,6)     u(6)
u(4,7) u(4,5,7,8) u(5,8) u(5,6,8,9) u(6,9)
u(7)   u(7,8)     u(8)   u(8,9)     u(9)

但我不知道如何计算 u-weight u(1,2,4,5), u(2,3,5,6), u(4,5,7,8) 和 u( 5,6,8,9)。

最后,在构建 U-Matrix 之后,有什么方法可以使用颜色对其进行可视化,例如热图?

非常感谢您的宝贵时间。

干杯

【问题讨论】:

  • 我认为这些只是与第一个数字的欧几里得距离。例如,u(2,3,4,6) 表示 u(2,3) + u(2,4) + u(2,6) 等。但我不确定,我正在尝试自己确定也。我偶然发现了你在谷歌上搜索答案的帖子。
  • 你有没有得到解决方案?

标签: machine-learning neural-network


【解决方案1】:

我不知道你是否仍然对此感兴趣,但我找到了这个链接 http://www.uni-marburg.de/fb12/datenbionik/pdf/pubs/1990/UltschSiemon90 它非常具体地解释了如何计算 U 矩阵。 希望对您有所帮助。

顺便说一句,如果我发现该网站的链接有几个引用 SOM 的资源,我把它留在这里以防万一有人感兴趣: http://www.ifs.tuwien.ac.at/dm/somtoolbox/visualisations.html

【讨论】:

  • 提供一些示例代码可以增强对U-Matrix 概念的理解。
【解决方案2】:

Kohonen 映射的基本思想是将数据点映射到 lattice,通常是二维矩形网格。

在最简单的实现中,通过创建 3D 来初始化晶格 具有这些维度的数组:

width * height * number_features

这是 U 矩阵

宽度和高度由用户选择; number_features 只是数字 数据中的特征(列或字段)。

直观地说,这只是创建尺寸为 w * h 的 2D 网格 (例如,如果 w = 10 和 h = 10 那么你的晶格有 100 个单元格),那么 进入每个单元格,放置一个随机的一维数组(有时称为“参考元组”) 其大小和值受您的数据限制。

引用元组也称为权重

U 矩阵是如何渲染的?

在下面的示例中,数据由 rgb 元组组成,因此引用元组 长度为 3,并且这三个值中的每一个都必须介于 0 和 255 之间)。

使用这个 3D 数组(“格子”)开始主迭代循环 该算法迭代地定位每个数据点,使其最接近与它相似的其他数据点。

如果您随时间(迭代次数)绘制它,那么您可以可视化集群 形成。

我使用的绘图工具是出色的 Python 库,Matplotlib, 它直接绘制晶格,只需将其传递给imshow 函数。

以下是 SOM 算法从初始化到 700 次迭代的八个进程快照。新初始化的(iteration_count = 0)点阵渲染在左上面板;最终迭代的结果,在右下角的面板中。

或者,您可以使用较低级别的成像库(在 Python 中,例如 PIL)并将参考元组传输到 2D 网格上,一次一个:

for y in range(h):
    for x in range(w):
        img.putpixel( (x, y), (
            SOM.Umatrix[y, x, 0], 
            SOM.Umatrix[y, x, 1], 
            SOM.Umatrix[y, x, 2]) 
        )

这里的 img 是 PIL 的 Image 类的一个实例。这里的图像是通过一次一个像素地在网格上迭代来创建的;对于每个像素,在 img 上调用 putpixel 三次,这三次调用当然对应于 rgb 元组中的三个值。

【讨论】:

  • 感谢您的回答,但恐怕它不能直接回答我的问题。我需要了解 U-Matrix 的工作原理,以便将其应用到我的应用程序中。此外,我的应用程序是用 Java 开发的,所以我不能使用 Python 库:)
  • “使用这个 3D 数组(“格”)开始主迭代循环该算法迭代地定位每个数据点,使其最接近与它相似的其他数据点。你能扩展一下吗?这正是问题所要问的。具体来说,你是如何制作这个 U 矩阵的?
  • doug:恐怕你把 u-matrix 和 codebook 搞混了。您正在绘制的是码本中的值,即网格中向量的 RGB 表示。 u-matrix不同,它代表了格子中邻居之间的“距离”。
【解决方案3】:

根据您创建的矩阵:

u(1)     u(1,2)     u(2)   u(2,3)    u(3)
u(1,4) u(1,2,4,5) u(2,5) u(2,3,5,6) u(3,6)
u(4)     u(4,5)     u(5)   u(5,6)    u(6)
u(4,7) u(4,5,7,8) u(5,8) u(5,6,8,9) u(6,9)
u(7)   u(7,8)       u(8)   u(8,9)    u(9)

像 u(1), u(2), ..., u(9) 这样具有单个数字的元素也可以像 u(1,2,4,5), u( 2,3,5,6), ... , u(5,6,8,9) 是使用邻域中值的平均值、中值、最小值或最大值来计算的。

先用两个数字计算元素是个好主意,一个可能的代码是:

 for i in range(self.h_u_matrix):
  for j in range(self.w_u_matrix):

    nb = (0,0)

    if not (i % 2) and (j % 2):
      nb = (0,1)

    elif (i % 2) and not (j % 2):
      nb = (1,0)

    self.u_matrix[(i,j)] = np.linalg.norm(
        self.weights[i //2, j //2] - self.weights[i //2 +nb[0], j // 2 + nb[1]],
        axis = 0
    )

在上面的代码中,self.h_u_matrix = self.weights.shape[0]*2 - 1 self.w_u_matrix = self.weights.shape[1]*2 - 1 是 U 矩阵的尺寸。话虽如此,为了计算其他元素,有必要获取一个包含他们邻居的列表并应用平均值。下面的代码实现了这个想法:

for i in range(self.h_u_matrix):
  for j in range(self.w_u_matrix):

    if not (i % 2) and not (j % 2):
       nodelist = []
       if i > 0:
           nodelist.append((i-1,j))
       if i < 4:
           nodelist.append((i+1, j))
       if j > 0:
           nodelist.append((i,j -1))
       if j < 4:
           nodelist.append((i,j+1))

       meanlist = [self.u_matrix[u_node] for u_node in nodelist]
       self.u_matrix[(i,j)] = np.mean(meanlist)
  
     elif (i % 2) and (j % 2):
       meanlist = [
                    (i - 1, j),
                    (i + 1, j),
                    (i, j - 1),
                    (i, j + 1)]
       self.u_matrix[(i,j)] = np.mean(meanlist)
       
  
  

【讨论】:

    最近更新 更多