Python中的六边形自组织映射

Mik*_*ike 7 python artificial-intelligence module neural-network self-organizing-maps

我正在寻找Python上的六边形 自组织地图.

六角形瓷砖

  1. 准备模块.如果存在.
  2. 绘制六边形细胞的方法
  3. 使用六边形单元作为数组或其他方法的算法

关于:自组织映射(SOM)或自组织特征映射(SOFM)是一种人工神经网络,使用无监督学习训练以产生低维(通常为二维)

Fer*_*ira 7

我知道这个讨论已经有4年了,但是我没有在网上找到满意的答案.

如果你有一个数组映射输入到神经元的数组和一个与每个神经元的位置相关的二维数组.

例如,考虑这样的事情:

hits = array([1, 24, 14, 16,  6, 11,  8, 23, 15, 16, 15,  9, 20,  1,  3, 29,  4,
              32, 22,  7, 26, 26, 35, 23,  7,  6, 11,  9, 18, 17, 22, 19, 34,  1,
              36,  3, 31, 10, 22, 11, 21, 18, 29,  3,  6, 32, 15, 30, 27],
             dtype=int32)
centers = array([[ 1.5       ,  0.8660254 ],
                 [ 2.5       ,  0.8660254 ],
                 [ 3.5       ,  0.8660254 ],
                 [ 4.5       ,  0.8660254 ],
                 [ 5.5       ,  0.8660254 ],
                 [ 6.5       ,  0.8660254 ],
                 [ 1.        ,  1.73205081],
                 [ 2.        ,  1.73205081],
                 [ 3.        ,  1.73205081],
                 [ 4.        ,  1.73205081],
                 [ 5.        ,  1.73205081],
                 [ 6.        ,  1.73205081],
                 [ 1.5       ,  2.59807621],
                 [ 2.5       ,  2.59807621],
                 [ 3.5       ,  2.59807621],
                 [ 4.5       ,  2.59807621],
                 [ 5.5       ,  2.59807621],
                 [ 6.5       ,  2.59807621],
                 [ 1.        ,  3.46410162],
                 [ 2.        ,  3.46410162],
                 [ 3.        ,  3.46410162],
                 [ 4.        ,  3.46410162],
                 [ 5.        ,  3.46410162],
                 [ 6.        ,  3.46410162],
                 [ 1.5       ,  4.33012702],
                 [ 2.5       ,  4.33012702],
                 [ 3.5       ,  4.33012702],
                 [ 4.5       ,  4.33012702],
                 [ 5.5       ,  4.33012702],
                 [ 6.5       ,  4.33012702],
                 [ 1.        ,  5.19615242],
                 [ 2.        ,  5.19615242],
                 [ 3.        ,  5.19615242],
                 [ 4.        ,  5.19615242],
                 [ 5.        ,  5.19615242],
                 [ 6.        ,  5.19615242]])
Run Code Online (Sandbox Code Playgroud)

所以我使用以下方法:

from matplotlib import collections, transforms
from matplotlib.colors import colorConverter
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

def plot_map(hits, n_centers, w=10):
    """
    Plot Map
    """

    fig = plt.figure(figsize=(w, .7 * w))
    ax = fig.add_subplot(111)
    hits_count = np.histogram(hits, bins=n_centers.shape[0])[0]
    # Discover difference between centers
    collection = RegularPolyCollection(
        numsides=6, # a hexagon 
        rotation=0, sizes=( (6.6*w)**2 ,),
        edgecolors = (0, 0, 0, 1),
        array= hits_count,
        cmap = cm.winter,
        offsets = n_centers,
        transOffset = ax.transData,
    )
    ax.axis('off')
    ax.add_collection(collection, autolim=True)
    ax.autoscale_view()
    fig.colorbar(collection)
    return ax

_ = plot_map(som_classif, matrix)
Run Code Online (Sandbox Code Playgroud)

最后我得到了这个输出:

在此输入图像描述

编辑

/sf/answers/1666796841/上此代码的更新版本


gur*_*lex 6

我没有得到第1点的答案,但有一些关于第2点和第3点的提示.在您的上下文中,您不是建模物理2D空间,而是使用具有6个邻居的平铺的概念空间.这可以使用排列成列的方形瓷砖建模,其中奇数柱垂直移动方形的一半大小.我将尝试ASCII图:

 ___     ___     ___     
|   |___|   |___|   |___
|___|   |___|   |___|   |
|   |___|   |___|   |___|
|___|   |___|   |___|   |
|   |___|   |___|   |___|
|___|   |___|   |___|   |
    |___|   |___|   |___|
Run Code Online (Sandbox Code Playgroud)

你可以很容易地看到每个方格有6个邻居(当然边缘除了).这可以很容易地建模为2D正方形阵列,并且计算位置(i,j)处的正方形坐标的规则,i是行,j是列非常简单:

如果j是偶数:

(i+1, j), (i-1, j), (i, j-1), (i, j+1), (i-1, j-1), (i+1, j-1)
Run Code Online (Sandbox Code Playgroud)

如果j是奇数:

(i+1, j), (i-1, j), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j+1)
Run Code Online (Sandbox Code Playgroud)

(第4个术语相同)