การใช้รสชาติ SVM อื่น ๆ กับ Scikit-Learn ของ Python

การใช้รสชาติ SVM อื่น ๆ กับ Scikit-Learn ของ Python

บทนำ

คู่มือนี้เป็นส่วนที่สามและส่วนสุดท้ายของคู่มือสามข้อเกี่ยวกับ Support Vector Machines (SVM) ในคู่มือนี้ เราจะยังคงทำงานกับกรณีการใช้ธนบัตรปลอม มีการสรุปโดยย่อเกี่ยวกับแนวคิดทั่วไปเบื้องหลัง SVM ทำความเข้าใจว่าเคล็ดลับเคอร์เนลคืออะไร และนำเคอร์เนลที่ไม่ใช่เชิงเส้นประเภทต่างๆ ไปใช้กับ Scikit-Learn

ในคู่มือชุด SVM ฉบับสมบูรณ์ นอกจากการเรียนรู้เกี่ยวกับ SVM ประเภทอื่นๆ แล้ว คุณจะได้เรียนรู้เกี่ยวกับพารามิเตอร์ SVM, SVM ที่กำหนดไว้ล่วงหน้าอย่างง่าย, ไฮเปอร์พารามิเตอร์ C และ Gamma และวิธีปรับแต่งด้วยการค้นหากริดและการตรวจสอบข้าม

หากคุณต้องการอ่านคำแนะนำก่อนหน้านี้ คุณสามารถดูคำแนะนำสองข้อแรกหรือดูว่าหัวข้อใดที่คุณสนใจมากที่สุด ด้านล่างนี้คือตารางหัวข้อที่ครอบคลุมในแต่ละคำแนะนำ:

  1. การใช้ SVM และ Kernel SVM ด้วย Scikit-Learn ของ Python
  • ใช้กรณี: ลืมธนบัตร
  • ภูมิหลังของ SVM
  • โมเดล SVM แบบง่าย (เชิงเส้น)
    • เกี่ยวกับชุดข้อมูล
    • การนำเข้าชุดข้อมูล
    • สำรวจชุดข้อมูล
  • การใช้ SVM กับ Scikit-Learn
    • แบ่งข้อมูลออกเป็นชุดฝึก/ชุดทดสอบ
    • การฝึกโมเดล
    • การทำนายผล
    • การประเมินแบบจำลอง
    • การตีความผลลัพธ์
  1. ทำความเข้าใจเกี่ยวกับไฮเปอร์พารามิเตอร์ SVM
  • C ไฮเปอร์พารามิเตอร์
  • ไฮเปอร์พารามิเตอร์แกมมา

3. การนำรสชาติ SVM อื่นๆ ไปใช้กับ Scikit-Learn ของ Python

  • แนวคิดทั่วไปของ SVM (สรุป)
  • เคอร์เนล (เคล็ดลับ) SVM
  • การใช้ SVM เคอร์เนลที่ไม่ใช่เชิงเส้นกับ Scikit-Learn
  • การนำเข้าไลบรารี
    • การนำเข้าชุดข้อมูล
    • แบ่งข้อมูลออกเป็นคุณลักษณะ (X) และเป้าหมาย (y)
    • แบ่งข้อมูลออกเป็นชุดฝึก/ชุดทดสอบ
    • การฝึกอบรมอัลกอริทึม
  • เคอร์เนลพหุนาม
    • การทำนายผล
    • การประเมินอัลกอริทึม
  • เมล็ดเกาส์เซียน
    • การทำนายและประเมินผล
  • เคอร์เนลซิกมอยด์
    • การทำนายและประเมินผล
  • การเปรียบเทียบประสิทธิภาพของเคอร์เนลที่ไม่ใช่เชิงเส้น

เรามาจดจำว่า SVM คืออะไรก่อนที่จะดูรูปแบบเคอร์เนล SVM ที่น่าสนใจ

แนวคิดทั่วไปของ SVM

