Bỏ qua

Suy luận Thống kê

Suy luận thống kê đi xa hơn các quyết định có/không để ước lượng các tham số tổng thể với sự không chắc chắn được định lượng. Tài liệu này bao quát khoảng tin cậy, ước lượng điểm và khoảng, ước lượng hợp lý cực đại, phương pháp moment, và phân tích hồi quy — cây cầu nối giữa dữ liệu thô và các mô hình dự đoán trong học máy.

  • Kiểm định giả thuyết cho ta một quyết định có/không: bác bỏ hoặc không bác bỏ. Nhưng thường bạn muốn một thứ có nhiều thông tin hơn — một khoảng các giá trị hợp lý cho tham số bạn đang ước lượng. Đó là những gì khoảng tin cậy (confidence intervals) cung cấp.

  • Ước lượng điểm (point estimate) là một con số duy nhất được tính từ mẫu của bạn, như trung bình mẫu \(\bar{x}\). Nó là dự đoán tốt nhất của bạn cho tham số tổng thể, nhưng tự nó không cho biết độ chính xác của ước lượng.

  • Khoảng tin cậy (confidence interval) bao bọc ước lượng điểm đó bằng một khoảng phản ánh sự không chắc chắn. Nó có dạng:

\[\text{CI} = \bar{x} \pm \text{ME}\]
  • Sai số biên (ME) (margin of error) phụ thuộc vào ba điều: bạn muốn tự tin đến mức nào, dữ liệu có bao nhiêu biến thiên, và mẫu của bạn lớn thế nào:
\[\text{ME} = z^\ast \cdot \frac{\sigma}{\sqrt{n}}\]
  • Ở đây \(z^\ast\) là giá trị tới hạn từ phân bố chuẩn tương ứng với mức tin cậy bạn mong muốn. Với tin cậy 95%, \(z^\ast = 1.96\). Với tin cậy 99%, \(z^\ast = 2.576\).

Khoảng tin cậy: ước lượng điểm với sai số biên ở mỗi bên

  • Khoảng tin cậy 95% nghĩa là: nếu bạn lặp lại thí nghiệm nhiều lần và xây dựng một khoảng mỗi lần, khoảng 95% trong số các khoảng đó sẽ chứa tham số tổng thể thực. Nó không có nghĩa là có xác suất 95% tham số nằm trong khoảng cụ thể này. Tham số là cố định; các khoảng mới là thứ thay đổi.

  • Ví dụ đã làm: Bạn đo chiều cao của 50 người và tìm thấy \(\bar{x} = 170\) cm với \(\sigma = 8\) cm. Xây dựng khoảng tin cậy 95%.

\[\text{ME} = 1.96 \cdot \frac{8}{\sqrt{50}} = 1.96 \cdot 1.131 = 2.22 \text{ cm}\]
\[\text{CI} = [170 - 2.22, \; 170 + 2.22] = [167.78, \; 172.22]\]
  • Bạn có thể nói với độ tin cậy 95% rằng chiều cao trung bình thực nằm giữa 167.78 và 172.22 cm.

  • Khi \(\sigma\) không biết (trường hợp thông thường), dùng độ lệch chuẩn mẫu \(s\) và phân bố t thay vào:

\[\text{CI} = \bar{x} \pm t^\ast_{n-1} \cdot \frac{s}{\sqrt{n}}\]
  • Khoảng rộng hơn thì đáng tin cậy hơn nhưng kém chính xác hơn. Khoảng hẹp hơn thì chính xác hơn nhưng kém tin cậy hơn. Bạn có thể thu hẹp khoảng mà không mất độ tin cậy bằng cách tăng kích thước mẫu.

  • Phân tích lực kiểm định (power analysis) giúp bạn lập kế hoạch một thí nghiệm trước khi chạy nó. Câu hỏi là: tôi cần mẫu lớn thế nào để phát hiện một hiệu ứng có kích thước cho trước với lực kiểm định xác định?

  • Nhắc lại từ tài liệu trước rằng lực kiểm định = \(1 - \beta\), xác suất bác bỏ đúng một \(H_0\) sai. Một mục tiêu phổ biến là lực kiểm định 80%.

  • Kích thước mẫu cần thiết cho kiểm định z phát hiện một khác biệt \(\delta\) với mức ý nghĩa \(\alpha\) và lực kiểm định \(1-\beta\) là:

\[n = \left(\frac{(z_{\alpha/2} + z_{\beta}) \cdot \sigma}{\delta}\right)^2\]
  • Ví dụ, để phát hiện khác biệt 2 cm về chiều cao trung bình (\(\sigma = 8\)) với \(\alpha = 0.05\) và lực kiểm định 80% (\(z_{0.025} = 1.96\), \(z_{0.20} = 0.84\)):
\[n = \left(\frac{(1.96 + 0.84) \cdot 8}{2}\right)^2 = \left(\frac{22.4}{2}\right)^2 = 11.2^2 \approx 126\]
  • Bạn sẽ cần khoảng 126 người mỗi nhóm.

  • Phân tích lực kiểm định ngăn ngừa hai sai lầm phổ biến: chạy một thí nghiệm quá nhỏ để phát hiện hiệu ứng thực (thiếu lực - underpowered), hoặc lãng phí tài nguyên vào một thí nghiệm lớn hơn nhiều so với cần thiết (thừa lực - overpowered).

  • Phương pháp Monte Carlo dùng lấy mẫu ngẫu nhiên để giải các bài toán khó hoặc không thể giải được bằng phương pháp giải tích. Ý tưởng cốt lõi: nếu bạn không thể tính một thứ gì đó một cách chính xác, hãy mô phỏng nó nhiều lần và dùng các kết quả làm xấp xỉ.

  • Cái tên đến từ sòng bạc Monte Carlo, như một cái gật đầu với vai trò của tính ngẫu nhiên. Các phương pháp này là công cụ chủ lực trong ML cho các tác vụ như ước lượng tích phân, đánh giá độ không chắc chắn của mô hình, và xấp xỉ các phân bố phức tạp.

  • Công thức Monte Carlo tổng quát:

    • Định nghĩa một miền các đầu vào có thể
    • Sinh các đầu vào ngẫu nhiên từ miền đó
    • Đánh giá một hàm trên mỗi đầu vào
    • Tổng hợp các kết quả (trung bình, đếm, v.v.)
  • Một ví dụ kinh điển là ước lượng \(\pi\). Hãy tưởng tượng một hình vuông cạnh dài 2, tâm tại gốc tọa độ, với một hình tròn bán kính 1 được nội tiếp bên trong. Diện tích hình vuông là 4, và diện tích hình tròn là \(\pi\).

Hình vuông với hình tròn nội tiếp, các điểm ngẫu nhiên được tô màu theo trong/ngoài

  • Thả các điểm ngẫu nhiên đều vào trong hình vuông. Tỷ lệ các điểm rơi vào trong hình tròn xấp xỉ \(\pi/4\):
\[\pi \approx 4 \times \frac{\text{số điểm trong hình tròn}}{\text{tổng số điểm}}\]
  • Một điểm \((x, y)\) nằm trong hình tròn nếu \(x^2 + y^2 \le 1\). Càng thả nhiều điểm, ước lượng của bạn càng gần với giá trị thực của \(\pi\).

  • Trong ML, các phương pháp Monte Carlo xuất hiện ở:

    • Monte Carlo dropout: chạy suy luận nhiều lần với dropout được kích hoạt để ước lượng độ không chắc chắn dự đoán
    • MCMC (Markov Chain Monte Carlo): lấy mẫu từ các phân bố hậu nghiệm phức tạp trong các mô hình Bayes
    • Phương pháp Policy Gradient: ước lượng gradient trong học tăng cường bằng cách lấy mẫu quỹ đạo
  • Phân tích nhân tố (factor analysis) là một kỹ thuật để khám phá các biến ẩn (latent) giải thích các tương quan giữa các biến quan sát được. Nếu 10 câu hỏi khảo sát tính cách có thể được giải thích bởi 3 đặc điểm tiềm ẩn (hướng ngoại, dễ chịu, tận tâm), phân tích nhân tố sẽ tìm ra các đặc điểm đó.

  • Mô hình giả định mỗi biến quan sát \(x_i\) là một tổ hợp tuyến tính của một vài nhân tố tiềm ẩn \(f_j\) cộng với nhiễu:

