Sześciokątna Mapa Samoorganizująca się w Pythonie
Szukam heksagonalny samoorganizująca się Mapa na Pythonie.
- gotowy moduł. Jeśli istnieje.
- sposób na wykreślenie sześciokątnej komórki
- 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)
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)
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:
EDIT
Zaktualizowaną wersję tego kodu na https://stackoverflow.com/a/23811383/575734
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