ในกรณีของข้อมูลที่แยกจากกันได้เชิงเส้นตรงในสองมิติ (ดังแสดงในรูปที่ 1) วิธีอัลกอริทึมการเรียนรู้ของเครื่องโดยทั่วไปจะพยายามหาขอบเขตที่แบ่งข้อมูลในลักษณะที่ข้อผิดพลาดในการจัดประเภทผิดจะลดลง หากคุณดูรูปที่ 1 อย่างละเอียด จะสังเกตว่าอาจมีขอบเขตหลายขอบเขต (อนันต์) ที่แบ่งจุดข้อมูลได้อย่างถูกต้อง เส้นประสองเส้นและเส้นทึบล้วนเป็นการจำแนกข้อมูลที่ถูกต้อง

ขอบเขตการตัดสินใจที่หลากหลาย

รูปที่ 1: ขอบเขตการตัดสินใจที่หลากหลาย

เมื่อ SVM เลือก ขอบเขตการตัดสินใจจะเลือกขอบเขตที่เพิ่มระยะห่างระหว่างตัวมันเองกับจุดข้อมูลที่ใกล้ที่สุดของคลาส เรารู้แล้วว่าจุดข้อมูลที่ใกล้ที่สุดคือเวกเตอร์สนับสนุนและระยะทางสามารถกำหนดเป็นพาราเมตริกได้ทั้งคู่ C และ gamma ไฮเปอร์พารามิเตอร์

ในการคำนวณขอบเขตการตัดสินใจนั้น อัลกอริทึมจะเลือกจำนวนจุดที่ต้องพิจารณาและระยะขอบที่สามารถไปได้ ซึ่งจะเป็นการกำหนดค่าปัญหาการเพิ่มระยะขอบให้สูงสุด ในการแก้ปัญหาการเพิ่มระยะขอบนั้น SVM ใช้เวกเตอร์สนับสนุน (ดังที่เห็นในรูปที่ 2) และพยายามหาค่าที่เหมาะสมที่สุดที่ทำให้ระยะขอบใหญ่ขึ้น ในขณะที่จัดประเภทจุดต่างๆ ให้ถูกต้องมากขึ้นตามฟังก์ชันที่ใช้ แยกข้อมูล

ขอบเขตการตัดสินใจพร้อมเวกเตอร์สนับสนุน

รูปที่ 2: ขอบเขตการตัดสินใจพร้อมเวกเตอร์สนับสนุน

นี่คือเหตุผลที่ SVM แตกต่างจากอัลกอริธึมการจำแนกประเภทอื่นๆ เมื่อไม่เพียงแค่ค้นหาขอบเขตการตัดสินใจเท่านั้น แต่ยังพบขอบเขตการตัดสินใจที่เหมาะสมที่สุดอีกด้วย

มีคณิตศาสตร์ที่ซับซ้อนซึ่งได้มาจากสถิติและวิธีการคำนวณที่เกี่ยวข้องกับการหาเวกเตอร์สนับสนุน การคำนวณระยะขอบระหว่างขอบเขตการตัดสินใจและเวกเตอร์สนับสนุน และเพิ่มระยะขอบนั้นให้สูงสุด ครั้งนี้เราจะไม่ลงรายละเอียดว่าคณิตศาสตร์เล่นออกมาอย่างไร

สิ่งสำคัญเสมอคือต้องลงลึกและตรวจสอบให้แน่ใจว่าอัลกอริทึมการเรียนรู้ของเครื่องไม่ใช่คาถาลึกลับบางประเภท แม้ว่าการไม่รู้รายละเอียดทางคณิตศาสตร์ทั้งหมดในเวลานี้ไม่ได้หยุดคุณจากการดำเนินการอัลกอริทึมและรับผลลัพธ์