\[x_i = \lambda_{i1} f_1 + \lambda_{i2} f_2 + \ldots + \lambda_{ik} f_k + \epsilon_i\]
  • Các giá trị \(\lambda\) được gọi là hệ số tải nhân tố (factor loadings) và cho bạn biết mỗi biến quan sát liên quan mạnh thế nào đến mỗi nhân tố. Điều này kết nối trực tiếp đến các phân rã ma trận từ Chương 2; phân tích nhân tố có liên hệ chặt chẽ với phân rã trị riêng và SVD.

  • Thiết kế thí nghiệm (experimental design) là nghệ thuật cấu trúc một thí nghiệm sao cho bạn có thể rút ra các kết luận hợp lệ. Thiết kế kém có thể làm hỏng ngay cả một tập dữ liệu lớn.

  • Các thành phần chính của một thí nghiệm được thiết kế tốt:

    • Biến độc lập (IV) (independent variable): thứ bạn thao tác (vd. liều thuốc, kiến trúc mô hình)
    • Biến phụ thuộc (DV) (dependent variable): thứ bạn đo (vd. thời gian hồi phục, độ chính xác)
    • Nhóm đối chứng (control group): không nhận điều trị (hoặc nhận giả dược), cung cấp đường cơ sở để so sánh
    • Phân bổ ngẫu nhiên (random assignment): các người tham gia được gán vào các nhóm một cách ngẫu nhiên, giúp cân bằng các biến gây nhiễu mà bạn không đo đạc
  • Các thiết kế thí nghiệm phổ biến:

    • Thiết kế hoàn toàn ngẫu nhiên: các đối tượng được gán ngẫu nhiên vào các nhóm điều trị. Đơn giản và hiệu quả khi các nhóm có thể so sánh được.
    • Thiết kế khối ngẫu nhiên: các đối tượng trước tiên được nhóm thành các khối (vd. theo độ tuổi), sau đó được gán ngẫu nhiên vào các điều trị trong mỗi khối. Điều này giảm biến thiên từ nhân tố tạo khối, tương tự về tinh thần với lấy mẫu phân tầng.
    • Thiết kế giai thừa (factorial design): kiểm tra nhiều IV đồng thời. Một thiết kế giai thừa \(2 \times 3\) có 2 mức của một biến và 3 mức của biến khác, cho 6 tổ hợp điều trị. Điều này cho phép bạn phát hiện các tương tác (interactions), nơi hiệu ứng của một biến phụ thuộc vào mức của biến khác.
    • Thiết kế chéo (crossover design): mỗi đối tượng nhận tất cả các điều trị theo trình tự (với các giai đoạn rửa trôi ở giữa). Mọi đối tượng đều tự làm đối chứng cho chính mình, giảm ảnh hưởng của khác biệt cá nhân.
  • Trong các thí nghiệm ML, những nguyên tắc này rất quan trọng. Khi so sánh các mô hình, bạn nên kiểm soát hạt giống ngẫu nhiên, tập dữ liệu chia, và phần cứng. Xác thực chéo (cross-validation) là một dạng của thiết kế chéo. Các nghiên cứu cắt bỏ (ablation studies), nơi bạn loại bỏ một thành phần tại một thời điểm, tuân theo logic của các thiết kế giai thừa.

