Đề bài
Một nơ-ron nhân tạo nhân từng đầu vào với một trọng số, cộng thêm bias, rồi đưa kết quả qua hàm kích hoạt:
z = x₁×w₁ + x₂×w₂ + … + xₙ×wₙ + bias
đầu ra = sigmoid(z) = 1 / (1 + e^(-z))
Hãy cài đặt neuron_output(inputs, weights, bias).
Đầu vào
inputs: Các giá trị đầu vào.
weights: Mỗi đầu vào một trọng số (cùng độ dài với inputs).
bias: Bias của nơ-ron.
Đầu ra
Trả về đầu ra của nơ-ron, một số thực từ 0 đến 1.
Ràng buộc
1 ≤ độ dài của inputs = độ dài của weights ≤ 100
-10 ≤ mỗi đầu vào, trọng số và bias ≤ 10
Ví dụ
Đầu vào:
bias = 0.5
inputs = [1.0, 2.0, 3.0]
weights = [0.2, 0.4, 0.6]
Kết quả mong đợi:
expected = 0.964429
Đầu vào:
double bias = 0.5;
std::vector<double> inputs = {1.0, 2.0, 3.0};
std::vector<double> weights = {0.2, 0.4, 0.6};
Kết quả mong đợi:
double expected = 0.964429;
Đầu vào:
double bias = 0.5;
double[] inputs = new double[] {1.0, 2.0, 3.0};
double[] weights = new double[] {0.2, 0.4, 0.6};
Kết quả mong đợi:
double expected = 0.964429;
Giải thích
z = 1×0.2 + 2×0.4 + 3×0.6 + 0.5 = 3.3, và sigmoid(3.3) ≈ 0.964429.
Đầu vào:
bias = 0.0
inputs = [0.5, -1.0]
weights = [2.0, 1.0]
Kết quả mong đợi:
expected = 0.5
Đầu vào:
double bias = 0.0;
std::vector<double> inputs = {0.5, -1.0};
std::vector<double> weights = {2.0, 1.0};
Kết quả mong đợi:
double expected = 0.5;
Đầu vào:
double bias = 0.0;
double[] inputs = new double[] {0.5, -1.0};
double[] weights = new double[] {2.0, 1.0};
Kết quả mong đợi:
double expected = 0.5;
Giải thích
z = 0.5×2 + (-1)×1 + 0 = 0, và sigmoid(0) = 0.5: nơ-ron đang hoàn toàn lưỡng lự.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Đây chỉ là tổng có trọng số của các input cộng bias, rồi qua một sigmoid.
Gợi ý 2
Ghép từng input với weight tương ứng và cộng dồn tích trước khi thêm bias.
Gợi ý 3
Lưu ý đầu ra cuối cùng phải đi qua sigmoid, không được trả về tổng thô.
Độ phức tạp mong đợi
thời gian O(n), bộ nhớ phụ O(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.