คำแนะนำ: ตอนนี้เราได้สรุปกระบวนการอัลกอริทึมแล้ว เป็นที่ชัดเจนว่าระยะห่างระหว่างจุดข้อมูลจะส่งผลต่อขอบเขตการตัดสินใจที่ SVM เลือก ด้วยเหตุนี้ ปรับขนาดข้อมูล มักจะจำเป็นเมื่อใช้ตัวแยกประเภท SVM ลองใช้ วิธี Standard Scaler ของ Scikit-learn เพื่อเตรียมข้อมูล จากนั้นรันโค้ดอีกครั้งเพื่อดูว่ามีความแตกต่างในผลลัพธ์หรือไม่

เคอร์เนล (เคล็ดลับ) SVM

ในส่วนก่อนหน้านี้ เราได้จดจำและจัดระเบียบแนวคิดทั่วไปของ SVM แล้ว โดยดูว่าสามารถใช้เพื่อค้นหาขอบเขตการตัดสินใจที่เหมาะสมที่สุดสำหรับข้อมูลที่แยกจากกันเชิงเส้นได้อย่างไร อย่างไรก็ตาม ในกรณีของข้อมูลที่แยกจากกันแบบไม่เชิงเส้น เช่น ข้อมูลที่แสดงในรูปที่ 3 เราทราบแล้วว่าเส้นตรงไม่สามารถใช้เป็นขอบเขตการตัดสินใจได้

ข้อมูลที่แยกจากกันไม่เป็นเชิงเส้น

รูปที่ 3: ข้อมูลที่แยกจากกันแบบไม่เชิงเส้น

แต่เราสามารถใช้ SVM เวอร์ชันแก้ไขที่เราได้กล่าวถึงในตอนต้น ซึ่งเรียกว่า Kernel SVM

โดยพื้นฐานแล้ว สิ่งที่เคอร์เนล SVM จะทำคือการฉายข้อมูลแบบแยกส่วนที่ไม่ใช่เชิงเส้นของมิติที่ต่ำกว่าไปยังรูปแบบที่สอดคล้องกันในมิติที่สูงกว่า นี่เป็นกลอุบาย เนื่องจากเมื่อฉายข้อมูลที่ไม่สามารถแยกออกได้แบบเชิงเส้นในมิติที่สูงขึ้น รูปร่างข้อมูลจะเปลี่ยนในลักษณะที่สามารถแยกออกได้ ตัวอย่างเช่น เมื่อคิดเกี่ยวกับมิติข้อมูล 3 มิติ จุดข้อมูลจากแต่ละคลาสอาจจบลงด้วยการจัดสรรในมิติที่แตกต่างกัน ทำให้สามารถแยกออกจากกันได้ วิธีหนึ่งในการเพิ่มมิติข้อมูลสามารถทำได้โดยการยกกำลัง อีกครั้ง มีคณิตศาสตร์ที่ซับซ้อนเข้ามาเกี่ยวข้อง แต่คุณไม่ต้องกังวลในการใช้ SVM แต่เราสามารถใช้ไลบรารี Scikit-Learn ของ Python เพื่อใช้งานและใช้เคอร์เนลที่ไม่ใช่เชิงเส้นในลักษณะเดียวกับที่เราใช้เชิงเส้น

การใช้ SVM เคอร์เนลที่ไม่ใช่เชิงเส้นกับ Scikit-Learn

ในส่วนนี้ เราจะใช้ชุดข้อมูลเดียวกันในการทำนายว่าธนบัตรเป็นของจริงหรือของปลอมตามคุณสมบัติสี่ประการที่เราทราบกันดีอยู่แล้ว

คุณจะเห็นว่าขั้นตอนที่เหลือเป็นขั้นตอนการเรียนรู้ของเครื่องทั่วไปและต้องการคำอธิบายเพียงเล็กน้อย จนกว่าเราจะไปถึงส่วนที่เราฝึก SVM ของเคอร์เนลที่ไม่ใช่เชิงเส้น

การนำเข้าไลบรารี

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

การนำเข้าชุดข้อมูล

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

