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

Dự đoán bằng hồi quy logistic

Phân loại mẫu thành 0 hoặc 1 bằng cách đưa tổng có trọng số qua sigmoid và so sánh với một ngưỡng.

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

  • Biến tổng có trọng số thành xác suất
  • Phân loại bằng ngưỡng quyết định
  • Hiểu các bộ phân loại nhị phân

Đề bài

Xem bản gốc (English)

Hồi quy logistic là mô hình tuyến tính cho các câu hỏi có/không. Với mỗi mẫu, nó tính một xác suất rồi đổi thành một lớp:

  1. z = x₁×w₁ + … + xₙ×wₙ + bias
  2. p = 1 / (1 + e^(-z))
  3. lớp = 1 nếu p ≥ threshold, ngược lại 0

Hãy cài đặt logistic_predict(samples, weights, bias, threshold).

Đầu vào

samples: Mỗi mẫu một hàng gồm n đặc trưng.

weights: n trọng số.

bias: Bias.

threshold: Xác suất cần đạt để dự đoán lớp 1 (nằm hẳn giữa 0 và 1).

Đầu ra

Trả về lớp dự đoán (0 hoặc 1) của từng mẫu theo thứ tự.

Ràng buộc

1 ≤ số mẫu ≤ 1.000, 1 ≤ n ≤ 50

-100 ≤ mỗi đặc trưng, trọng số và bias ≤ 100

0 < threshold < 1

Ví dụ

Ví dụ 1
Đầu vào:
bias = -1.0
samples = [
    [2.0, 1.0],
    [0.0, 0.0],
    [-1.0, -3.0]
]
weights = [1.5, -0.5]
threshold = 0.5

Kết quả mong đợi:
expected = [1, 0, 0]
Đầu vào:
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;

Kết quả mong đợi:
std::vector<long long> expected = {1, 0, 0};
Đầu vào:
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;

Kết quả mong đợi:
long[] expected = new long[] {1, 0, 0};

Giải thích

Mẫu 1: z = 3 - 0.5 - 1 = 1.5, p ≈ 0.818 → 1. Mẫu 2: z = -1, p ≈ 0.269 → 0. Mẫu 3: z = -1.5 + 1.5 - 1 = -1, p ≈ 0.269 → 0. Kết quả: [1, 0, 0].

Ví dụ 2
Đầu vào:
bias = -2.0
samples = [
    [1.0],
    [2.0],
    [3.0]
]
weights = [1.0]
threshold = 0.7

Kết quả mong đợi:
expected = [0, 0, 1]
Đầu vào:
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;

Kết quả mong đợi:
std::vector<long long> expected = {0, 0, 1};
Đầu vào:
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;

Kết quả mong đợi:
long[] expected = new long[] {0, 0, 1};

Giải thích

Các xác suất là σ(-1) ≈ 0.269, σ(0) = 0.5 và σ(1) ≈ 0.731. Chỉ giá trị cuối đạt ngưỡng 0.7, nên kết quả là [0, 0, 1].

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.