選單
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Python 教程

Python 主頁 Python 簡介 Python 入門 Python 語法 Python 註釋 Python 變數 Python 資料型別 Python 數字 Python 型別轉換 Python 字串 Python 布林值 Python 運算子 Python 列表 Python 元組 Python 集合 Python 字典 Python If...Else Python While 迴圈 Python For 迴圈 Python 函式 Python Lambda Python 陣列 Python 類/物件 Python 繼承 Python 迭代器 Python 多型 Python 作用域 Python 模組 Python 日期 Python 數學 Python JSON Python 正則表示式 Python PIP Python Try...Except Python 使用者輸入 Python 字串格式化

檔案處理

Python 檔案處理 Python 讀取檔案 Python 寫入/建立檔案 Python 刪除檔案

Python 模組

NumPy 教程 Pandas 教程 SciPy 教程 Django 教程

Python Matplotlib

Matplotlib 簡介 Matplotlib 入門 Matplotlib Pyplot Matplotlib 繪圖 Matplotlib 標記 Matplotlib 線條 Matplotlib 標籤 Matplotlib 網格 Matplotlib 子圖 Matplotlib 散點圖 Matplotlib 條形圖 Matplotlib 直方圖 Matplotlib 餅圖

機器學習

入門 均值、中位數、眾數 標準差 百分位數 資料分佈 正態資料分佈 散點圖 線性迴歸 多項式迴歸 多元迴歸 縮放 訓練/測試 決策樹 混淆矩陣 層次聚類 邏輯迴歸 網格搜尋 分類資料 K-means Bootstrap Aggregation 交叉驗證 AUC - ROC 曲線 K 近鄰

Python MySQL

MySQL 入門 MySQL 建立資料庫 MySQL 建立表 MySQL 插入 MySQL 選擇 MySQL Where MySQL Order By MySQL 刪除 MySQL 刪除表 MySQL 更新 MySQL Limit MySQL Join

Python MongoDB

MongoDB 入門 MongoDB 建立資料庫 MongoDB 集合 MongoDB 插入 MongoDB Find MongoDB Query MongoDB Sort MongoDB 刪除 MongoDB 刪除集合 MongoDB 更新 MongoDB Limit

Python 參考

Python 概述 Python 內建函式 Python 字串方法 Python 列表方法 Python 字典方法 Python 元組方法 Python 集合方法 Python 檔案方法 Python 關鍵字 Python 異常 Python 詞彙表

模組參考

Random 模組 Requests 模組 Statistics 模組 Math 模組 cMath 模組

Python 如何操作

刪除列表重複項 反轉字串 兩個數字相加

Python 示例

Python 示例 Python 編譯器 Python 練習 Python 測驗 Python 伺服器 Python 面試問答 Python 訓練營 Python 證書

機器學習 - K 近鄰 (KNN)


在此頁面上,W3schools.com 與 紐約資料科學學院 合作,為我們的學生提供數字培訓內容。


KNN

KNN 是一種簡單、監督式的機器學習 (ML) 演算法,可用於分類或迴歸任務,並且經常用於缺失值填充。它的基本思想是,給定資料點最近的觀測值是資料集中最“相似”的觀測值,因此我們可以根據最接近的現有資料點的值來對未知的點進行分類。透過選擇 K,使用者可以選擇要在演算法中使用多少個附近的觀測值。

在這裡,我們將向您展示如何實現 KNN 演算法進行分類,並展示不同 K 值如何影響結果。


它是如何工作的?

K 是要使用的最近鄰的數量。對於分類,多數投票用於確定新觀測值應屬於哪個類別。較大的 K 值通常對異常值更具魯棒性,並且比非常小的值產生更穩定的決策邊界(K=3K=1 更好,後者可能會產生不良結果。

示例

首先,視覺化一些資料點

import matplotlib.pyplot as plt

x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

plt.scatter(x, y, c=classes)
plt.show()

結果

執行示例 »

廣告


現在,我們使用 K=1 來擬合 KNN 演算法

from sklearn.neighbors import KNeighborsClassifier

data = list(zip(x, y))
knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(data, classes)

並使用它來分類新的資料點

示例

new_x = 8
new_y = 21
new_point = [(new_x, new_y)]

prediction = knn.predict(new_point)

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

結果

執行示例 »

現在,我們做同樣的事情,但使用一個更高的 K 值,這會改變預測結果

示例

knn = KNeighborsClassifier(n_neighbors=5)

knn.fit(data, classes)

prediction = knn.predict(new_point)

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

結果

執行示例 »

示例解釋

匯入所需的模組。

你可以在我們的 “Matplotlib 教程”中瞭解 Matplotlib 模組。

scikit-learn 是 Python 中一個流行的機器學習庫。

import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

建立類似資料集變數的陣列。我們有兩個輸入特徵(`x` 和 `y`),然後是一個目標類別(`class`)。帶有目標類別的輸入特徵將用於預測新資料的類別。請注意,雖然我們這裡只使用了兩個輸入特徵,但此方法適用於任何數量的變數

x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

將輸入特徵轉換為一組點

data = list(zip(x, y))
print(data)

結果

[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (8, 22), (10, 21), (12, 21)]

使用輸入特徵和目標類別,我們在模型上使用 1 個最近鄰擬合 KNN 模型

knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data, classes)

然後,我們可以使用同一個 KNN 物件來預測新的、未預測資料點的類別。首先,我們建立新的 x 和 y 特徵,然後呼叫 knn.predict() 來獲取 0 或 1 的類別

new_x = 8
new_y = 21
new_point = [(new_x, new_y)]
prediction = knn.predict(new_point)
print(prediction)

結果

[0]

當我們繪製所有資料以及新點和類別時,我們可以看到它已被標記為藍色,屬於 1 類別。文字註釋只是為了突出顯示新點的位置

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

結果

但是,當我們改變鄰居的數量為 5 時,用於對新點進行分類的點數會改變。結果,新點的分類也隨之改變

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(data, classes)
prediction = knn.predict(new_point)
print(prediction)

結果

[1]

當我們繪製新點的類別以及舊點時,我們會注意到顏色已根據關聯的類別標籤發生變化

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

結果


×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援