แบ่งข้อมูลออกเป็นคุณลักษณะ (X) และเป้าหมาย (y)

X = bankdata.drop('class', axis=1)
y = bankdata['class']

แบ่งข้อมูลออกเป็นชุดฝึก/ชุดทดสอบ

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

การฝึกอบรมอัลกอริทึม

ในการฝึกเคอร์เนล SVM เราจะใช้แบบเดียวกัน SVC ชั้นเรียนของ Scikit-Learn's svm ห้องสมุด. ความแตกต่างอยู่ในค่าสำหรับพารามิเตอร์เคอร์เนลของ SVC ชั้นเรียน

ในกรณีของ SVM อย่างง่าย เราใช้ "เชิงเส้น" เป็นค่าสำหรับพารามิเตอร์เคอร์เนล อย่างไรก็ตาม ดังที่เราได้กล่าวไว้ก่อนหน้านี้ สำหรับเคอร์เนล SVM เราสามารถใช้เคอร์เนลแบบเกาส์เซียน พหุนาม ซิกมอยด์ หรือคอมพิวเตอร์ได้ เราจะใช้เคอร์เนลพหุนาม เกาส์เซียน และซิกมอยด์ และดูเมตริกขั้นสุดท้ายเพื่อดูว่าตัวใดที่เหมาะกับคลาสของเราด้วยเมตริกที่สูงกว่า

1. เคอร์เนลพหุนาม

ในพีชคณิต พหุนามคือการแสดงออกของรูปแบบ:

$$
2ก*ข^3 + 4ก – 9
$$

สิ่งนี้มีตัวแปรเช่น a และ bค่าคงที่ ในตัวอย่างของเรา 9 และค่าสัมประสิทธิ์ (ค่าคงที่พร้อมตัวแปร) เช่น 2 และ 4. 3 ถือว่าเป็นดีกรีของพหุนาม

มีข้อมูลหลายประเภทที่สามารถอธิบายได้ดีที่สุดเมื่อใช้ฟังก์ชันพหุนาม ในที่นี้ สิ่งที่เคอร์เนลจะทำคือแมปข้อมูลของเรากับพหุนามที่เราจะเลือกระดับ ระดับที่สูงขึ้น ฟังก์ชันจะพยายามเข้าใกล้ข้อมูลมากขึ้น ดังนั้นขอบเขตการตัดสินใจจึงมีความยืดหยุ่นมากขึ้น (และมีแนวโน้มที่จะเกินพอดี) ระดับยิ่งต่ำ ความยืดหยุ่นน้อยที่สุด

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

ดังนั้นสำหรับการดำเนินการ เคอร์เนลพหุนามนอกจากการเลือก poly เคอร์เนล เราจะส่งค่าสำหรับ degree พารามิเตอร์ของ SVC ระดับ. ด้านล่างนี้เป็นรหัส:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

การทำนายผล

ตอนนี้ เมื่อเราฝึกอัลกอริทึมแล้ว ขั้นตอนต่อไปคือการคาดการณ์ข้อมูลการทดสอบ

ดังที่เราได้ดำเนินการไปแล้ว เราสามารถรันสคริปต์ต่อไปนี้ได้:

y_pred_poly = svclassifier.predict(X_test)

การประเมินอัลกอริทึม

ตามปกติ ขั้นตอนสุดท้ายคือการประเมินบนเคอร์เนลพหุนาม เนื่องจากเราได้ทำซ้ำโค้ดสำหรับรายงานการจัดหมวดหมู่และเมทริกซ์ความสับสนสองสามครั้ง มาแปลงเป็นฟังก์ชันที่ display_results หลังจากได้รับตามลำดับ y_test, y_pred และตั้งชื่อเรื่องความสับสนของซีบอร์นด้วย cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

ตอนนี้ เราสามารถเรียกใช้ฟังก์ชันและดูผลลัพธ์ที่ได้จากเคอร์เนลพหุนาม:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

ผลลัพธ์มีลักษณะดังนี้:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

