Machine Learning Academy · บทเรียน

การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ

ผู้เรียนจะทดลองค่า k ตั้งแต่ 1 ถึง 30 วาดความแม่นยำจากการตรวจสอบ และระบุจุดเหมาะสมที่สร้างสมดุลระหว่างอคติกับความแปรปรวน

บทเรียน 2 จาก 413 ขั้นตอน

การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ เป็นบทเรียน Machine Learning Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Machine Learning Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการเลือกค่า k จึงสำคัญ

ค่า k เป็นไฮเปอร์พารามิเตอร์ที่สำคัญที่สุดใน KNN ค่า k ที่เล็กเกินไป (เช่น k=1) ทำให้โมเดลไวต่อสัญญาณรบกวนอย่างมาก: จุดข้อมูลฝึกแต่ละจุดจะสร้างขอบเขตการทำนายของตนเอง ทำให้โมเดลจดจำสัญญาณรบกวนแทนที่จะเรียนรู้รูปแบบ ค่า k ที่ใหญ่เกินไป จะทำให้ขอบเขตการตัดสินใจราบเรียบเกินไป และอาจรวมคลาสที่แตกต่างกันอย่างแท้จริงเข้าด้วยกัน การหาค่า k ที่เหมาะสมเป็นปัญหาอคติ-ความแปรปรวน: k เล็ก = อคติต่ำ ความแปรปรวนสูง; k ใหญ่ = อคติสูง ความแปรปรวนต่ำ วิธีข้อศอกและเส้นโค้งการตรวจสอบช่วยระบุค่า k ที่เหมาะสมที่สุด จากข้อมูลเชิงประจักษ์

# k=1: memorises training set perfectly
# Training accuracy = 100%, test accuracy low (overfitting)

# k=N (all neighbors): always predicts majority class
# Training accuracy = majority fraction (underfitting)

# Optimal k: somewhere in between
# Maximises test/validation accuracy

from sklearn.neighbors import KNeighborsClassifier
print('k=1  overfits (memorises noise)')
print('k=N  underfits (ignores all variation)')
print('Best k: maximises cross-validated accuracy')

การไล่ค่าของ k: วงรอบพื้นฐาน

วิธีที่ง่ายที่สุดคือฝึก KNN ด้วยช่วงของค่า k ประเมินแต่ละค่าด้วยชุดข้อมูลตรวจสอบ แล้วเลือกค่า k ที่มีความแม่นยำบนชุดตรวจสอบสูงสุด ไซคิต-เลิร์นทำให้เรื่องนี้ทำได้ง่าย: วนค่าของ k ตั้งแต่ 1 ถึงค่าสูงสุดที่กำหนด แล้วฝึกและวัดคะแนนของแต่ละโมเดล ควรประเมินด้วยชุดข้อมูลตรวจสอบที่กันไว้ออกจากการฝึกเสมอ หรือใช้การตรวจสอบไขว้ — หากประเมินด้วยชุดข้อมูลฝึก ระบบจะเลือก k=1 เสมอ (เพราะเมื่อ k=1 KNN จะทำนายจุดฝึกได้ถูกต้อง 100% ด้วยการจดจำจุดเหล่านั้น)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_tr = scaler.fit_transform(X_train)
X_v  = scaler.transform(X_val)

val_scores = []
for k in range(1, 31):
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_tr, y_train)
    val_scores.append(knn.score(X_v, y_val))

best_k = val_scores.index(max(val_scores)) + 1
print('Best k:', best_k, 'with accuracy:', max(val_scores).round(3))

การพล็อตเส้นโค้งการตรวจสอบ

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

import matplotlib.pyplot as plt
import numpy as np

k_values = range(1, 31)
# val_scores computed from previous sweep
plt.figure(figsize=(10, 5))
plt.plot(k_values, val_scores, marker='o', label='Validation accuracy')
plt.axvline(x=best_k, color='r', linestyle='--', label=f'Best k={best_k}')
plt.xlabel('k (Number of Neighbors)')
plt.ylabel('Validation Accuracy')
plt.title('KNN Validation Curve')
plt.legend()
plt.grid(True)
plt.show()

ความแม่นยำจากการตรวจสอบไข้สำหรับแต่ละค่า k

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

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import numpy as np

X, y = load_iris(return_X_y=True)

cv_means, cv_stds = [], []
for k in range(1, 31):
    pipe = Pipeline([('sc', StandardScaler()),
                     ('knn', KNeighborsClassifier(n_neighbors=k))])
    scores = cross_val_score(pipe, X, y, cv=10)
    cv_means.append(scores.mean())
    cv_stds.append(scores.std())

