Module 01: Math Foundations + Classical ML

Outcomes

  • Explain core linear algebra, probability, and calculus concepts with interview relevance.
  • Derive and compare linear vs logistic regression, including regularization tradeoffs.
  • Implement linear/logistic regression from scratch and choose appropriate evaluation metrics.

Math Resources (Watch in Order)

Linear Algebra (Week 1, 3-4 hours total):

  1. 3Blue1Brown: Essence of Linear Algebra

Probability & Statistics (Week 1, 3-4 hours total):

  1. StatQuest: Probability Fundamentals

Calculus for ML (Week 1, 2 hours):

  1. 3Blue1Brown: Essence of Calculus

Classical ML (Week 2)

Linear Regression:

Logistic Regression:

Regularization:

Decision Trees & Ensemble:

SVM:

Evaluation Metrics:

Hands-On Implementation

Do these in Jupyter notebooks:

# 1. Linear Regression from Scratch
import numpy as np

class LinearRegression:
    def __init__(self, lr=0.01, n_iters=1000):
        self.lr = lr
        self.n_iters = n_iters
        self.weights = None
        self.bias = None
    
    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.weights = np.zeros(n_features)
        self.bias = 0
        
        for _ in range(self.n_iters):
            y_pred = np.dot(X, self.weights) + self.bias
            
            dw = (1/n_samples) * np.dot(X.T, (y_pred - y))
            db = (1/n_samples) * np.sum(y_pred - y)
            
            self.weights -= self.lr * dw
            self.bias -= self.lr * db
    
    def predict(self, X):
        return np.dot(X, self.weights) + self.bias

# 2. Logistic Regression from Scratch
class LogisticRegression:
    def __init__(self, lr=0.01, n_iters=1000):
        self.lr = lr
        self.n_iters = n_iters
        self.weights = None
        self.bias = None
    
    def sigmoid(self, z):
        return 1 / (1 + np.exp(-np.clip(z, -500, 500)))
    
    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.weights = np.zeros(n_features)
        self.bias = 0
        
        for _ in range(self.n_iters):
            z = np.dot(X, self.weights) + self.bias
            y_pred = self.sigmoid(z)
            
            dw = (1/n_samples) * np.dot(X.T, (y_pred - y))
            db = (1/n_samples) * np.sum(y_pred - y)
            
            self.weights -= self.lr * dw
            self.bias -= self.lr * db
    
    def predict(self, X):
        z = np.dot(X, self.weights) + self.bias
        return (self.sigmoid(z) >= 0.5).astype(int)

Interview checkpoints

  • Derive the gradient descent update for linear and logistic regression.
  • Explain bias/variance tradeoffs and when to use L1 vs L2.
  • Pick AUC vs F1 vs accuracy for an imbalanced dataset.

Comments

Share your approach or ask questions

0 comments
?
|
Markdown supported
Sign in to post

Loading comments...