8

Pythonで六角形の 自己組織化マップを探しています。

六角形のタイル張り

  1. 準備完了モジュール。存在する場合。
  2. 六角セルをプロットする方法
  3. 六角形のセルを配列またはその他の方法で処理するアルゴリズム

概要: 自己組織化マップ (SOM) または自己組織化特徴マップ (SOFM) は、教師なし学習を使用してトレーニングされ、低次元 (通常は 2 次元) を生成する人工ニューラル ネットワークの一種です。

4

2 に答える 2

7

私はこの議論が 4 年前のものであることを知っていますが、Web 上で満足のいく答えを見つけることができませんでした。

入力をニューロンにマッピングする配列と、各ニューロンの位置に関連する 2 次元配列として何かがある場合。

たとえば、次のようなものを考えてみましょう:

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]])

したがって、次の方法を使用してこれを行います。

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)

最後に、次の出力を得ました。

ここに画像の説明を入力

編集

https://stackoverflow.com/a/23811383/575734のこのコードの更新バージョン

于 2014-05-15T21:35:37.407 に答える
6

ポイント 1 については答えがありませんが、ポイント 2 と 3 についてはいくつかのヒントがあります。あなたのコンテキストでは、物理的な 2D 空間をモデル化するのではなく、6 つの隣接するタイルを含む概念空間をモデル化しています。これは、奇数の列が正方形の半分のサイズだけ垂直方向にシフトされた列に配置された正方形のタイルでモデル化できます。ASCII ダイアグラムを試してみます。

 ___     ___     ___     
|   |___|   |___|   |___
|___|   |___|   |___|   |
|   |___|   |___|   |___|
|___|   |___|   |___|   |
|   |___|   |___|   |___|
|___|   |___|   |___|   |
    |___|   |___|   |___|

各正方形には 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)

j が奇数の場合:

(i+1, j), (i-1, j), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j+1)

(最初の 4 つの項は同じです)

于 2010-02-26T08:03:29.787 に答える