ค่าที่ดีที่สุดนั้นดีอย่างไร?
ฟังก์ชัน np.polyfit() ที่ใช้หาพารามิเตอร์ของเส้นถดถอยนั้นทำงานโดยหา slope และ intercept ที่ ดีที่สุด ด้วยการลดค่าผลรวมกำลังสองของส่วนเหลือ (RSS — residual sum of squares) ให้น้อยที่สุด ในแบบฝึกหัดนี้ จะให้พล็อตกราฟฟังก์ชันที่กำลังถูก optimize คือ RSS เทียบกับพารามิเตอร์ slope a โดยกำหนดให้ intercept มีค่าเท่ากับที่หาได้จากการ optimize จากนั้นพล็อต RSS เทียบกับ slope แล้วสังเกตว่าค่าต่ำสุดอยู่ที่ใด
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Statistical Thinking in Python (ตอนที่ 2)
คำแนะนำการฝึกหัด
- กำหนดค่า slope ที่จะใช้คำนวณ RSS โดยใช้
np.linspace()เพื่อสร้าง200จุดในช่วงระหว่าง0ถึง0.1ตัวอย่างเช่น หากต้องการ100จุดในช่วง0ถึง0.5สามารถใช้คำสั่งnp.linspace(0, 0.5, 100) - กำหนดค่าเริ่มต้นให้อาร์เรย์
rssสำหรับเก็บค่า RSS โดยใช้np.empty_like()พร้อมกับอาร์เรย์ที่สร้างไว้ข้างต้น ฟังก์ชันempty_like()จะคืนค่าอาร์เรย์ใหม่ที่มีรูปร่างและชนิดเดียวกับอาร์เรย์ที่ส่งเข้าไป (ในที่นี้คือa_vals) - เขียน
forloop เพื่อคำนวณผลรวม RSS ของ slope คำใบ้: RSS คำนวณได้จากnp.sum((y_data - a * x_data - b)**2)ตัวแปรbที่คำนวณไว้ในแบบฝึกหัดก่อนหน้ายังคงอยู่ใน namespace แล้ว โดยfertilityคือy_dataและilliteracyคือx_data - พล็อต RSS (
rss) เทียบกับ slope (a_vals) - กด ส่งคำตอบ เพื่อดูกราฟ!
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# Specify slopes to consider: a_vals
a_vals = ____
# Initialize sum of square of residuals: rss
rss = ____
# Compute sum of square of residuals for each value of a_vals
for i, a in enumerate(a_vals):
rss[i] = ____((____ - a*____ - b)**2)
# Plot the RSS
plt.plot(____, ____, '-')
plt.xlabel('slope (children per woman / percent illiterate)')
plt.ylabel('sum of square of residuals')
plt.show()