- ตัวดำเนินการ
-
เรียนรู้
ศูนย์การเรียนรู้ Python ตัวอย่างที่รันได้, NumPy, pandas และอื่น ๆ ศูนย์การเรียนรู้ C และ C++ พอยน์เตอร์ หน่วยความจำ STL และ C++ สมัยใหม่ ศูนย์การเรียนรู้ C#พื้นฐาน C#, OOP, LINQ, async และแบบฝึกหัด .NET อัลกอริทึม Python การค้นหา การเรียงลำดับ รีเคอร์ชัน และภาพจำลอง O(n) อัลกอริทึม C และ C++ เปรียบเทียบการเขียนด้วย C และ C++
- โจทย์
Naive Bayes สมมติว่าฟีเจอร์เป็นอิสระต่อกันเมื่อรู้คลาสแล้ว และเลือกคลาสที่มีคะแนนสูงที่สุด:
score(c) = P(c) × P(x₁ | c) × P(x₂ | c) × … × P(xₙ | c)
ฟีเจอร์เป็นหมวดหมู่ที่เข้ารหัสเป็นจำนวนเต็ม ประมาณความน่าจะเป็นจากข้อมูลฝึก:
- P(c) = (จำนวนตัวอย่างของคลาส c) / (จำนวนตัวอย่างทั้งหมด)
- P(xⱼ = v | c) = (จำนวนตัวอย่างของคลาส c ที่ฟีเจอร์ j เท่ากับ v + 1) / (จำนวนตัวอย่างของคลาส c + Kⱼ)
โดย Kⱼ คือจำนวนค่าที่ต่างกันของฟีเจอร์ j ในตัวอย่างฝึก และ query ส่วน +1 (การปรับเรียบแบบลาปลาซ) ป้องกันไม่ให้ค่าที่ไม่เคยเห็นทำให้คะแนนเป็น 0
คืนค่าคลาสที่มีคะแนนสูงที่สุด ถ้าคะแนนเท่ากันให้คืนคลาสที่น้อยกว่า การคูณความน่าจะเป็นเล็กๆ จำนวนมากอาจทำให้ค่าเล็กจนปัดเป็นศูนย์ จึงควรบวกลอการิทึมแทน
จงเขียน naive_bayes_predict(features, labels, query)
อินพุต
features: หนึ่งแถวของฟีเจอร์แบบหมวดหมู่ n ตัวต่อตัวอย่างฝึก
labels: คลาสของแต่ละตัวอย่างฝึก
query: ฟีเจอร์ n ตัวของตัวอย่างที่ต้องการจำแนก
เอาต์พุต
คืนค่าคลาสที่ทำนายได้
เงื่อนไข
1 ≤ จำนวนตัวอย่าง ≤ 1,000, 1 ≤ n ≤ 20
0 ≤ ค่าฟีเจอร์และป้ายกำกับแต่ละค่า ≤ 100
ตัวอย่าง
ตัวอย่างที่ 1
อินพุต:
query = [0, 1]
labels = [1, 1, 0, 0, 1]
features = [
[0, 1],
[0, 0],
[1, 1],
[1, 0],
[0, 1]
]
ผลลัพธ์ที่คาดหวัง:
1
คำอธิบาย
คลาส 1 มี 3 ตัวอย่างและคลาส 0 มี 2 ตัวอย่าง ฟีเจอร์ 1 มีค่า {0, 1} (K = 2) ฟีเจอร์ 2 มี {0, 1} (K = 2) score(1) = 3/5 × (3+1)/(3+2) × (2+1)/(3+2) = 0.6 × 0.8 × 0.6 = 0.288 score(0) = 2/5 × (0+1)/(2+2) × (1+1)/(2+2) = 0.4 × 0.25 × 0.5 = 0.05 คลาส 1 ชนะ
ตัวอย่างที่ 2
อินพุต:
query = [2]
labels = [0, 0, 1]
features = [
[0],
[0],
[1]
]
ผลลัพธ์ที่คาดหวัง:
0
คำอธิบาย
ค่า 2 ไม่เคยปรากฏ จึงได้ K = 3 (ค่า 0, 1 และ 2) score(0) = 2/3 × (0+1)/(2+3) ≈ 0.133 และ score(1) = 1/3 × (0+1)/(1+3) ≈ 0.083 ด้วยการปรับเรียบ ไม่มีคะแนนใดเป็น 0 และคลาส 0 ที่พบบ่อยกว่าชนะ
แหล่งอ้างอิง
-
ตัวอย่างที่ 1 ยังไม่ได้รันอินพุต:
query = [0, 1] labels = [1, 1, 0, 0, 1] features = [ [0, 1], [0, 0], [1, 1], [1, 0], [0, 1] ]ผลลัพธ์ที่คาดหวัง:1เอาต์พุตของคุณ -
ตัวอย่างที่ 2 ยังไม่ได้รันอินพุต:
query = [2] labels = [0, 0, 1] features = [ [0], [0], [1] ]ผลลัพธ์ที่คาดหวัง:0เอาต์พุตของคุณ
มี 4 การทดสอบที่ซ่อนอยู่จะถูกรันเมื่อคุณส่งคำตอบ
คอมไพเลอร์และดีบักเกอร์ C++ ออนไลน์
ดีบัก C++ ด้วย breakpoint ตัวแปร และการทำงานทีละขั้นของ GDB ในโหมดเซิร์ฟเวอร์
🚀 2,392,381 การดำเนินการทั้งหมด (7 ในเดือนนี้)
ฝึก C++ ด้วยโจทย์เขียนโค้ด
แก้โจทย์จริงใน editor นี้: รันทดสอบตัวอย่าง ส่งคำตอบ และรับรีวิวโค้ดจาก AI
เลือกตามหัวข้อ
เรียน C และ C++ ควบคู่กันด้วยโค้ดจริง output โมเดลหน่วยความจำ โครงสร้างข้อมูล อัลกอริทึม และ C++ สมัยใหม่
💻 เกี่ยวกับตัวรัน C++ ออนไลน์นี้
ตัวรัน C++ ของ CodeUtility ช่วยให้คุณเขียนและรันโค้ด C++ ได้โดยตรงในเบราว์เซอร์ของคุณ - ไม่ต้องติดตั้งหรือเซ็ตอัพคอมไพเลอร์ใดๆ ใช้งานบนแซนด์บ็อกซ์ที่ปลอดภัย รองรับมาตรฐาน C++ จริง ตั้งแต่ C++11, C++14, C++17 ไปจนถึงเวอร์ชัน ล่าสุด
เครื่องมือนี้ใช้คอมไพเลอร์ C++ จริงที่รันบนคลาวด์เพื่อคอมไพล์และรันโค้ดของคุณ ช่วยให้พฤติกรรมถูกต้องและสม่ำเสมอ ในแต่ละเวอร์ชัน คุณสามารถทดลองแนวคิดพื้นฐานของ C++ ได้อย่างอิสระ เช่น ตัวแปร ฟังก์ชัน ลูป เงื่อนไข และการเขียนโปรแกรมเชิงวัตถุ
ไม่ว่าคุณจะเตรียมตัวสัมภาษณ์ เรียนรู้ฟีเจอร์ C++ สมัยใหม่ หรือยืนยันตรรกะของอัลกอริทึม ตัวรัน C++ ของ CodeUtility มอบสภาพแวดล้อมที่เรียบง่ายแต่ทรงพลัง ให้คุณรันโค้ดได้ทันทีจากทุกอุปกรณ์
มากกว่าเครื่องมือรันโค้ด
ใช้ตัวแก้ไขหลายไฟล์ เทอร์มินัลประมวลผลแบบแยกส่วน ไลบรารีเฉพาะรันไทม์ พื้นที่ทำงานถาวร การแชร์ และการทำงานร่วมกันแบบเรียลไทม์ได้จากตัวประมวลผลเดียวกัน
วิธีใช้ตัวประมวลผลนี้
เลือกรันไทม์ เปิดหรือสร้างไฟล์ เขียนโค้ด แล้วเลือกเรียกใช้ ผลลัพธ์จะแสดงในเทอร์มินัล ส่วนผู้ใช้ที่ลงชื่อเข้าใช้สามารถเก็บไฟล์ในพื้นที่ทำงาน ติดตั้งไลบรารี และทำงานร่วมกันผ่านการแชร์ได้
- เลือกเวอร์ชันแล้วแก้ไขไฟล์ปัจจุบัน หรือเปิดไฟล์อื่นในพื้นที่ทำงาน
- เรียกใช้โค้ด ป้อนข้อมูลในเทอร์มินัลเมื่อระบบร้องขอ และตรวจสอบประวัติการเรียกใช้ที่บันทึกไว้
- ใช้ไลบรารี เครื่องมือพื้นที่ทำงาน การแชร์ และแชท เมื่องานของคุณต้องใช้โค้ดมากกว่าหนึ่งส่วน
💡 พื้นฐาน C++ และตัวอย่างที่ลองได้ด้านบน
1. ประกาศตัวแปรและค่าคงที่
C++ ต้องประกาศชนิดข้อมูลของตัวแปรทุกตัว ใช้ const เพื่อกำหนดค่าที่อ่านอย่างเดียว ซึ่งไม่สามารถเปลี่ยนได้หลังจากกำหนดค่าเริ่มต้นแล้ว
int age = 30;
double pi = 3.14159;
char grade = 'A';
std::string name = "Alice";
bool isActive = true;
// ค่าคงที่
const int MAX_USERS = 100;
const std::string COMPANY = "CodeUtility";
// การพยายามแก้ไขตัวแปร const จะทำให้เกิดข้อผิดพลาดขณะคอมไพล์
// MAX_USERS = 200; // ❌ ข้อผิดพลาด
2. เงื่อนไข (if / switch)
ใช้ if, else if, else เพื่อแตกแขนงเงื่อนไข ใช้ switch เมื่อมีหลายค่า
int x = 2;
if (x == 1) {
std::cout << "หนึ่ง\n";
} else if (x == 2) {
std::cout << "สอง\n";
} else {
std::cout << "อื่นๆ\n";
}
// สวิตช์-เคส
switch (x) {
case 1:
std::cout << "หนึ่ง\n";
break;
case 2:
std::cout << "สอง\n";
break;
default:
std::cout << "อื่นๆ\n";
}
3. ลูป
ใช้ for, while และ do-while เพื่อทำซ้ำบล็อกโค้ด
for (int i = 0; i < 3; i++) {
std::cout << i << "\n";
}
int n = 3;
while (n > 0) {
std::cout << n << "\n";
n--;
}
4. อาร์เรย์
อาร์เรย์เก็บหลายองค์ประกอบที่มีชนิดเดียวกัน
int numbers[3] = {10, 20, 30};
std::cout << numbers[1] << "\n";
5. การจัดการอาร์เรย์/เวกเตอร์
ใช้ std::vector สำหรับอาร์เรย์แบบขยายขนาดได้
#include <vector>
std::vector nums = {1, 2, 3};
nums.push_back(4);
nums.pop_back();
for (int n : nums) {
std::cout << n << " ";
}
6. การรับ/ส่งข้อมูลผ่านคอนโซล
ใช้ std::cin สำหรับรับข้อมูล และใช้ std::cout สำหรับแสดงผล
std::string name;
std::cout << "ป้อนชื่อของคุณ: ";
std::cin >> name;
std::cout << "สวัสดี, " << name << "\n";
7. ฟังก์ชัน
ฟังก์ชันช่วยจัดกลุ่มลอจิกที่นำกลับมาใช้ซ้ำได้ ระบุพารามิเตอร์และชนิดค่าที่ส่งกลับ
int add(int a, int b) {
return a + b;
}
std::cout << add(3, 4);
8. Map
std::map เก็บคู่คีย์-ค่า คล้ายพจนานุกรม
#include <map>
std::map ages;
ages["Alice"] = 30;
std::cout << ages["Alice"];
9. การจัดการข้อยกเว้น
ใช้ try และ catch เพื่อจัดการข้อผิดพลาดขณะรัน
try {
throw std::runtime_error("เกิดข้อผิดพลาด");
} catch (const std::exception& e) {
std::cout << e.what();
}
10. การทำงานกับไฟล์ (File I/O)
ใช้ fstream เพื่ออ่านและเขียนไฟล์
#include <fstream>
std::ofstream out("file.txt");
out << "สวัสดีไฟล์";
out.close();
std::ifstream in("file.txt");
std::string line;
getline(in, line);
std::cout << line;
in.close();
11. การจัดการสตริง
สตริงใน C++ รองรับเมธอดอย่าง length(), substr() และ find()
std::string text = "สวัสดีชาวโลก";
std::cout << text.length();
std::cout << text.substr(0, 5);
std::cout << text.find("ชาวโลก");
12. คลาสและอ็อบเจ็กต์
C++ รองรับการเขียนโปรแกรมเชิงวัตถุด้วยคลาส
class Person {
public:
std::string name;
Person(std::string n) : name(n) {}
void greet() { std::cout << "สวัสดี ฉันชื่อ " << name; }
};
Person p("Alice");
p.greet();
13. พอยน์เตอร์
พอยน์เตอร์เก็บที่อยู่หน่วยความจำของตัวแปรอีกตัว ใช้ & เพื่อรับที่อยู่
และใช้ * เพื่อ dereference (เข้าถึงค่าที่ตำแหน่งนั้น)
int x = 10;
int* ptr = &x;
std::cout << "ค่าของ x: " << x << "\n";
std::cout << "ที่อยู่ของ x: " << ptr << "\n";
std::cout << "ค่าจากพอยน์เตอร์: " << *ptr << "\n";
// แก้ไข x ผ่านพอยน์เตอร์
*ptr = 20;
std::cout << "อัปเดต x: " << x << "\n";
🐞 วิธีดีบักโค้ด %{language} ออนไลน์
ใช้ดีบักเกอร์ %{language} ออนไลน์เพื่อค้นหาข้อผิดพลาด runtime และ logic โดยไม่ต้องติดตั้งคอมไพเลอร์หรือ IDE โหมดเซิร์ฟเวอร์จะคอมไพล์พร้อม debug symbols และรันด้วย GDB
- ตั้ง breakpoint ข้างหมายเลขบรรทัด
- เลือก Debug เพื่อคอมไพล์และหยุดที่ breakpoint แรก
- ตรวจสอบบรรทัด call stack และตัวแปร
- ใช้ Continue, Step Over, Step Into หรือ Step Out
- เลือก Stop เพื่อจบการดีบัก
เริ่มจากตัวอย่างขนาดเล็กที่ทำให้เกิดปัญหาได้ และตั้ง breakpoint ก่อนพฤติกรรมที่ไม่คาดคิด