【Pytroch】基于K鄰近算法的數據分類預測(Excel可直接替換數據)
- 1.模型原理
- 2.數學公式
- 3.文件結構
- 4.Excel數據
- 5.下載地址
- 6.完整代碼
- 7.運行結果
1.模型原理
K最近鄰(K-Nearest Neighbors,簡稱KNN)是一種簡單但常用的機器學習算法,用于分類和回歸問題。它的核心思想是基于已有的訓練數據,通過測量樣本之間的距離來進行分類預測。在實現KNN算法時,可以使用PyTorch來進行計算和操作。
下面是使用PyTorch實現KNN算法的一般步驟:
-
準備數據集:首先,需要準備訓練數據集,包括樣本特征和對應的標簽。
-
計算距離:對于每個待預測的樣本,計算它與訓練數據集中每個樣本的距離。常見的距離度量包括歐氏距離、曼哈頓距離等。
-
排序與選擇:將計算得到的距離按照從小到大的順序進行排序,并選擇距離最近的K個樣本。
-
投票或平均:對于分類問題,選擇K個樣本中出現最多的類別作為預測結果;對于回歸問題,選擇K個樣本的標簽的平均值作為預測結果。
2.數學公式
當使用K最近鄰(KNN)算法進行數據分類預測時,以下是其基本原理的數學描述:
-
距離度量:假設我們有一個訓練數據集 D D D,其中包含 n n n 個樣本。每個樣本 x i x_i xi? 都有 m m m 個特征,可以表示為 x i = ( x i 1 , x i 2 , … , x i m ) x_i = (x_{i1}, x_{i2}, \ldots, x_{im}) xi?=(xi1?,xi2?,…,xim?)。對于一個待預測的樣本 x new x_{\text{new}} xnew?,我們需要計算它與訓練集中每個樣本的距離。常見的距離度量方式包括歐氏距離(Euclidean Distance)和曼哈頓距離(Manhattan Distance)等:
-
歐氏距離: d ( x i , x new ) = ∑ j = 1 m ( x i j ? x new , j ) 2 d(x_i, x_{\text{new}}) = \sqrt{\sum_{j=1}^m (x_{ij} - x_{\text{new},j})^2} d(xi?,xnew?)=∑j=1m?(xij??xnew,j?)2?
-
曼哈頓距離: d ( x i , x new ) = ∑ j = 1 m ∣ x i j ? x new , j ∣ d(x_i, x_{\text{new}}) = \sum_{j=1}^m |x_{ij} - x_{\text{new},j}| d(xi?,xnew?)=∑j=1m?∣xij??xnew,j?∣
-
-
排序與選擇:計算完待預測樣本與所有訓練樣本的距離后,我們將距離按照從小到大的順序排序。然后選擇距離最近的 K K K 個訓練樣本。
-
投票或平均:對于分類問題,我們可以統計這 K K K 個樣本中每個類別出現的次數,然后選擇出現次數最多的類別作為預測結果。這就是所謂的“投票法”:
- y ^ = argmax c ∑ i = 1 K I ( y i = c ) \hat{y} = \text{argmax}_{c} \sum_{i=1}^{K} I(y_i = c) y^?=argmaxc?∑i=1K?I(yi?=c)
其中, y ^ \hat{y} y^? 是預測的類別, y i y_i yi? 是第 i i i 個樣本的真實類別, c c c 是類別。
對于回歸問題,我們可以選擇 K K K 個樣本的標簽的平均值作為預測結果。
總結起來,K最近鄰算法的基本原理是通過測量樣本之間的距離來進行分類預測。對于分類問題,通過投票法確定預測類別;對于回歸問題,通過取標簽的平均值來預測數值。在實際應用中,需要選擇合適的距離度量和適當的 K K K 值,以及進行必要的數據預處理和特征工程。
3.文件結構
iris.xlsx % 可替換數據集
Main.py % 主函數
4.Excel數據
5.下載地址
- Excle資源下載地址
6.完整代碼
import torch
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as pltdef knn(X_train, y_train, X_test, k=5):X_train = torch.tensor(X_train, dtype=torch.float32)X_test = torch.tensor(X_test, dtype=torch.float32)y_train = torch.tensor(y_train, dtype=torch.long)predictions = []for i in range(X_test.shape[0]):distances = torch.sum((X_train - X_test[i]) ** 2, dim=1)_, indices = torch.topk(distances, k, largest=False) # 獲取距離最小的k個鄰居的索引knn_labels = y_train[indices]pred = torch.mode(knn_labels).values # 投票選出標簽predictions.append(pred.item())return predictionsdef plot_confusion_matrix(conf_matrix, classes):plt.figure(figsize=(8, 6))plt.imshow(conf_matrix, cmap=plt.cm.Blues, interpolation='nearest')plt.title("Confusion Matrix")plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes)plt.yticks(tick_marks, classes)plt.xlabel("Predicted Label")plt.ylabel("True Label")plt.tight_layout()plt.show()def plot_predictions_vs_true(y_true, y_pred):plt.figure(figsize=(10, 6))plt.plot(y_true, 'go', label='True Labels')plt.plot(y_pred, 'rx', label='Predicted Labels')plt.title("True Labels vs Predicted Labels")plt.xlabel("Sample Index")plt.ylabel("Class Label")plt.legend()plt.show()def main():# 讀取Data.xlsx文件并加載數據data = pd.read_excel("iris.xlsx")# 劃分特征值和標簽features = data.iloc[:, :-1].valueslabels = data.iloc[:, -1].values# 將數據集拆分為訓練集和測試集X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)y_pred = knn(X_train, y_train, X_test, k=5)print("真實值:",y_test)print("預測值:", y_pred)accuracy = accuracy_score(y_test, y_pred)print("訓練集準確率:{:.2%}".format(accuracy))conf_matrix = confusion_matrix(y_test, y_pred)print("混淆矩陣:")print(conf_matrix)classes = np.unique(y_test)plot_confusion_matrix(conf_matrix, classes)plot_predictions_vs_true(y_test, y_pred)if __name__ == "__main__":main()
7.運行結果