best_k_cv = np.argmax(cv_means) + 1
print('Best k by CV:', best_k_cv, 'mean accuracy:', max(cv_means).round(3))

แนวคิดวิธีข้อศอก

วิธีข้อศอก เป็นเทคนิคเชิงภาพสำหรับหาจุดสมดุลที่การเพิ่มความแม่นยำเริ่มให้ผลเพียงเล็กน้อย ให้พล็อตความแม่นยำบนชุดตรวจสอบ (หรือค่าความคลาดเคลื่อน) เทียบกับ k โดยทั่วไปเส้นโค้งจะแสดงการพัฒนาอย่างรวดเร็วเมื่อ k มีค่าน้อย แล้วค่อย ๆ ราบลง จุดข้อศอก — จุดที่เส้นโค้งเปลี่ยนจากชันเป็นราบ — มักเป็นค่า k ที่เหมาะสมที่สุด แนวคิดคือผลตอบแทนที่ลดลง: การเพิ่มเพื่อนบ้านเกินจุดนี้ไม่ได้ช่วยเพิ่มความแม่นยำอย่างมีนัยสำคัญ แต่กลับเพิ่มอคติ จุดข้อศอกอาจไม่เห็นได้ชัดเสมอไป จึงมักเลือกใช้วิธีเชิงปริมาณอย่าง CV ในการตัดสินใจขั้นสุดท้าย

import matplotlib.pyplot as plt
import numpy as np

k_range = range(1, 31)
error_rates = [1 - acc for acc in cv_means]  # Convert accuracy to error

plt.figure(figsize=(10, 5))
plt.plot(list(k_range), error_rates, marker='o')
plt.xlabel('k')
plt.ylabel('Cross-Validated Error Rate')
plt.title('Elbow Method for Optimal k')
plt.grid(True)

# Mark the elbow visually
plt.axvline(x=best_k_cv, color='r', linestyle='--', label=f'Elbow at k={best_k_cv}')
plt.legend()
plt.show()

การใช้ validation_curve จากไซคิต-เลิร์น

ไซคิต-เลิร์นมีฟังก์ชันอำนวยความสะดวก validation_curve() ซึ่งไล่ช่วงของไฮเปอร์พารามิเตอร์และคืนคะแนนการฝึกกับการตรวจสอบสำหรับแต่ละค่า ฟังก์ชันนี้สะอาดกว่าการเขียนวงรอบเอง เพราะจัดการการตรวจสอบไข้ภายในให้ param_name ใช้สัญกรณ์ขีดล่างสองตัวสำหรับพารามิเตอร์ของกระบวนการทำงาน (เช่น knn__n_neighbors) การพล็อตเส้นโค้งการฝึกและการตรวจสอบร่วมกันช่วยแสดงให้เห็นว่าประสิทธิภาพต่ำเกิดจากการเรียนรู้ไม่พอ (ทั้งคู่ต่ำ) การเรียนรู้มากเกินไป (การฝึกสูง แต่การตรวจสอบต่ำ) หรือการนำไปใช้กับข้อมูลใหม่ได้ดี (ทั้งคู่สูง)

from sklearn.model_selection import validation_curve
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

pipe = Pipeline([('sc', StandardScaler()), ('knn', KNeighborsClassifier())])

train_scores, val_scores = validation_curve(
    pipe, X, y,
    param_name='knn__n_neighbors',
    param_range=range(1, 31),
    cv=10, scoring='accuracy'
)

train_mean = np.mean(train_scores, axis=1)
val_mean   = np.mean(val_scores, axis=1)

print('Best k:', np.argmax(val_mean) + 1)

การแลกเปลี่ยนระหว่างอคติกับความแปรปรวนใน KNN

