Tất cả thử thách
Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

Hồi quy tuyến tính bằng hạ gradient

Học hệ số góc và hệ số chặn của đường thẳng bằng cách liên tục đi xuống theo sai số bình phương trung bình.

Bạn sẽ học được gì

  • Giảm sai số bình phương trung bình từng bước
  • Tính gradient cho hệ số góc và hệ số chặn
  • Thấy tốc độ học ảnh hưởng đến huấn luyện

Đề bài

Xem bản gốc (English)

Thay vì dùng công thức, hãy huấn luyện đường thẳng y = w × x + b bằng hạ gradient theo lô trên sai số bình phương trung bình MSE = Σ(w × x + b - y)² / n.

Bắt đầu với w = 0 và b = 0. Ở mỗi epoch, dùng tất cả các điểm:

  1. errorᵢ = w × xᵢ + b - yᵢ
  2. dw = (2 / n) × Σ errorᵢ × xᵢ và db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw và b ← b - learning_rate × db (cả hai tính từ cùng một bộ sai số)

Hãy cài đặt train_linear_regression(xs, ys, learning_rate, epochs).

Đầu vào

xs, ys: Các điểm dữ liệu (cùng độ dài).

learning_rate, epochs: Bước nhảy và số lần cập nhật.

Đầu ra

Trả về [w, b] sau khi huấn luyện.

Ràng buộc

1 ≤ số điểm ≤ 1.000, 0 ≤ epochs ≤ 10.000

0 < learning_rate ≤ 1

-100 ≤ mỗi giá trị ≤ 100

Ví dụ

Ví dụ 1
Đầu vào:
xs = [1.0, 2.0]
ys = [2.0, 4.0]
epochs = 1
learning_rate = 0.1

Kết quả mong đợi:
expected = [1.0, 0.6]
Đầu vào:
std::vector<double> xs = {1.0, 2.0};
std::vector<double> ys = {2.0, 4.0};
long long epochs = 1;
double learning_rate = 0.1;

Kết quả mong đợi:
std::vector<double> expected = {1.0, 0.6};
Đầu vào:
double[] xs = new double[] {1.0, 2.0};
double[] ys = new double[] {2.0, 4.0};
long epochs = 1;
double learning_rate = 0.1;

Kết quả mong đợi:
double[] expected = new double[] {1.0, 0.6};

Giải thích

Với w = b = 0, các sai số là -2 và -4. dw = (2 / 2) × (-2×1 - 4×2) = -10 và db = (2 / 2) × (-2 - 4) = -6, nên w = 0 - 0.1 × (-10) = 1 và b = 0 - 0.1 × (-6) = 0.6. Kết quả: [1, 0.6].

Ví dụ 2
Đầu vào:
xs = [1.0, 2.0, 3.0]
ys = [3.0, 5.0, 7.0]
epochs = 2000
learning_rate = 0.05

Kết quả mong đợi:
expected = [2.0, 1.0]
Đầu vào:
std::vector<double> xs = {1.0, 2.0, 3.0};
std::vector<double> ys = {3.0, 5.0, 7.0};
long long epochs = 2000;
double learning_rate = 0.05;

Kết quả mong đợi:
std::vector<double> expected = {2.0, 1.0};
Đầu vào:
double[] xs = new double[] {1.0, 2.0, 3.0};
double[] ys = new double[] {3.0, 5.0, 7.0};
long epochs = 2000;
double learning_rate = 0.05;

Kết quả mong đợi:
double[] expected = new double[] {2.0, 1.0};

Giải thích

Dữ liệu nằm trên y = 2x + 1. Sau 2.000 epoch, hạ gradient đã hội tụ về w = 2 và b = 1, cùng đáp án với công thức bình phương tối thiểu.

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.