Python Forum
Transform 2d plot into 1d plot for som
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Transform 2d plot into 1d plot for som
#1
Hi everyone!
I'm trying to understand self-organising map neural network with Python. Here's a code:

import numpy as np
from numpy.ma.core import ceil
from scipy.spatial import distance
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
from matplotlib import animation, colors

data_file = "wine.data"
data_x = np.loadtxt(data_file, delimiter=",", skiprows=0, usecols=range(1,12), dtype=np.float64)
data_y = np.loadtxt(data_file, delimiter=",", skiprows=0, usecols=(0,), dtype=np.int64)


# train & test split
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2, random_state=42)
print(train_x.shape, train_y.shape, test_x.shape, test_y.shape)

# data normalisation
def minmax_scaler(data): 
    scaler = MinMaxScaler()
    scaled = scaler.fit_transform(data)
    return scaled

# euclidean distance
def e_distance(x, y): 
    return distance.euclidean(x,y)

# manhattan distance
def m_distance(x, y): 
    return distance.cityblock(x,y)

# best matching unit search
def winning_neuron(data, t, som, num_rows, num_cols): 
    winner = [0,0]
    shortest_distance = np.sqrt(data.shape[1])
    input_data = data[t]
    for row in range(num_rows): 
        for col in range(num_cols): 
            distance = e_distance(som[row][col], data[t])
            if distance < shortest_distance: 
                shortest_distance = distance
                winner = [row, col]
    return winner

# learning rate & neighbourhood range calculation
def decay(step, max_steps, max_learning_rate, max_m_distance): 
    coefficient = 1.0 - (np.float64(step)/max_steps)
    learning_rate = coefficient*max_learning_rate
    neighbourhood_range = ceil(coefficient * max_m_distance)
    return learning_rate, neighbourhood_range

num_rows = 10
num_cols = 10
max_m_distance = 4
max_learning_rate = 0.5
max_steps = int(7.5*10e3)

# main
train_x_norm = minmax_scaler(train_x)

# init smo
num_dims = train_x_norm.shape[1]
np.random.seed(40)
som = np.random.random_sample(size=(num_rows, num_cols, num_dims))

# start train
for step in range(max_steps):
    if (step+1) % 1000 == 0:
        print("Iteration: ", step+1)
    learning_rate, neighbourhood_range = decay(step, max_steps, max_learning_rate, max_m_distance)

    t = np.random.randint(0, high=train_x_norm.shape[0])
    winner = winning_neuron(train_x_norm, t, som, num_rows, num_cols)
    for row in range(num_rows): 
        for col in range(num_cols): 
            if m_distance([row, col], winner) <= neighbourhood_range: 
                som[row][col] += learning_rate * (train_x_norm[t] - som[row][col])
print("SOM training completed")

# collecting labels
label_data = train_y
map = np.empty(shape=(num_rows, num_cols), dtype=object)

for row in range(num_cols): 
    for col in range(num_cols): 
        map[row][col] = []

for t in range(train_x_norm.shape[0]): 
    if (t+1) % 1000 == 0: 
        print("sample data: ", t+1)
    winner = winning_neuron(train_x_norm, t, som, num_rows, num_cols)
    map[winner[0]][winner[1]].append(label_data[t])

# construct label map
label_map = np.zeros(shape=(num_rows, num_cols), dtype=np.int64)
for row in range(num_rows): 
    for col in range(num_cols): 
        label_list = map[row][col]
        if len(label_list) == 0: 
            label = 2
        else: 
            label = max(label_list, key=label_list.count)
        label_map[row][col] = label

title = ('Iteration '+ str(max_steps))
cmap = colors.ListedColormap(["tab:green", "tab:red", "tab:orange"])
plt.imshow(label_map, cmap=cmap)
plt.colorbar()
plt.title(title)
plt.show()

# test data
data = minmax_scaler(test_x)
winner_labels = []

for t in range(data.shape[0]):
    winner = winning_neuron(data, t, som, num_rows, num_cols)
    row = winner[0]
    col = winner[1]
    predicted = label_map[row][col]
    winner_labels.append(predicted)

print("accuracy: ", accuracy_score(test_y, np.array(winner_labels)))
I'm using Wine dataset. You can download it from here

What I need now is to show results in 1d plot, now I can view 2d plot, this is how it looks now
[Image: ORfBp.png]

And this is what I want to see (this is just an example how it should look like):
[Image: KxCB2.png]

Please help transform two-dimensional into one-dimensional results. Thank you!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Plot several graphs in one plot Ferdiss 1 219 Apr-11-2024, 08:37 PM
Last Post: deanhystad
  Plot function Sedos101 3 811 Aug-23-2023, 02:53 PM
Last Post: deanhystad
  [SOLVED] Looking for documentation on Reportlab's canvas.transform() function NeilUK 1 631 Aug-23-2023, 01:21 PM
Last Post: NeilUK
  Likert survey data plot error Andrzej_Andrzej 6 1,470 Jul-16-2023, 10:11 PM
Last Post: deanhystad
  Error when animating 3D plot Tee 4 985 Jul-03-2023, 08:49 PM
Last Post: Tee
  Plot multiple 2D Curves in 3D stc 5 1,027 Jun-11-2023, 05:48 PM
Last Post: snippsat
  Plot a pandas data fram via pyqtgraph with an modul import and qt designer widget Nietzsche 0 865 May-29-2023, 02:42 PM
Last Post: Nietzsche
  first time use plot - I get empty graph korenron 6 2,171 Feb-04-2023, 02:14 PM
Last Post: deanhystad
  Create simple live plot of stock data dram 2 2,951 Jan-27-2023, 04:34 AM
Last Post: CucumberNox
Thumbs Up Python 3 Jupyter notebook ternary plot data nicholas 0 965 Jan-21-2023, 05:01 PM
Last Post: nicholas

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020