Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

research_judgment.py

55_research_papers_and_mock_interviews/research_judgment.py  ·  104 lines  ·  view on GitHub

"""
Research interview helpers:
- compare experiments
- decide which distribution a new value likely came from
"""
from typing import Dict, Tuple

import numpy as np
from scipy import stats


def compare_experiments(
    baseline_scores: np.ndarray, candidate_scores: np.ndarray
) -> Dict[str, float]:
    """
    Simple paired experiment summary.
    """
    deltas = candidate_scores - baseline_scores
    return {
        "baseline_mean": float(np.mean(baseline_scores)),
        "candidate_mean": float(np.mean(candidate_scores)),
        "delta_mean": float(np.mean(deltas)),
        "delta_std": float(np.std(deltas, ddof=1)) if len(deltas) > 1 else 0.0,
        "candidate_wins_fraction": float(np.mean(candidate_scores > baseline_scores)),
    }


def classify_value_gaussian_bayes(
    x: float,
    dist1_samples: np.ndarray,
    dist2_samples: np.ndarray,
    prior1: float = 0.5,
    prior2: float = 0.5,
) -> Dict[str, float]:
    """
    Bayes classifier under Gaussian assumptions.

    Returns posterior-like normalized scores and predicted class.
    """
    mu1, sigma1 = float(np.mean(dist1_samples)), float(np.std(dist1_samples, ddof=0))
    mu2, sigma2 = float(np.mean(dist2_samples)), float(np.std(dist2_samples, ddof=0))

    sigma1 = max(sigma1, 1e-6)
    sigma2 = max(sigma2, 1e-6)

    score1 = stats.norm.pdf(x, loc=mu1, scale=sigma1) * prior1
    score2 = stats.norm.pdf(x, loc=mu2, scale=sigma2) * prior2
    total = score1 + score2
    posterior1 = score1 / total
    posterior2 = score2 / total

    return {
        "mu1": mu1,
        "sigma1": sigma1,
        "mu2": mu2,
        "sigma2": sigma2,
        "posterior1": float(posterior1),
        "posterior2": float(posterior2),
        "predicted_class": 1.0 if posterior1 >= posterior2 else 2.0,
    }


def classify_value_kde(
    x: float,
    dist1_samples: np.ndarray,
    dist2_samples: np.ndarray,
    prior1: float = 0.5,
    prior2: float = 0.5,
) -> Dict[str, float]:
    """
    Nonparametric 1D density comparison using KDE.
    Useful when Gaussian assumptions are weak.
    """
    kde1 = stats.gaussian_kde(dist1_samples)
    kde2 = stats.gaussian_kde(dist2_samples)
    score1 = float(kde1(x)[0]) * prior1
    score2 = float(kde2(x)[0]) * prior2
    total = score1 + score2
    posterior1 = score1 / total
    posterior2 = score2 / total
    return {
        "posterior1": float(posterior1),
        "posterior2": float(posterior2),
        "predicted_class": 1.0 if posterior1 >= posterior2 else 2.0,
    }


if __name__ == "__main__":
    print("Research Judgment and Mock Interview Helpers")
    print("=" * 60)

    baseline = np.array([0.71, 0.72, 0.70, 0.73])
    candidate = np.array([0.74, 0.73, 0.71, 0.75])
    print("Experiment comparison:")
    print(compare_experiments(baseline, candidate))

    np.random.seed(42)
    dist1 = np.random.normal(loc=0.0, scale=1.0, size=400)
    dist2 = np.random.normal(loc=3.0, scale=1.2, size=400)
    x = 1.4
    print("\nGaussian Bayes classification:")
    print(classify_value_gaussian_bayes(x, dist1, dist2))
    print("\nKDE classification:")
    print(classify_value_kde(x, dist1, dist2))