เส้นโค้งการตรวจสอบแสดงการแลกเปลี่ยนระหว่างอคติกับความแปรปรวนโดยตรง สำหรับ ค่า k เล็ก: ความแม่นยำในการฝึกเข้าใกล้ 100% (อคติต่ำ โมเดลเข้ากับข้อมูลฝึกได้อย่างสมบูรณ์) ขณะที่ความแม่นยำในการตรวจสอบต่ำกว่า (ความแปรปรวนสูง โมเดลไวต่อจุดแต่ละจุดมากเกินไป) สำหรับ ค่า k ใหญ่: ความแม่นยำในการฝึกลดลง (โมเดลเรียนรู้ไม่พอ) และความแม่นยำในการตรวจสอบก็ลดลงเช่นกัน (อคติสูง) ค่า k ที่เหมาะสมที่สุดอยู่ตรงจุดตัด ซึ่งช่องว่างระหว่างความแม่นยำในการฝึกและการตรวจสอบมีน้อย และทั้งสองค่าถูกทำให้สูงสุด — นี่คือจุดสมดุลที่โมเดลนำไปใช้กับข้อมูลใหม่ได้ดีที่สุด

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(10, 5))
k_range = list(range(1, 31))

ax.plot(k_range, train_mean, label='Training accuracy', color='blue')
ax.plot(k_range, val_mean, label='Validation accuracy', color='orange')
ax.fill_between(k_range,
    np.mean(train_scores, axis=1) - np.std(train_scores, axis=1),
    np.mean(train_scores, axis=1) + np.std(train_scores, axis=1),
    alpha=0.1, color='blue')

ax.set_xlabel('k')
ax.set_ylabel('Accuracy')
ax.set_title('Bias-Variance Trade-off: KNN Validation Curve')
ax.legend()
plt.show()

การเลือก k จากค่าคี่หรือค่าคู่

สำหรับ การจำแนกแบบสองกลุ่ม ควรเลือก ค่า k ที่เป็นจำนวนคี่ เสมอเพื่อหลีกเลี่ยงคะแนนเสมอ เมื่อ k=4 และมีสองคลาส อาจได้คะแนนโหวตคลาสละ 2 เสียง — จากนั้นกฎการตัดสินกรณีเสมอจะเป็นตัวกำหนดผลลัพธ์ ซึ่งอาจไม่แน่นอน การใช้ k=3 หรือ k=5 ทำให้ไม่เกิดคะแนนเสมอเมื่อมีสองคลาส สำหรับ ปัญหาหลายคลาส ที่มี C คลาส ค่า k ไม่ควรเป็นพหุคูณของ C ด้วยเหตุผลเดียวกัน รายละเอียดนี้ดูเล็กน้อยแต่มีความสำคัญในทางปฏิบัติ เมื่อค่า k ที่ใกล้ค่าที่เหมาะสมที่สุดมีประสิทธิภาพใกล้เคียงกัน

# Best practice for binary classification: pick odd k
# For multi-class (C classes): avoid multiples of C

def recommend_k(k_optimal, n_classes):
    if n_classes == 2:
        # Make odd
        return k_optimal if k_optimal % 2 == 1 else k_optimal + 1
    else:
        # Avoid multiples of n_classes
        while k_optimal % n_classes == 0:
            k_optimal += 1
        return k_optimal

print('Binary, k=4 -> recommended:', recommend_k(4, 2))  # 5
print('3-class, k=6 -> recommended:', recommend_k(6, 3)) # 7

GridSearchCV สำหรับการเลือก k

GridSearchCV ทำให้การเลือก k เป็นอัตโนมัติ โดยประเมินค่าที่เป็นไปได้ทุกค่าด้วยการตรวจสอบไข้ แล้วคืนค่าที่ดีที่สุด ใช้ร่วมกับกระบวนการทำงานสำหรับปรับขนาดข้อมูล และส่ง param_grid พร้อมคีย์ที่ใช้ขีดล่างสองตัว GridSearchCV ยังฝึกโมเดลที่ดีที่สุดใหม่ด้วยชุดข้อมูลฝึกทั้งหมด ดังนั้น grid.best_estimator_ จึงพร้อมนำไปใช้งานจริงได้ทันทีหลังการฝึก นี่เป็นแนวทางที่แนะนำ เมื่อการเลือก k เป็นส่วนหนึ่งของการปรับไฮเปอร์พารามิเตอร์ที่มีขนาดใหญ่ขึ้น

from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

pipe = Pipeline([
    ('sc', StandardScaler()),
    ('knn', KNeighborsClassifier())
])

param_grid = {
    'knn__n_neighbors': list(range(1, 31, 2)),  # odd values 1-29
    'knn__weights': ['uniform', 'distance']
}

grid = GridSearchCV(pipe, param_grid, cv=10, scoring='accuracy', n_jobs=-1)
grid.fit(X_train, y_train)

print('Best k:', grid.best_params_['knn__n_neighbors'])
print('Best weights:', grid.best_params_['knn__weights'])
print('Best CV accuracy:', grid.best_score_.round(3))

