Selbstorganisierende Karte in der Python NumPy-Version

Wenn Sie versuchen, eine selbstorganisierende Karte (SOM) in Python zu verwenden Ich konnte keine schnelle Implementierung mit numpy finden, also habe ich es geschafft.

Da es Implementierungen (1, 2) gab, die bis zu einem gewissen Grad mit Numpy durchgeführt wurden, Basierend darauf beende ich es mit numpy.

Ein Ausführungsbeispiel wird auf ipython notebook veröffentlicht.

Sie können so MAP Screen Shot 2016-01-20 at 8.29.10 PM.png

Code

python


import numpy as np
from matplotlib import pyplot as plt

class SOM():
    
    def __init__(self, teachers, N, seed=None):
        self.teachers = np.array(teachers)
        self.n_teacher = self.teachers.shape[0]
        self.N = N
        if not seed is None:
            np.random.seed(seed)
            
        x, y = np.meshgrid(range(self.N), range(self.N))
        self.c = np.hstack((y.flatten()[:, np.newaxis],
                            x.flatten()[:, np.newaxis]))
        self.nodes = np.random.rand(self.N*self.N,
                                    self.teachers.shape[1])
    
    def train(self):
        for i, teacher in enumerate(self.teachers):
            bmu = self._best_matching_unit(teacher)
            d = np.linalg.norm(self.c - bmu, axis=1)
            L = self._learning_ratio(i)
            S = self._learning_radius(i, d)
            self.nodes += L * S[:, np.newaxis] * (teacher - self.nodes)
        return self.nodes

    def _best_matching_unit(self, teacher):
        #compute all norms (square)
        norms = np.linalg.norm(self.nodes - teacher, axis=1)
        bmu = np.argmin(norms) #argment with minimum element 
        return np.unravel_index(bmu,(self.N, self.N))

    def _neighbourhood(self, t):#neighbourhood radious
        halflife = float(self.n_teacher/4) #for testing
        initial  = float(self.N/2)
        return initial*np.exp(-t/halflife)

    def _learning_ratio(self, t):
        halflife = float(self.n_teacher/4) #for testing
        initial  = 0.1
        return initial*np.exp(-t/halflife)

    def _learning_radius(self, t, d):
        # d is distance from BMU
        s = self._neighbourhood(t)
        return np.exp(-d**2/(2*s**2))
        
        
N = 20        
teachers = np.random.rand(10000, 3)
som = SOM(teachers, N=N, seed=10)

# Initial map
plt.imshow(som.nodes.reshape((N, N, 3)),
           interpolation='none')
plt.show()

# Train
som.train()

# Trained MAP
plt.imshow(som.nodes.reshape((N, N, 3)),
           interpolation='none')
plt.show()      

Verweise

Recommended Posts

Selbstorganisierende Karte in der Python NumPy-Version
Matrixprodukt in Python numpy
Setzen Sie Python, Numpy, OpenCV3 in Ubuntu14
So überprüfen Sie die Version von opencv mit Python
Doppelstart in Python verhindern (verbesserte Version)
Quadtree in Python --2
Mein Numpy (Python)
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
wo von numpy
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
# Python-Grundlagen (#Numpy 1/2)
Plink in Python
Konstante in Python
# Python-Grundlagen (#Numpy 2/2)
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
PYTHON2.7 64-Bit-Version
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Python #Numpy Basics
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
[Python] Numpy Memo
In Python flach drücken
Setzen Sie Python xgboost in max osx (llvm Version)
[Python] Vertauschen von Zeilen und Spalten mit Numpy-Daten
Installieren Sie Python 3.5.1 + numpy + scipy + α in einer Windows-Umgebung
So geben Sie die TLS-Version in Python-Anforderungen an
Verbreiten Sie die Kartenkacheln des Geographical Institute mit Python
[Rust / Python] Behandle Numpy mit PyO3 (Version August 2020)
Implementieren Sie den PRML-Algorithmus in Python (fast nur Numpy)
Sortierte Liste in Python