溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用python實現KNN分類器

發布時間:2021-12-27 13:57:58 來源:億速云 閱讀:240 作者:iii 欄目:大數據

怎么用Python實現KNN分類器

目錄

  1. 引言
  2. KNN算法簡介
  3. KNN算法的數學基礎
  4. Python實現KNN分類器
  5. KNN的優化與改進
  6. KNN在實際中的應用
  7. 總結
  8. 參考文獻

引言

K近鄰(K-Nearest Neighbors, KNN)算法是一種簡單而有效的分類和回歸方法。它屬于監督學習算法,廣泛應用于模式識別、數據挖掘和機器學習領域。KNN算法的核心思想是通過計算待分類樣本與訓練集中所有樣本的距離,找到距離最近的K個樣本,然后根據這K個樣本的類別來決定待分類樣本的類別。

本文將詳細介紹如何使用Python實現KNN分類器,并探討KNN算法的數學基礎、優化方法以及在實際中的應用。

KNN算法簡介

2.1 KNN的基本概念

KNN算法是一種基于實例的學習方法,它不需要顯式的訓練過程,而是通過存儲訓練數據集來進行預測。KNN算法的基本假設是相似的樣本在特征空間中距離較近,因此可以通過計算待分類樣本與訓練集中樣本的距離來進行分類。

2.2 KNN的工作原理

KNN算法的工作原理可以概括為以下幾個步驟:

  1. 計算距離:計算待分類樣本與訓練集中每個樣本的距離。
  2. 選擇K個最近鄰:根據距離選擇K個最近的樣本。
  3. 投票決策:根據K個最近鄰的類別進行投票,決定待分類樣本的類別。

2.3 KNN的優缺點

優點: - 簡單易懂,易于實現。 - 無需訓練過程,適合在線學習。 - 對數據分布沒有假設,適用于各種類型的數據。

缺點: - 計算復雜度高,尤其是當數據集較大時。 - 對噪聲數據敏感,容易受到異常值的影響。 - 需要選擇合適的K值,K值的選擇對結果影響較大。

KNN算法的數學基礎

3.1 距離度量

在KNN算法中,距離度量是一個關鍵步驟。常用的距離度量方法包括:

  • 歐氏距離(Euclidean Distance): [ d(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2} ]

  • 曼哈頓距離(Manhattan Distance): [ d(x, y) = \sum_{i=1}^{n} |x_i - y_i| ]

  • 閔可夫斯基距離(Minkowski Distance): [ d(x, y) = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{1/p} ]

  • 余弦相似度(Cosine Similarity): [ \text{cosine}(x, y) = \frac{x \cdot y}{|x| |y|} ]

3.2 K值的選擇

K值的選擇對KNN算法的性能有重要影響。K值過小會導致模型對噪聲敏感,容易過擬合;K值過大會導致模型過于簡單,容易欠擬合。常用的K值選擇方法包括:

  • 交叉驗證(Cross-Validation):通過交叉驗證選擇最優的K值。
  • 經驗法則:通常選擇K值為訓練樣本數的平方根。

Python實現KNN分類器

4.1 數據準備

在實現KNN分類器之前,首先需要準備數據集。我們可以使用Python中的sklearn庫提供的數據集,如Iris數據集。

from sklearn.datasets import load_iris
import pandas as pd

# 加載Iris數據集
iris = load_iris()
X = iris.data
y = iris.target

# 將數據轉換為DataFrame
df = pd.DataFrame(X, columns=iris.feature_names)
df['target'] = y
print(df.head())

4.2 數據預處理

在訓練模型之前,通常需要對數據進行預處理,包括數據標準化、歸一化等。

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 數據標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)

4.3 KNN分類器的實現

接下來,我們可以使用Python實現KNN分類器。首先,我們需要計算待分類樣本與訓練集中每個樣本的距離,然后選擇K個最近鄰,最后根據投票結果決定待分類樣本的類別。

import numpy as np
from collections import Counter

class KNNClassifier:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        predictions = [self._predict(x) for x in X_test]
        return np.array(predictions)

    def _predict(self, x):
        # 計算距離
        distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
        # 獲取K個最近鄰的索引
        k_indices = np.argsort(distances)[:self.k]
        # 獲取K個最近鄰的標簽
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        # 投票決定類別
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]

# 實例化KNN分類器
knn = KNNClassifier(k=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)

4.4 模型評估

在訓練完模型后,我們需要評估模型的性能。常用的評估指標包括準確率、精確率、召回率和F1分數。

from sklearn.metrics import accuracy_score, classification_report

# 計算準確率
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.2f}")

# 打印分類報告
print(classification_report(y_test, predictions, target_names=iris.target_names))

KNN的優化與改進

5.1 特征選擇

特征選擇是提高KNN算法性能的重要手段。通過選擇與目標變量相關性較高的特征,可以減少噪聲的影響,提高模型的準確性。

from sklearn.feature_selection import SelectKBest, f_classif

# 選擇前兩個最重要的特征
selector = SelectKBest(f_classif, k=2)
X_new = selector.fit_transform(X, y)

5.2 距離加權

在KNN算法中,距離加權是一種常見的優化方法。通過給距離較近的樣本賦予更高的權重,可以提高模型的準確性。

class WeightedKNNClassifier:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        predictions = [self._predict(x) for x in X_test]
        return np.array(predictions)

    def _predict(self, x):
        # 計算距離
        distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
        # 獲取K個最近鄰的索引
        k_indices = np.argsort(distances)[:self.k]
        # 獲取K個最近鄰的標簽和距離
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        k_nearest_distances = [distances[i] for i in k_indices]
        # 計算權重
        weights = [1 / (d + 1e-5) for d in k_nearest_distances]
        # 加權投票決定類別
        weighted_votes = {}
        for label, weight in zip(k_nearest_labels, weights):
            if label in weighted_votes:
                weighted_votes[label] += weight
            else:
                weighted_votes[label] = weight
        # 返回得票最多的類別
        return max(weighted_votes, key=weighted_votes.get)

# 實例化加權KNN分類器
weighted_knn = WeightedKNNClassifier(k=3)
weighted_knn.fit(X_train, y_train)
weighted_predictions = weighted_knn.predict(X_test)

5.3 降維技術

當數據集的特征維度較高時,KNN算法的計算復雜度會顯著增加。通過降維技術,可以減少特征維度,提高算法的效率。

from sklearn.decomposition import PCA

# 使用PCA降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 可視化降維后的數據
import matplotlib.pyplot as plt

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA of Iris Dataset')
plt.show()

KNN在實際中的應用

6.1 圖像分類

KNN算法可以用于圖像分類任務。通過提取圖像的特征向量,可以使用KNN算法對圖像進行分類。

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

# 加載MNIST數據集
mnist = fetch_openml('mnist_784')
X = mnist.data
y = mnist.target.astype(int)

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用KNN分類器
knn = KNNClassifier(k=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.2f}")

6.2 文本分類

KNN算法也可以用于文本分類任務。通過將文本轉換為特征向量,可以使用KNN算法對文本進行分類。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups

# 加載20 Newsgroups數據集
newsgroups = fetch_20newsgroups(subset='all')
X = newsgroups.data
y = newsgroups.target

# 將文本轉換為TF-IDF特征向量
vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(X)

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_tfidf, y, test_size=0.2, random_state=42)

# 使用KNN分類器
knn = KNNClassifier(k=3)
knn.fit(X_train.toarray(), y_train)
predictions = knn.predict(X_test.toarray())

# 計算準確率
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.2f}")

6.3 推薦系統

KNN算法可以用于推薦系統中,通過計算用戶之間的相似度,推薦相似用戶喜歡的物品。

from sklearn.neighbors import NearestNeighbors
import pandas as pd

# 假設我們有一個用戶-物品評分矩陣
ratings = pd.DataFrame({
    'user_id': [1, 1, 2, 2, 3, 3],
    'item_id': [1, 2, 1, 3, 2, 3],
    'rating': [5, 3, 4, 2, 5, 1]
})

# 將評分矩陣轉換為用戶-物品矩陣
user_item_matrix = ratings.pivot(index='user_id', columns='item_id', values='rating').fillna(0)

# 使用KNN算法找到相似用戶
knn = NearestNeighbors(n_neighbors=2, metric='cosine')
knn.fit(user_item_matrix)

# 找到與用戶1最相似的用戶
distances, indices = knn.kneighbors(user_item_matrix.iloc[0:1, :])
print(f"與用戶1最相似的用戶: {indices[0][1]}")

總結

KNN算法是一種簡單而有效的分類和回歸方法,廣泛應用于各種機器學習任務中。本文詳細介紹了KNN算法的基本原理、數學基礎、Python實現方法以及在實際中的應用。通過本文的學習,讀者可以掌握如何使用Python實現KNN分類器,并了解如何優化和改進KNN算法以提高其性能。

參考文獻

  1. Cover, T., & Hart, P. (1967). Nearest neighbor pattern classification. IEEE Transactions on Information Theory, 13(1), 21-27.
  2. Altman, N. S. (1992). An introduction to kernel and nearest-neighbor nonparametric regression. The American Statistician, 46(3), 175-185.
  3. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction. Springer.
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女