Chương 2·Bài 2.1

Linear regression

Bài 1Dự đoán

Robot cân đồ chơi bằng một mô hình tuyến tính đã học sẵn. Mỗi món đồ chơi có dd feature, và khối lượng dự đoán là

y^i=∑jXij wj+b.\hat y_i = \sum_{j} X_{ij}\,w_j + b.

Cho bảng XX, vector trọng số ww và hệ số tự do bb, hãy tính dự đoán cho từng món. Với NumPy, chỉ cần một phép nhân ma trận với vector rồi cộng bb.

Dữ liệu vào

Mỗi tệp input.json gồm X (ma trận n×dn\times d), w (dd số) và b.

Kết quả

Một đối tượng JSON {"predictions": [...]} gồm nn dự đoán theo thứ tự hàng.

Giới hạn

  • 1≤n≤201\le n\le20, 1≤d≤41\le d\le4.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{"X": [[3]], "w": [-0.4608150955572951], "b": 1.7755447707971468}

Output mẫu

{"predictions": [0.3930994841252615]}

Bài 2Gradient descent

Robot học chỉnh tay lái bằng gradient descent. Mô hình có hai trọng số và một hệ số tự do, loss là MSE:

J(w,b)=1n∑i=1n(Xiw+b−yi)2.J(w,b)=\frac1n\sum_{i=1}^{n}\left(X_iw+b-y_i\right)^2.

Bắt đầu từ w=(0,0)w=(0,0), b=0b=0, chạy đúng steps bước với tốc độ học learning_rate. Ở mỗi bước:

  1. Tính sai số ri=Xiw+b−yir_i = X_iw+b-y_i và ghi lại loss trước khi cập nhật.
  2. Tính gradient ∂J∂w=2nX⊤r\frac{\partial J}{\partial w}=\frac2n X^\top r và ∂J∂b=2n∑iri\frac{\partial J}{\partial b}=\frac2n\sum_i r_i, cả hai đều từ tham số cũ.
  3. Cập nhật đồng thời ww và bb.

Dữ liệu vào

Mỗi tệp input.json gồm X (ma trận n×2n\times2), y, learning_rate, steps.

Kết quả

Một đối tượng JSON gồm loss_history (steps giá trị loss), weights (hai trọng số sau bước cuối) và bias.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Bài 3Bậc hai

Nhiệt độ của chiếc lò nhỏ thay đổi theo một đường cong. Đường cong vẫn học được bằng hồi quy tuyến tính, chỉ cần thêm cột x2x^2: mô hình y^=w1x+w2x2+b\hat y = w_1x + w_2x^2 + b vẫn tuyến tính theo các trọng số.

Dựng pipeline PolynomialFeatures(degree=2, include_bias=False) rồi LinearRegression(), học trên train.csv và dự đoán cho test.csv. Đặt include_bias=False vì LinearRegression đã tự có hệ số tự do.

Dữ liệu vào

Mỗi thư mục test có train.csv (cột x, label) và test.csv (cột x).

Kết quả

Một đối tượng JSON gồm predictions (theo thứ tự hàng của test), weights (hai trọng số của xx và x2x^2) và bias.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Bài 4Gradient MSE

Đây là một câu trong đề thi USA-NA-AIO. Viết hàm my_fun_derivative(X, y, theta) nhận mảng NumPy X shape (N,d)(N, d), y shape (N,)(N,) và theta shape (d,)(d,), rồi trả về gradient theo θ\theta của

1N∑n=0N−1(yn−θ⊤Xn)2,\frac1N\sum_{n=0}^{N-1}\left(y_n-\theta^\top X_n\right)^2,

dưới dạng mảng shape (d,)(d,).

Đề gốc có luật chơi chặt. Trong hàm không được dùng vòng lặp, không được dùng @, .T hay bất cứ thứ gì trong np.linalg, và không thêm import. Hãy làm bằng phép nhân từng phần tử, broadcasting và np.sum, np.mean với axis.

Bộ kit có sẵn khung hàm. Hàm solve gọi my_fun_derivative và ghi kết quả ra tệp.

Dữ liệu vào

Mỗi tệp input.json gồm X, y, theta.

Kết quả

Một đối tượng JSON {"gradient": [...]} gồm dd số.

Giới hạn

  • 1≤N≤161\le N\le16, 1≤d≤41\le d\le4.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}. Giáo viên xem code để kiểm luật không vòng lặp.

Ví dụ

Input mẫu

{
  "X": [[-0.2568641432313081]],
  "y": [-0.4608150955572951],
  "theta": [1.7755447707971468]
}

Output mẫu

{"gradient": [-0.0024357446702507773]}

Bài 5Parabol

Gradient descent tìm cực tiểu của f(x)=ax2f(x)=ax^2, với a>0a>0. Bắt đầu từ x0x_0, mỗi bước đi ngược hướng đạo hàm:

xt+1=xt−η f′(xt)=xt−2aη xt.x_{t+1}=x_t-\eta\,f'(x_t)=x_t-2a\eta\,x_t.

Cực tiểu nằm ở x=0x=0, nhưng gradient descent có đến được đó hay không còn tùy bước học η\eta. Hãy chạy đúng steps bước, ghi lại xtx_t, f(xt)f(x_t) và f′(xt)f'(x_t) từ t=0t=0, rồi cho biết dãy xtx_t thuộc loại nào:

  • "converge" nếu dãy tiến dần về 00,
  • "oscillate" nếu dãy nhảy qua lại giữa hai giá trị mãi không đổi,
  • "diverge" nếu dãy ngày càng xa 00.

Gợi ý: viết xt+1x_{t+1} theo dạng một số nhân với xtx_t.

Dữ liệu vào

Một đối tượng JSON gồm a, x0, eta và steps.

Kết quả

Một đối tượng JSON gồm x, f, grad (mỗi trường steps cộng 11 số) và kind.

Giới hạn

  • x0≠0x_0\ne0, 1≤steps≤201\le\text{steps}\le20. Các số aa, η\eta đều dương và là bội của 116\frac1{16}.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số tương đối khoảng 10−810^{-8}.

Ví dụ

Input mẫu

{"a": 1, "x0": -1, "eta": 1.5, "steps": 2}

Output mẫu

{
  "x": [-1.0, 2.0, -4.0],
  "f": [1.0, 4.0, 16.0],
  "grad": [-2.0, 4.0, -8.0],
  "kind": "diverge"
}