Python实现的knn算法示例
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算法通过寻找样本矩阵中最近的K个样本,对每个测试样本进行了有效的分类,分类效果比较准确。
五、总结
KNN算法是一种简单有效的分类算法,在实际应用中得到了广泛应用。本文通过Python编写了KNN算法的代码示例,采用鸢尾花数据集进行了模型训练和评估,并通过绘制决策边界图对分类效果进行了分析。通过实践,我们可以更好地理解KNN算法的原理和实现方式。
