Skip to main content

Command Palette

Search for a command to run...

ML: Simple Model

A very simple model explaining a linear equation, y = mx + b

Updated
3 min read
ML: Simple Model
N

Hi there! I'm a software professional with over 13 years of experience in developing software products. My passion lies in web development, and I specialize in using React to create engaging and user-friendly websites. Recently, I've embarked on an exciting journey into the world of machine learning, eager to explore its endless possibilities. Join me as I share my experiences, insights, and discoveries through my blog, where we can dive into the fascinating realm of software development, web development with React, and the exciting field of machine learning. Let's learn and grow together!

In the previous article, ML: Simple Math, we discussed the linear equation -

y = mx + b
where - 
m = slope
b = y-intercept (point at which the line intersects the Y-axis)

By convention in ML, the equation is written as -

y = b + wx
where - 
y = label (output)
x = feature (input)
w = weight (the slope, m)
b = bias (the y-intercept)

Reconsider the previous example. We calculated the slope m and the y-intercept b as m = -1 and b = 5.

(0, 5)
(2, 3)
(6, -1)
(4, ?)

We were able to simply substitute a few given values and find m and b. For complex data with multiple features (inputs) it is very difficult to find the weights and biases. A model needs to be trained extensively to compute the weights and biases.

Time to look at the actual code.

Imports.

import torch
import torch.nn as nn
import torch.optim as optim
import copy
import numpy as np

Define training data based on given inputs.

# Training data i.e. given points (0, 5), (2, 3), (6, -1)
X_train = torch.tensor([0.0, 2.0,  6.0])
y_train = torch.tensor([5.0, 3.0, -1.0])

Get a few more points on the graph as test data to verify the model's predictions.

# Test data (5, 0), (1, 4), (3, 2)
X_test = torch.tensor([ 5.0, 1.0, 3.0])
y_test = torch.tensor([0.0, 4.0, 2.0])

Define a simple model.

# Defining the linear equation with 2 variables i.e. 1 input 
# and 1 output

# y = b + wx
model = nn.Linear(1, 1)

The next step is to find slope m (weight w) and b the y-intercept (bias). You can ignore all the complexities in the below function for now and understand that its job is to find weight and bias.

Here we train the model with the given input and compute the weight w and bias b.

def find_weight_and_bias():
  loss_fn = nn.MSELoss()
  optimizer = optim.Adam(model.parameters(), lr=0.02)
  n_epochs = 1000
  batch_size = 1
  batch_start = torch.arange(0, len(X_train), batch_size)

  best_mse = np.inf 
  best_weights = None
  history = []

  for epoch in range(n_epochs):
    model.train()
    for start in batch_start:
      X_batch = X_train[start:start+batch_size]
      y_batch = y_train[start:start+batch_size]

      y_pred = model(torch.reshape(X_batch, (-1, 1)))

      loss = loss_fn(y_pred, torch.reshape(y_batch, (-1, 1)))
      optimizer.zero_grad()
      loss.backward()
      optimizer.step()

    model.eval()
    y_pred = model(torch.reshape(X_test, (-1, 1)))
    mse = loss_fn(y_pred, torch.reshape(y_test, (-1, 1)))
    mse = float(mse)
    history.append(mse)
    if mse < best_mse:
      best_mse = mse
      best_weights = copy.deepcopy(model.state_dict())

  return best_weights

Now, let's find weight and bias.

# Find weight and bias
weight_and_bias = find_weight_and_bias();
print(f'Weight and Bias: {weight_and_bias}')

Predicting the value for x = 4 -

# Substitute values of w and b in y = b + wx
model.load_state_dict(weight_and_bias)

# Predict the value for x = 4
y = model(torch.tensor([4.0]))
print(f'Predicting value, x = 4')
print(f'y: {y}')

Output -

Weight and Bias: 
OrderedDict([('weight', tensor([[-1.0000]])), ('bias', tensor([5.0000]))])
Predicting value, x = 4
y: tensor([1.0000], grad_fn=<AddBackward0>)

Observe that w = -1, b = 5and the value of y for x = 4 is 1.

See all the code in the colab here.

H

Hi Niranjan Borawake, unrelated to the blog post, please how do you add a caption to credit image source to your cover image. I could not figure out how to do that on hashnode. Thanks

N

I actually use the image from Unsplash, hashnode has a direct integration with Unsplash. The captain is automatically added by hashnode.