การใช้ SVM Flavours อื่นๆ ด้วย Scikit-Learn PlatoBlockchain Data Intelligence ของ Python ค้นหาแนวตั้ง AI.

ตอนนี้เราสามารถทำซ้ำขั้นตอนเดิมสำหรับเมล็ด Gaussian และ sigmoid

2. เกาส์เซียนเคอร์เนล

หากต้องการใช้เคอร์เนลแบบเกาส์เซียน เราเพียงแค่ระบุ 'rbf' เป็นค่าสำหรับ kernel พารามิเตอร์ของคลาส SVC:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

เมื่อสำรวจเคอร์เนลนี้เพิ่มเติม คุณยังสามารถใช้การค้นหาแบบกริดเพื่อรวมเข้ากับเคอร์เนลอื่น C และ gamma ค่า

การทำนายและประเมินผล

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

ผลลัพธ์ของ SVM เคอร์เนล Gaussian มีลักษณะดังนี้:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

การใช้ SVM Flavours อื่นๆ ด้วย Scikit-Learn PlatoBlockchain Data Intelligence ของ Python ค้นหาแนวตั้ง AI.

3. เคอร์เนลซิกมอยด์

สุดท้าย ให้ใช้เคอร์เนล sigmoid สำหรับการนำ Kernel SVM ไปใช้ ดูสคริปต์ต่อไปนี้:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

หากต้องการใช้เคอร์เนล sigmoid คุณต้องระบุ 'sigmoid' เป็นค่าสำหรับ kernel พารามิเตอร์ของ SVC ชั้นเรียน

การทำนายและประเมินผล

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

ผลลัพธ์ของ Kernel SVM ที่มีเคอร์เนล Sigmoid มีลักษณะดังนี้:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

การใช้ SVM Flavours อื่นๆ ด้วย Scikit-Learn PlatoBlockchain Data Intelligence ของ Python ค้นหาแนวตั้ง AI.

การเปรียบเทียบประสิทธิภาพของเคอร์เนลที่ไม่ใช่เชิงเส้น

หากเราเปรียบเทียบประสิทธิภาพโดยสังเขปของเคอร์เนลที่ไม่ใช่เชิงเส้นประเภทต่างๆ อาจดูเหมือนว่าเคอร์เนลซิกมอยด์มีเมตริกต่ำที่สุด จึงมีประสิทธิภาพแย่ที่สุด

ในบรรดาเคอร์เนลแบบเกาส์เซียนและพหุนาม เราจะเห็นว่าเคอร์เนลแบบเกาส์เซียนบรรลุอัตราการทำนายที่สมบูรณ์แบบ 100% ซึ่งมักจะน่าสงสัยและอาจบ่งชี้ว่าเกินพอดี ในขณะที่เคอร์เนลพหุนามจำแนกอินสแตนซ์ 68 อินสแตนซ์ของคลาส 1 ผิด

ดังนั้นจึงไม่มีกฎที่ยากและรวดเร็วว่าเคอร์เนลใดทำงานได้ดีที่สุดในทุกสถานการณ์หรือในสถานการณ์ปัจจุบันของเราโดยไม่ต้องค้นหาไฮเปอร์พารามิเตอร์เพิ่มเติม ทำความเข้าใจเกี่ยวกับรูปร่างของฟังก์ชันแต่ละรูปแบบ สำรวจข้อมูล และเปรียบเทียบการฝึกและผลการทดสอบเพื่อดูว่าอัลกอริทึม กำลังสรุป

มันคือทั้งหมดที่เกี่ยวกับการทดสอบเมล็ดทั้งหมดและเลือกหนึ่งเมล็ดด้วยการผสมผสานระหว่างพารามิเตอร์และการเตรียมข้อมูลที่ให้ผลลัพธ์ที่คาดหวังตามบริบทของโครงการของคุณ

ก้าวต่อไป – โครงการแบบ end-to-end แบบมือถือ

ธรรมชาติที่อยากรู้อยากเห็นของคุณทำให้คุณต้องการไปต่อหรือไม่? เราขอแนะนำให้ตรวจสอบของเรา โครงการแนะนำ: “การทำนายราคาบ้านแบบลงมือปฏิบัติ – การเรียนรู้ของเครื่องใน Python”.

การใช้ SVM Flavours อื่นๆ ด้วย Scikit-Learn PlatoBlockchain Data Intelligence ของ Python ค้นหาแนวตั้ง AI.

ในโครงการแนะนำนี้ คุณจะได้เรียนรู้วิธีสร้างโมเดลแมชชีนเลิร์นนิงแบบดั้งเดิมที่ทรงพลังรวมถึงโมเดลการเรียนรู้เชิงลึก ใช้ Ensemble Learning และฝึกอบรมเมตาเลิร์นนิงเพื่อทำนายราคาบ้านจากโมเดล Scikit-Learn และ Keras

การใช้ Keras ซึ่งเป็น API การเรียนรู้เชิงลึกที่สร้างขึ้นบน Tensorflow เราจะทำการทดลองกับสถาปัตยกรรม สร้างชุดของโมเดลที่ซ้อนกัน และฝึก ผู้เรียนเมตา โครงข่ายประสาทเทียม (รุ่นระดับ 1) เพื่อหาราคาบ้าน

การเรียนรู้เชิงลึกนั้นน่าทึ่งมาก – แต่ก่อนที่จะหันไปใช้ ขอแนะนำให้พยายามแก้ปัญหาด้วยเทคนิคที่ง่ายกว่า เช่น การเรียนรู้ที่ตื้น อัลกอริทึม ประสิทธิภาพพื้นฐานของเราจะขึ้นอยู่กับ a การถดถอยของป่าแบบสุ่ม อัลกอริทึม นอกจากนี้ – เราจะสำรวจการสร้างชุดโมเดลผ่าน Scikit-Learn ผ่านเทคนิคต่างๆ เช่น การห่อ และ การออกเสียง.

นี่เป็นโครงการแบบ end-to-end และเช่นเดียวกับโครงการ Machine Learning ทั้งหมด เราจะเริ่มต้นด้วย – with การวิเคราะห์ข้อมูลเชิงสำรวจ, ติดตามโดย การประมวลผลข้อมูลล่วงหน้า และในที่สุดก็ อาคารตื้น และ โมเดลการเรียนรู้เชิงลึก เพื่อให้พอดีกับข้อมูลที่เราได้สำรวจและทำความสะอาดก่อนหน้านี้

สรุป

ในบทความนี้เราได้สรุปสั้นๆ เกี่ยวกับ SVM ศึกษาเกี่ยวกับเคล็ดลับเคอร์เนล และนำ SVM ที่ไม่ใช่เชิงเส้นไปใช้ในรูปแบบต่างๆ

ฉันขอแนะนำให้คุณใช้แต่ละเคอร์เนลและดำเนินการต่อไป คุณสามารถสำรวจคณิตศาสตร์ที่ใช้สร้างเคอร์เนลต่างๆ ว่าทำไมจึงสร้างเคอร์เนลและความแตกต่างเกี่ยวกับไฮเปอร์พารามิเตอร์ ด้วยวิธีนี้ คุณจะได้เรียนรู้เกี่ยวกับเทคนิคและประเภทเคอร์เนลที่ดีที่สุดที่จะใช้โดยขึ้นอยู่กับบริบทและข้อมูลที่มี

การมีความเข้าใจที่ชัดเจนเกี่ยวกับวิธีการทำงานของแต่ละเคอร์เนลและเวลาที่จะใช้จะช่วยคุณได้อย่างแน่นอน แจ้งให้เราทราบว่าความคืบหน้าเป็นอย่างไรและขอให้มีความสุขในการเขียนโค้ด!

ประทับเวลา:

เพิ่มเติมจาก สแต็ค