การตีความผลลัพธ์และการเลือก k ขั้นสุดท้าย

เมื่อค่า k หลายค่าทำให้ได้คะแนนการตรวจสอบใกล้เคียงกัน ควรเลือกค่า k ที่ใหญ่กว่า เพื่อให้การทำนายราบเรียบ แข็งแกร่ง และไวต่อจุดสัญญาณรบกวนแต่ละจุดน้อยลง ให้ตรวจสอบค่าเบี่ยงเบนมาตรฐานของคะแนนจากการตรวจสอบไข้: หากค่า k ที่เล็กกว่ามีค่าเฉลี่ยสูงกว่าแต่มีค่า std สูงกว่าด้วย ค่า k ที่ใหญ่อาจน่าเชื่อถือกว่าเมื่อนำไปใช้งานจริง ควรฝึกโมเดลขั้นสุดท้ายใหม่ด้วยชุดข้อมูลฝึกทั้งหมด (ไม่ใช่เฉพาะส่วนฝึกจากการตรวจสอบไข้) โดยใช้ค่า k ที่เลือก แล้วประเมินหนึ่งครั้งด้วยชุดข้อมูลทดสอบที่กันไว้ออกจากการฝึก

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# Select best k from validation
best_k = 11  # determined from CV

# Retrain on full training data
final_model = Pipeline([
    ('sc', StandardScaler()),
    ('knn', KNeighborsClassifier(n_neighbors=best_k, weights='distance'))
])
final_model.fit(X_train, y_train)

# Evaluate once on held-out test set
test_accuracy = final_model.score(X_test, y_test)
print(f'Final test accuracy with k={best_k}: {test_accuracy:.3f}')

ข้อผิดพลาดที่พบบ่อยเมื่อเลือก k

ข้อผิดพลาดที่พบบ่อยสามประการที่ควรหลีกเลี่ยง: (1) ประเมินด้วยข้อมูลฝึก — k=1 จะได้คะแนน 100% เสมอ ทำให้ดูเหมือนเป็นค่าที่เหมาะสมที่สุด ควรใช้ข้อมูลที่กันไว้ออกจากการฝึกหรือข้อมูลจากการตรวจสอบไข้เสมอ (2) ไม่ปรับขนาดคุณลักษณะ ก่อนเลือก k — ค่า k ที่เหมาะสมที่สุดขึ้นอยู่กับเรขาคณิตของระยะห่าง ซึ่งเปลี่ยนไปเมื่อปรับขนาดข้อมูล ควรรวมตัวปรับขนาดไว้ในกระบวนการทำงานก่อนค้นหาไฮเปอร์พารามิเตอร์เสมอ (3) เลือก k โดยไม่คำนึงถึงขนาดชุดข้อมูล — หลักคร่าว ๆ คือเริ่มจาก k ประมาณ sqrt(N) โดย N คือขนาดชุดข้อมูลฝึก แล้วปรับปรุงผ่าน CV

import numpy as np

N_train = 1000  # training samples

# Rule of thumb starting point
k_start = int(np.sqrt(N_train))
print(f'sqrt(N) starting point: k = {k_start}')

# Then sweep around this value
k_candidates = list(range(max(1, k_start - 10), k_start + 11, 2))
print('Candidates to sweep:', k_candidates)

# AVOID:
# knn.score(X_train, y_train) -- always pick k=1
# Not including scaler in pipeline before CV

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดการเรียนรู้ของเครื่องด้วยไพธอนจากบทเรียนนี้

สรุปบทเรียน

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

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Machine Learning Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Machine Learning Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ”

ผู้เรียนจะทดลองค่า k ตั้งแต่ 1 ถึง 30 วาดความแม่นยำจากการตรวจสอบ และระบุจุดเหมาะสมที่สร้างสมดุลระหว่างอคติกับความแปรปรวน คุณปฏิบัติ Machine Learning Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Machine Learning Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Machine Learning Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Machine Learning Academy นี้ได้ไหม

ได้ บทเรียน Machine Learning Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. KNN ทำงานอย่างไร: ระยะทาง เพื่อนบ้าน และคะแนนโหวต
  2. การเลือก k: วิธีข้อศอกและเส้นโค้งการตรวจสอบ
  3. ตัวชี้วัดระยะทาง: ยุคลิด แมนฮัตตัน และมินคอฟสกี
  4. KNN สำหรับการถดถอยและข้อจำกัดด้านการขยายขนาด
← กลับไปที่ Machine Learning Academy