Carte auto-organisée dans la version Python NumPy

Si vous essayez d'utiliser une carte auto-organisée (SOM) en Python Je n'ai pas trouvé d'implémentation rapide avec numpy, alors je l'ai fait.

Puisqu'il y avait des implémentations (1, 2) faites avec numpy dans une certaine mesure, Sur cette base, je le termine avec numpy.

Un exemple d'exécution est publié sur ipython notebook.

Vous pouvez MAP comme ça 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()      

Les références

Recommended Posts

Carte auto-organisée dans la version Python NumPy
Produit matriciel en python numpy
Mettez python, numpy, opencv3 dans ubuntu14
Comment vérifier la version d'opencv avec python
Empêcher le double lancement en Python (version améliorée)
Quadtree en Python --2
Mon Numpy (Python)
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
où de numpy
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Les bases de #Python (#Numpy 1/2)
Plink en Python
Constante en Python
Les bases de #Python (#Numpy 2/2)
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Version 64 bits de PYTHON2.7
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Principes de base de Python #Numpy
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
[Python] Mémo Numpy
Aplatir en python
Mettre python xgboost dans max osx (version llvm)
[Python] Permutation des lignes et des colonnes de données Numpy
Installez Python 3.5.1 + numpy + scipy + α dans l'environnement Windows
Comment spécifier la version TLS dans les requêtes python
Répandre les tuiles de la carte de l'Institut géographique avec Python
[Rust / Python] Gérer numpy avec PyO3 (version d'août 2020)
Implémenter l'algorithme PRML en Python (presque uniquement Numpy)
Liste triée en Python