Iris training example#

This script demonstrates training the Iris dataset using matplotlib.

  • iris training
  • iris training
  • iris training
  • iris training
  • SOM Weight Positions
  • iris training
  • iris training
Beginning Initialization
Current Time = 11:22:15
Ending Initialization
Current Time = 11:22:15
Beginning Training
Current Time = 11:22:15
50
Current Time = 11:22:15
100
Current Time = 11:22:15
150
Current Time = 11:22:15
200
Current Time = 11:22:15
250
Current Time = 11:22:15
300
Current Time = 11:22:15
350
Current Time = 11:22:15
400
Current Time = 11:22:15
450
Current Time = 11:22:15
500
Current Time = 11:22:15
Ending Training
Current Time = 11:22:15
Quantization error: 0.23905968431429797
Topological Error (1st neighbor) = 15.333333333333334%
Topological Error (1st and 2nd neighbor) = 0.0%
Distortion (d=1) = 1.4056896226214228
Distortion (d=2) = 2.1270973756204903
Distortion (d=3) = 2.0118838056150357

# Importing Library
from NNSOM.plots import SOMPlots

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import default_rng
from sklearn.datasets import load_iris
from sklearn.preprocessing import MinMaxScaler

import os

# SOM Parameters
SOM_Row_Num = 4  # The number of row used for the SOM grid.
Dimensions = (SOM_Row_Num, SOM_Row_Num) # The dimensions of the SOM grid.

# Training Parameters
Epochs = 500
Steps = 100
Init_neighborhood = 3

# Random State
SEED = 1234567
rng = default_rng(SEED)

# Data Preparation
iris = load_iris()
X = iris.data
y = iris.target

# Preprocessing data
X = X[rng.permutation(len(X))]
y = y[rng.permutation(len(X))]

# Define the normalize funciton
scaler = MinMaxScaler(feature_range=(-1, 1))

# Training
som = SOMPlots(Dimensions)
som.init_w(X, norm_func=scaler.fit_transform)
som.train(X, Init_neighborhood, Epochs, Steps, norm_func=scaler.fit_transform)

# Define the directory path for saving the model outside the repository
model_dir = os.path.abspath(os.path.join(os.getcwd(), "..", "..", "..", "..", "Model"))
# Create the directory if it doesn't exist
if not os.path.exists(model_dir):
    os.makedirs(model_dir)
Trained_SOM_File = "SOM_Model_iris_Epoch_" + str(Epochs) + '_Seed_'  + str(SEED) + '_Size_' + str(SOM_Row_Num) + '.pkl'

# Save the model
som.save_pickle(Trained_SOM_File, model_dir + os.sep)

# Extract Cluster details
clust, dist, mdist, clustSize = som.cluster_data(X)

# Find quantization error
quant_err = som.quantization_error(dist)
print('Quantization error: ' + str(quant_err))

# Find topological error
top_error_1, top_error_1_2 =  som.topological_error(X)
print('Topological Error (1st neighbor) = ' + str(top_error_1) + '%')
print('Topological Error (1st and 2nd neighbor) = ' + str(top_error_1_2) + '%')

# Find Distortion Error
som.distortion_error(X)

# Visualization
# Data Preparation
data_dict = {
    "data": X,
    "target": y,
    "clust": clust,
}

# SOM Topology
fig1, ax1, patches1 = som.plot('top')
plt.show()

# SOM Topology with neruon numbers
fig2, ax2, pathces2, text2 = som.plot('top_num')
plt.show()

# Hit Histogram
fig3, ax3, patches3, text3 = som.plot('hit_hist', data_dict)
plt.show()

# Neighborhood Connection Map
fig4, ax4, patches4 = som.plot('neuron_connection')
plt.show()

# Distance Map
fig5, ax5, patches5 = som.plot('neuron_dist')
plt.show()

# Weight Position Plot
som.plot('component_positions', data_dict)

# Weight as Line
fig6, ax6, h_axes6 = som.plot('wgts')
plt.show()

# Weight as Image
fig7, ax7, patches7 = som.weight_as_image()
plt.show()

Total running time of the script: (0 minutes 12.360 seconds)

Gallery generated by Sphinx-Gallery