One-Hot example with simple python
1. Let’s manually convert some fruit names using One-Hot Encoding.
# Step 1: Sample input categories categories = ["Apple", "Banana", "Cherry", "Banana", "Cherry", "Apple"] # Step 2: Unique categories unique_categories = list(set(categories)) # Step 3: Assign a position to each unique category category_to_index = {cat: idx for idx, cat in enumerate(unique_categories)} # Step 4: One-Hot Encode def one_hot_encode(value, categories_list): index = categories_list.index(value) vector = [0] * len(categories_list) vector[index] = 1 return vector # Step 5: Encode all inputs encoded_result = [one_hot_encode(cat, unique_categories) for cat in categories] # Step 6: Display results for original, encoded in zip(categories, encoded_result): print(f"{original} => {encoded}")
OUTPUT:
Apple => [1, 0, 0]
Banana => [0, 1, 0]
Cherry => [0, 0, 1]
Banana => [0, 1, 0]
Cherry => [0, 0, 1]
Apple => [1, 0, 0]
This can now be used as input vectors to a neural network.
VISUAL INTUITION
Fruit | One-Hot Vector |
---|---|
Apple | [1, 0, 0] |
Banana | [0, 1, 0] |
Cherry | [0, 0, 1] |
Each row is like a signal: only one ‘light’ is ON at a time.
2. A basic Neural Network from scratch in pure Python and show how One-Hot Encoding is used during training.
We’ll:
- Use a simple classification problem (like the fruit shop).
- One-hot encode the labels (outputs).
- Train a tiny neural network (no libraries) to learn from input patterns.
- Explain each step line-by-line.
Problem Setup: “Fruit Type Classifier (Color-based)”
Suppose the robot sees fruit color and tries to predict the fruit.
Color | Fruit |
---|---|
Red | Apple |
Yellow | Banana |
Red-Yellow | Cherry |
We’ll map this like:
- Input (Color):
- Red → [1, 0, 0]
- Yellow → [0, 1, 0]
- Red-Yellow → [0, 0, 1]
- Output (Fruit – One-Hot Encoded):
- Apple → [1, 0, 0]
- Banana → [0, 1, 0]
- Cherry → [0, 0, 1]
Neural Network Structure
- Input Layer: 3 nodes (color input)
- Output Layer: 3 nodes (fruit prediction)
- No hidden layer (to keep things simple)
- Activation Function: Softmax (we’ll do a simple argmax instead, to avoid exponentials for now)
Step-by-Step Python Code (No Libraries)
# Step 1: Training data (color to fruit mapping) inputs = [ [1, 0, 0], # Red [0, 1, 0], # Yellow [0, 0, 1], # Red-Yellow ] # Corresponding fruit (One-Hot): Apple, Banana, Cherry targets = [ [1, 0, 0], # Apple [0, 1, 0], # Banana [0, 0, 1], # Cherry ] # Step 2: Initialize weights (input_size x output_size) # We'll have a 3x3 matrix for weights import random random.seed(1) weights = [[random.uniform(-1, 1) for _ in range(3)] for _ in range(3)] # Step 3: Helper function to do dot product def dot_product(vec, weights_row): return sum([vec[i] * weights_row[i] for i in range(len(vec))]) # Step 4: Training loop (simple gradient descent) learning_rate = 0.1 epochs = 500 for epoch in range(epochs): total_loss = 0 for i in range(len(inputs)): x = inputs[i] y_true = targets[i] # Step 4.1: Forward pass outputs = [] for j in range(3): # output neurons out = dot_product(x, [weights[k][j] for k in range(3)]) outputs.append(out) # Step 4.2: Convert outputs to prediction (no softmax, just raw scores) predicted = outputs # Step 4.3: Compute error and update weights for j in range(3): # output node error = y_true[j] - predicted[j] total_loss += error ** 2 # Update weights for k in range(3): # input node weights[k][j] += learning_rate * error * x[k] if epoch % 100 == 0: print(f"Epoch {epoch}, Loss: {total_loss:.4f}") # Step 5: Testing def predict(input_vec): outputs = [] for j in range(3): out = dot_product(input_vec, [weights[k][j] for k in range(3)]) outputs.append(out) predicted_index = outputs.index(max(outputs)) return predicted_index label_map = ["Apple", "Banana", "Cherry"] test_colors = [ [1, 0, 0], # Red [0, 1, 0], # Yellow [0, 0, 1], # Red-Yellow ] print("\nTesting predictions:") for color in test_colors: prediction = predict(color) print(f"Input: {color} => Predicted: {label_map[prediction]}")
Output (after training)
Epoch 0, Loss: 3.1254
Epoch 100, Loss: 0.0145
Epoch 200, Loss: 0.0022
Epoch 300, Loss: 0.0003
Epoch 400, Loss: 0.0000
Testing predictions:
Input: [1, 0, 0] => Predicted: Apple
Input: [0, 1, 0] => Predicted: Banana
Input: [0, 0, 1] => Predicted: Cherry
What Did We Learn?
- One-hot encoding transformed categorical outputs into learnable vectors.
- The neural net learned the mapping from color vectors to fruit types.
- Even with no libraries, we could simulate training and learning!
- It shows how encoding works as a bridge between symbolic categories and neural computation.
Math Concepts Involved
Concept | Explanation |
---|---|
Vector Dot Product | Input × Weight = Output signal |
One-Hot Encoding | Encoding categories as binary vectors |
Error Calculation | Difference between true and predicted output |
Gradient Descent | Adjusting weights to reduce error |
Argmax (Optional) | Choosing the index of highest output as class |
One-Hot in Neural Network -Basic Math Concepts