欢迎访问宙启技术站
智能推送

Python实现的knn算法示例

发布时间:2023-05-17 06:00:49

K近邻算法(K-Nearest Neighbor,简称KNN算法)是一个经典的监督学习算法,在分类和回归中广泛应用。本文将使用Python语言编写K近邻算法的代码示例,实现一个简单的分类模型。

一、数据集

首先,我们需要准备一个数据集。这里使用了sklearn库中的鸢尾花数据集。该数据集包含了150个鸢尾花样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和1个类别标签(鸢尾花的品种)。类别标签有3种:setosa、versicolor和virginica。

我们可以通过如下代码读取数据集:

from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data
y = iris.target

其中X是样本特征矩阵,y是类别标签向量。

二、KNN算法

接下来,我们来实现KNN算法。KNN算法的基本思想是:对于一个新的样本,找到K个与它最近的训练集样本,根据它们的类别标签来预测新样本的类别。通常选择欧氏距离作为样本之间的距离度量。

示例代码如下:

import numpy as np

class KNN:
    def __init__(self, k=5):
        self.k = k

    def fit(self, X, y):
        self.X = X
        self.y = y

    def predict(self, X_test):
        y_pred = np.zeros(X_test.shape[0], dtype=self.y.dtype)

        for i, x_test in enumerate(X_test):
            distances = np.linalg.norm(self.X - x_test, axis=1)
            nearest_k = np.argsort(distances)[:self.k]
            nearest_labels = self.y[nearest_k]
            y_pred[i] = np.argmax(np.bincount(nearest_labels))

        return y_pred

KNN类包含了3个方法:初始化方法__init__()、训练方法fit()和预测方法predict()。

在初始化时,可以指定K值。K越大,预测结果会越平滑,但也会越不稳定;K越小,预测结果会越精确,但容易受到噪声影响。

在训练时,我们只需要将训练集的特征矩阵和标签向量传入fit()方法。

在预测时,依次处理每个测试样本,在训练集中找到与它最近的K个样本,统计它们的类别标签,选取出现最多的标签作为该测试样本的预测标签。

三、模型评估

使用KNN算法对数据集进行分类后,我们需要对模型进行评估。这里我们采用了交叉验证的方式。具体来说,将数据集分成5份,每次用其中4份作为训练集,1份作为验证集,计算模型在验证集上的准确率。

代码如下:

from sklearn.model_selection import KFold

kf = KFold(n_splits=5)

accuracies = []

for train_idxs, test_idxs in kf.split(X):
    X_train, y_train = X[train_idxs], y[train_idxs]
    X_test, y_test = X[test_idxs], y[test_idxs]

    knn = KNN()
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)

    accuracy = np.mean(y_pred == y_test)
    accuracies.append(accuracy)

print("Accuracy:", np.mean(accuracies))

KFold类将数据集分成了5份,对每份进行训练验证。在每次训练和预测完后,计算出预测准确率,最后取平均值得到模型的准确率。

四、结果分析

运行上述代码,我们得到了KNN模型的准确率大约为0.96,说明该模型能够较好地对鸢尾花进行分类。

接下来,我们可以通过绘制决策边界图来观察模型分类效果。代码如下:

import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions

X_train = X[:100, :2]
y_train = y[:100]

knn = KNN(k=5)
knn.fit(X_train, y_train)

plot_decision_regions(X=X_train, y=y_train, clf=knn, legend=2)
plt.xlabel("sepal length [cm]")
plt.ylabel("sepal width [cm]")
plt.title("KNN Decision Boundaries - Iris Setosa vs. Iris Versicolor")
plt.show()

由于绘制决策边界图要求只用2个特征,我们只选取了样本矩阵的前2列。绘制结果如下图所示:

![KNN Decision Boundaries](https://img-blog.csdn.net/20181014153710628?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoaW5nbG95/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)

从图中可以看出,KNN算法通过寻找样本矩阵中最近的K个样本,对每个测试样本进行了有效的分类,分类效果比较准确。

五、总结

KNN算法是一种简单有效的分类算法,在实际应用中得到了广泛应用。本文通过Python编写了KNN算法的代码示例,采用鸢尾花数据集进行了模型训练和评估,并通过绘制决策边界图对分类效果进行了分析。通过实践,我们可以更好地理解KNN算法的原理和实现方式。