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

การทำนายด้วยการถดถอยโลจิสติก

จำแนกตัวอย่างเป็น 0 หรือ 1 โดยส่งผลรวมถ่วงน้ำหนักผ่าน sigmoid แล้วเทียบกับค่าเกณฑ์

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

  • แปลงผลรวมถ่วงน้ำหนักเป็นความน่าจะเป็น
  • จำแนกด้วยค่าเกณฑ์การตัดสินใจ
  • เข้าใจตัวจำแนกแบบสองคลาส

โจทย์

การถดถอยโลจิสติก เป็นโมเดลเชิงเส้นสำหรับคำถามแบบใช่หรือไม่ สำหรับแต่ละตัวอย่าง มันคำนวณความน่าจะเป็นแล้วแปลงเป็นคลาส:

  1. z = x₁×w₁ + … + xₙ×wₙ + bias
  2. p = 1 / (1 + e^(-z))
  3. คลาส = 1 ถ้า p ≥ threshold ไม่เช่นนั้น 0

จงเขียน logistic_predict(samples, weights, bias, threshold)

อินพุต

samples: หนึ่งแถวของฟีเจอร์ n ตัวต่อตัวอย่าง

weights: น้ำหนัก n ค่า

bias: ไบแอส

threshold: ความน่าจะเป็นที่ต้องถึงเพื่อทำนายคลาส 1 (อยู่ระหว่าง 0 และ 1 โดยไม่รวมขอบ)

เอาต์พุต

คืนค่าคลาสที่ทำนาย (0 หรือ 1) ของแต่ละตัวอย่างตามลำดับ

เงื่อนไข

1 ≤ จำนวนตัวอย่าง ≤ 1,000, 1 ≤ n ≤ 50

-100 ≤ ฟีเจอร์ น้ำหนัก และไบแอสแต่ละค่า ≤ 100

0 < threshold < 1

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
bias = -1.0
samples = [
    [2.0, 1.0],
    [0.0, 0.0],
    [-1.0, -3.0]
]
weights = [1.5, -0.5]
threshold = 0.5

ผลลัพธ์ที่คาดหวัง:
expected = [1, 0, 0]
อินพุต:
double bias = -1.0;
std::vector<std::vector<double>> samples = {
    {2.0, 1.0},
    {0.0, 0.0},
    {-1.0, -3.0}
};
std::vector<double> weights = {1.5, -0.5};
double threshold = 0.5;

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1, 0, 0};
อินพุต:
double bias = -1.0;
double[][] samples = new double[][] {
    new double[] {2.0, 1.0},
    new double[] {0.0, 0.0},
    new double[] {-1.0, -3.0}
};
double[] weights = new double[] {1.5, -0.5};
double threshold = 0.5;

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

คำอธิบาย

ตัวอย่าง 1: z = 3 - 0.5 - 1 = 1.5, p ≈ 0.818 → 1 ตัวอย่าง 2: z = -1, p ≈ 0.269 → 0 ตัวอย่าง 3: z = -1.5 + 1.5 - 1 = -1, p ≈ 0.269 → 0 ผลลัพธ์: [1, 0, 0]

ตัวอย่างที่ 2
อินพุต:
bias = -2.0
samples = [
    [1.0],
    [2.0],
    [3.0]
]
weights = [1.0]
threshold = 0.7

ผลลัพธ์ที่คาดหวัง:
expected = [0, 0, 1]
อินพุต:
double bias = -2.0;
std::vector<std::vector<double>> samples = {
    {1.0},
    {2.0},
    {3.0}
};
std::vector<double> weights = {1.0};
double threshold = 0.7;

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {0, 0, 1};
อินพุต:
double bias = -2.0;
double[][] samples = new double[][] {
    new double[] {1.0},
    new double[] {2.0},
    new double[] {3.0}
};
double[] weights = new double[] {1.0};
double threshold = 0.7;

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

คำอธิบาย

ความน่าจะเป็นคือ σ(-1) ≈ 0.269, σ(0) = 0.5 และ σ(1) ≈ 0.731 มีเพียงค่าสุดท้ายที่ถึงเกณฑ์ 0.7 ผลลัพธ์จึงเป็น [0, 0, 1]

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

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

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

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

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