Bài tập lập trình (dùng CoLab hoặc notebook)

  1. Xây dựng khoảng tin cậy 95% cho ví dụ chiều cao, sau đó thử nghiệm với các mức tin cậy và kích thước mẫu khác nhau.

    import jax.numpy as jnp
    
    x_bar = 170.0    # sample mean
    sigma = 8.0      # population std (known)
    n = 50           # sample size
    
    # Critical values for common confidence levels
    z_stars = {0.90: 1.645, 0.95: 1.960, 0.99: 2.576}
    
    for conf, z_star in z_stars.items():
        me = z_star * (sigma / jnp.sqrt(n))
        lower, upper = x_bar - me, x_bar + me
        print(f"{conf*100:.0f}% CI: [{lower:.2f}, {upper:.2f}]  (ME = {me:.2f})")
    

  2. Ước lượng \(\pi\) bằng mô phỏng Monte Carlo. Vẽ đồ thị cách ước lượng hội tụ khi bạn tăng số lượng điểm.

    import jax
    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    key = jax.random.PRNGKey(42)
    
    # Generate random points in [-1, 1] x [-1, 1]
    n_points = 100_000
    k1, k2 = jax.random.split(key)
    x = jax.random.uniform(k1, shape=(n_points,), minval=-1, maxval=1)
    y = jax.random.uniform(k2, shape=(n_points,), minval=-1, maxval=1)
    
    # Check which points are inside the unit circle
    inside = (x**2 + y**2) <= 1.0
    cumulative_inside = jnp.cumsum(inside)
    counts = jnp.arange(1, n_points + 1)
    pi_estimates = 4.0 * cumulative_inside / counts
    
    plt.figure(figsize=(10, 4))
    plt.plot(pi_estimates, color="#3498db", alpha=0.7, linewidth=0.5)
    plt.axhline(y=jnp.pi, color="#e74c3c", linestyle="--", label=f"π = {jnp.pi:.6f}")
    plt.xlabel("Number of points")
    plt.ylabel("Estimate of π")
    plt.title("Monte Carlo estimation of π")
    plt.legend()
    plt.ylim(2.8, 3.5)
    plt.show()
    
    print(f"Final estimate: {pi_estimates[-1]:.6f}")
    print(f"True value:     {jnp.pi:.6f}")
    print(f"Error:          {abs(pi_estimates[-1] - jnp.pi):.6f}")
    

  3. Thực hiện một phân tích lực kiểm định đơn giản: với một kích thước hiệu ứng và độ lệch chuẩn cho trước, tính kích thước mẫu cần thiết và kiểm tra nó bằng mô phỏng.

    import jax
    import jax.numpy as jnp
    
    # Parameters
    delta = 2.0      # effect size (difference in means)
    sigma = 8.0      # population std
    alpha = 0.05
    power_target = 0.80
    
    # Analytical sample size
    z_alpha = 1.96   # two-tailed, alpha=0.05
    z_beta = 0.84    # power=0.80
    n_required = ((z_alpha + z_beta) * sigma / delta) ** 2
    print(f"Required n per group: {n_required:.0f}")
    
    # Verify by simulation
    key = jax.random.PRNGKey(7)
    n = int(jnp.ceil(n_required))
    n_sims = 5000
    rejections = 0
    
    for _ in range(n_sims):
        key, k1, k2 = jax.random.split(key, 3)
        group_a = jax.random.normal(k1, shape=(n,)) * sigma + 50
        group_b = jax.random.normal(k2, shape=(n,)) * sigma + 50 + delta
        pooled_se = jnp.sqrt(2 * sigma**2 / n)
        z = (group_b.mean() - group_a.mean()) / pooled_se
        p = 2 * (1 - __import__("jax").scipy.stats.norm.cdf(jnp.abs(z)))
        if p <= alpha:
            rejections += 1
    
    print(f"Simulated power: {rejections/n_sims:.3f}")
    print(f"Target power:    {power_target:.3f}")
    

  4. Trực quan hóa độ rộng khoảng tin cậy thay đổi thế nào với kích thước mẫu. Điều này chỉ ra lý do thu thập nhiều dữ liệu hơn cho các ước lượng chính xác hơn.

    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    sigma = 8.0
    z_star = 1.96  # 95% confidence
    
    sample_sizes = jnp.array([10, 20, 30, 50, 100, 200, 500, 1000], dtype=jnp.float32)
    margins = z_star * sigma / jnp.sqrt(sample_sizes)
    
    plt.figure(figsize=(8, 4))
    plt.bar([str(int(n)) for n in sample_sizes], margins, color="#3498db", alpha=0.7)
    plt.xlabel("Sample size")
    plt.ylabel("Margin of error (cm)")
    plt.title("95% CI margin of error shrinks with larger samples")
    plt.show()