โจทย์ทั้งหมด
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

การถดถอยเชิงเส้นด้วยการลดเกรเดียนต์

เรียนรู้ความชันและจุดตัดแกนของเส้นตรงด้วยการไล่ลงตามค่าคลาดเคลื่อนกำลังสองเฉลี่ยซ้ำๆ

สิ่งที่คุณจะได้เรียนรู้

  • ลดค่าคลาดเคลื่อนกำลังสองเฉลี่ยทีละขั้น
  • คำนวณ gradient ของความชันและจุดตัดแกน
  • เห็นว่า learning rate ส่งผลต่อการฝึกอย่างไร

โจทย์

แทนที่จะใช้สูตร ให้ฝึกเส้นตรง y = w × x + b ด้วย การลดเกรเดียนต์แบบแบตช์ บนค่าคลาดเคลื่อนกำลังสองเฉลี่ย MSE = Σ(w × x + b - y)² / n

เริ่มที่ w = 0 และ b = 0 ในแต่ละ epoch ให้ใช้ ทุก จุด:

  1. errorᵢ = w × xᵢ + b - yᵢ
  2. dw = (2 / n) × Σ errorᵢ × xᵢ และ db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw และ b ← b - learning_rate × db (ทั้งสองคำนวณจากค่าคลาดเคลื่อนชุดเดียวกัน)

จงเขียน train_linear_regression(xs, ys, learning_rate, epochs)

อินพุต

xs, ys: จุดข้อมูล (ความยาวเท่ากัน)

learning_rate, epochs: ขนาดก้าวและจำนวนครั้งที่ปรับค่า

เอาต์พุต

คืนค่า [w, b] หลังการฝึก

เงื่อนไข

1 ≤ จำนวนจุด ≤ 1,000, 0 ≤ epochs ≤ 10,000

0 < learning_rate ≤ 1

-100 ≤ แต่ละค่า ≤ 100

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
xs = [1.0, 2.0]
ys = [2.0, 4.0]
epochs = 1
learning_rate = 0.1

ผลลัพธ์ที่คาดหวัง:
expected = [1.0, 0.6]
อินพุต:
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;

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {1.0, 0.6};
อินพุต:
double[] xs = new double[] {1.0, 2.0};
double[] ys = new double[] {2.0, 4.0};
long epochs = 1;
double learning_rate = 0.1;

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {1.0, 0.6};

คำอธิบาย

เมื่อ w = b = 0 ค่าคลาดเคลื่อนคือ -2 และ -4 dw = (2 / 2) × (-2×1 - 4×2) = -10 และ db = (2 / 2) × (-2 - 4) = -6 ดังนั้น w = 0 - 0.1 × (-10) = 1 และ b = 0 - 0.1 × (-6) = 0.6 ผลลัพธ์: [1, 0.6]

ตัวอย่างที่ 2
อินพุต:
xs = [1.0, 2.0, 3.0]
ys = [3.0, 5.0, 7.0]
epochs = 2000
learning_rate = 0.05

ผลลัพธ์ที่คาดหวัง:
expected = [2.0, 1.0]
อินพุต:
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;

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {2.0, 1.0};
อินพุต:
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;

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {2.0, 1.0};

คำอธิบาย

ข้อมูลอยู่บน y = 2x + 1 หลังจาก 2,000 epoch การลดเกรเดียนต์ลู่เข้าสู่ w = 2 และ b = 1 ซึ่งตรงกับคำตอบจากสูตรกำลังสองน้อยที่สุด

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก