Python语言实现K-近邻算法 (K-Nearest Neighbors, KNN)

K-近邻算法 (K-Nearest Neighbors, KNN) 是一种基于实例的简单且直观的分类算法。它通过计算测试样本与训练样本之间的距离,找到距离最近的 K 个训练样本,然后根据这些样本的标签进行投票,来确定测试样本的类别。下面是一个简单的 Python 实现 KNN 的示例。

import numpy as np
from collections import Counter
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 定义欧几里得距离计算函数
def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2) ** 2))

# KNN算法实现
class KNN:
    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 = [euclidean_distance(x, x_train) for x_train in self.X_train]
        # 找到距离最近的k个点
        k_indices = np.argsort(distances)[:self.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]

# 加载Iris数据集
iris = load_iris()
X, y = iris.data, iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用KNN模型
k = 3
knn = KNN(k=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"K={k}, Accuracy: {accuracy:.2f}")


代码解释:

  1. 欧几里得距离函数: euclidean_distance(x1, x2) 计算两个点之间的距离。
  2. KNN类: 包含 fitpredict 方法,fit 方法用于保存训练数据,predict 方法用于对测试数据进行分类。
  3. 投票机制: 在 _predict 方法中,我们先计算测试样本和所有训练样本的距离,然后选择距离最近的 K 个样本,最后通过投票(多数投票)确定测试样本的类别。
  4. 准确率: 使用 accuracy_score 来评估模型在测试集上的性能。

扩展:

  • 可以更改距离度量方式,比如曼哈顿距离。
  • 可以使用加权KNN,让距离较近的邻居有更大的投票权重。

你可以使用 scikit-learn 库中的 KNeighborsClassifier 进行更优化的实现,但这个例子展示了如何从头手写KNN算法的基本原理。

K-近邻算法 (K-Nearest Neighbors, KNN) 是一种基于实例的简单且直观的分类算法。它通过计算测试样本与训练样本之间的距离,找到距离最近的 K 个训练样本,然后根据这些样本的标签进行投票,来确定测试样本的类别。下面是一个简单的 Python 实现 KNN 的示例。

import numpy as np
from collections import Counter
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 定义欧几里得距离计算函数
def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2) ** 2))

# KNN算法实现
class KNN:
    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 = [euclidean_distance(x, x_train) for x_train in self.X_train]
        # 找到距离最近的k个点
        k_indices = np.argsort(distances)[:self.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]

# 加载Iris数据集
iris = load_iris()
X, y = iris.data, iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用KNN模型
k = 3
knn = KNN(k=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"K={k}, Accuracy: {accuracy:.2f}")


代码解释:

  1. 欧几里得距离函数: euclidean_distance(x1, x2) 计算两个点之间的距离。
  2. KNN类: 包含 fitpredict 方法,fit 方法用于保存训练数据,predict 方法用于对测试数据进行分类。
  3. 投票机制: 在 _predict 方法中,我们先计算测试样本和所有训练样本的距离,然后选择距离最近的 K 个样本,最后通过投票(多数投票)确定测试样本的类别。
  4. 准确率: 使用 accuracy_score 来评估模型在测试集上的性能。

扩展:

  • 可以更改距离度量方式,比如曼哈顿距离。
  • 可以使用加权KNN,让距离较近的邻居有更大的投票权重。

你可以使用 scikit-learn 库中的 KNeighborsClassifier 进行更优化的实现,但这个例子展示了如何从头手写KNN算法的基本原理。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在