โจทย์
การถดถอยเชิงเส้น หาเส้นตรง y = slope × x + intercept ที่เข้ากับข้อมูลมากที่สุด คือเส้นที่ผลรวมกำลังสองของความคลาดเคลื่อนน้อยที่สุด สำหรับตัวแปรอินพุตเดียวมีสูตรที่แน่นอน:
- slope = Σ(x - x̄)(y - ȳ) / Σ(x - x̄)²
- intercept = ȳ - slope × x̄
โดย x̄ และ ȳ คือค่าเฉลี่ยของ xs และ ys ถ้า xs ทุกค่าเท่ากัน ให้คืนค่า slope 0 และ intercept ȳ
จงเขียน linear_regression(xs, ys)
อินพุต
xs, ys: ค่า x และ y ของจุดข้อมูล (ความยาวเท่ากัน)
เอาต์พุต
คืนค่า [slope, intercept]
เงื่อนไข
1 ≤ จำนวนจุด ≤ 10,000
-10,000 ≤ แต่ละค่า ≤ 10,000
ตัวอย่าง
อินพุต:
xs = [1.0, 2.0, 3.0, 4.0]
ys = [3.0, 5.0, 7.0, 9.0]
ผลลัพธ์ที่คาดหวัง:
expected = [2.0, 1.0]
อินพุต:
std::vector<double> xs = {1.0, 2.0, 3.0, 4.0};
std::vector<double> ys = {3.0, 5.0, 7.0, 9.0};
ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {2.0, 1.0};
อินพุต:
double[] xs = new double[] {1.0, 2.0, 3.0, 4.0};
double[] ys = new double[] {3.0, 5.0, 7.0, 9.0};
ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {2.0, 1.0};
คำอธิบาย
จุดทั้งหมดอยู่บน y = 2x + 1 พอดี x̄ = 2.5, ȳ = 6, Σ(x - x̄)(y - ȳ) = 10 และ Σ(x - x̄)² = 5 ดังนั้น slope = 2 และ intercept = 6 - 2 × 2.5 = 1
อินพุต:
xs = [0.0, 1.0, 2.0]
ys = [1.0, 3.0, 2.0]
ผลลัพธ์ที่คาดหวัง:
expected = [0.5, 1.5]
อินพุต:
std::vector<double> xs = {0.0, 1.0, 2.0};
std::vector<double> ys = {1.0, 3.0, 2.0};
ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.5, 1.5};
อินพุต:
double[] xs = new double[] {0.0, 1.0, 2.0};
double[] ys = new double[] {1.0, 3.0, 2.0};
ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.5, 1.5};
คำอธิบาย
x̄ = 1 และ ȳ = 2 Σ(x - x̄)(y - ȳ) = (-1)(-1) + 0 + (1)(0) = 1 และ Σ(x - x̄)² = 2 ดังนั้น slope = 0.5 และ intercept = 2 - 0.5 × 1 = 1.5
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน