Sześciokątna Mapa Samoorganizująca się w Pythonie

Szukam heksagonalny samoorganizująca się Mapa na Pythonie.

płytki sześciokątne

  1. gotowy moduł. Jeśli istnieje.
  2. sposób na wykreślenie sześciokątnej komórki
  3. algorytmy do pracy z sześciokątnymi komórkami jako tablica lub smth else

O : Samoorganizująca się Mapa (SOM) lub samoorganizująca Mapa funkcji (SOFM) jest rodzajem sztucznej sieci neuronowej, która jest szkolona przy użyciu nienadzorowanego uczenia się w celu wytworzenia niskowymiarowej (zazwyczaj dwuwymiarowy)

Author: Community, 2010-02-25

2 answers

Nie mam odpowiedzi do punktu 1, ale kilka wskazówek do punktu 2 i 3. W Twoim kontekście nie modelujesz fizycznej przestrzeni 2D, ale przestrzeni koncepcyjnej z kafelkami, które mają 6 sąsiadów. Można to modelować za pomocą kwadratowych płytek ułożonych w kolumnach z nieparzystymi kolumnami przesuniętymi pionowo o połowę wielkości kwadratu. Spróbuję diagramu ASCII:

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

Widać łatwo, że każdy kwadrat ma 6 sąsiadów (z wyjątkiem tych na krawędziach oczywiście). Można to łatwo modelować jako tablicę 2D z kwadratów, a zasady obliczania współrzędnych kwadratu w pozycji (i, j), i jest rzędem I J kolumną są dość proste:

Jeśli j jest parzyste:

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

Jeśli J jest nieparzyste:

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

(4 Pierwsze terminy są identyczne)

 6
Author: gurney alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-26 08:03:29

Wiem, że ta dyskusja ma 4 lata, jednak nie znalazłem satysfakcjonującej odpowiedzi w Internecie.

Jeśli masz coś jako tablicę mapującą wejście do neuronu i tablicę 2-d związaną z lokalizacją każdego neuronu.

Na przykład rozważ coś takiego:

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

Więc robię to za pomocą następującej metody:

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)

Wreszcie mam to wyjście:

Tutaj wpisz opis obrazka

EDIT

Zaktualizowaną wersję tego kodu na https://stackoverflow.com/a/23811383/575734

 6
Author: Fernando Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:03