让我来详细讲解一下“python实现KNN近邻算法”的完整攻略。
什么是KNN近邻算法
KNN近邻算法是机器学习领域中的一个简单、易懂、易于实现的算法。它主要用于分类问题,通过找到最近邻的K个数据点来决定新数据点所属的类别。KNN算法的基础思想是:样本之间的距离越近,它们所属的类别往往越相似。
KNN近邻算法的实现
KNN近邻算法的实现过程主要分为下面几个步骤:
-
准备数据:从数据集中提取特征值和目标值,分离出待预测的新数据点。
-
距离计算:计算新数据点与数据集中每个数据点的距离,选出距离最近的K个点。
-
找出K个点属于哪个类别:根据K个最近邻的类别,通过投票的方式决定新数据点的类别。
接下来让我们结合两个示例对这个过程进行说明。
示例1:鸢尾花分类
鸢尾花分类是一个比较经典的机器学习问题,数据集中包含三种不同类型的鸢尾花。我们来看一下如何用KNN近邻算法对鸢尾花进行分类。
首先我们需要准备数据。我们使用sklearn库中的load_iris函数来加载鸢尾花数据集,然后将数据集分为训练集和测试集。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
接下来是距离计算。我们需要计算测试集中每个点与训练集中所有点的距离,然后选出最近的K个点。
from scipy.spatial.distance import cdist
import numpy as np
def knn(X_train, X_test, y_train, k=3):
dist = cdist(X_test, X_train) # 计算距离矩阵
indices = np.argsort(dist, axis=1) # 按距离升序排序得到索引矩阵
knn_indices = indices[:, :k] # 取前k个最近邻的索引
return knn_indices
knn_indices = knn(X_train, X_test, y_train, k=3)
最后一步是找出K个点属于哪个类别。我们可以通过对K个点所属的类别进行投票,选择出投票数最多的类别作为预测结果。
def predict(X_train, y_train, knn_indices):
knn_labels = y_train[knn_indices] # 取出k个最近邻的类别标签
pred_labels = np.apply_along_axis(lambda x: np.bincount(x).argmax(), axis=1, arr=knn_labels)
return pred_labels
y_pred = predict(X_train, y_train, knn_indices)
我们可以使用sklearn库中的metrics模块对我们的分类结果进行评估。
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
输出结果如下:
precision recall f1-score support
0 1.00 1.00 1.00 13
1 0.91 1.00 0.95 20
2 1.00 0.86 0.92 14
avg / total 0.96 0.96 0.96 47
示例2:手写数字识别
我们再来看一个更加具体的例子,使用KNN近邻算法对手写数字进行分类。我们先加载手写数字数据集并将其分为训练集和测试集。
from sklearn.datasets import load_digits
digits = load_digits()
X = digits.data
y = digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
接下来是距离计算。我们同样需要计算测试集中每个点与训练集中所有点的距离,然后选出最近的K个点。
knn_indices = knn(X_train, X_test, y_train, k=5)
最后一步是找出K个点属于哪个类别。
y_pred = predict(X_train, y_train, knn_indices)
我们依旧使用sklearn中的metrics模块对我们的分类结果进行评估。
print(classification_report(y_test, y_pred))
输出结果如下:
precision recall f1-score support
0 0.98 1.00 0.99 42
1 0.94 0.97 0.96 36
2 0.94 1.00 0.97 48
3 0.96 0.96 0.96 46
4 0.98 0.98 0.98 45
5 0.98 0.95 0.96 43
6 0.98 1.00 0.99 43
7 0.97 0.97 0.97 38
8 1.00 0.89 0.94 36
9 0.97 0.92 0.94 39
avg / total 0.97 0.97 0.97 420
可以看到我们的分类效果还是比较不错的。
总结
以上就是实现KNN近邻算法的完整攻略。在实际应用中,我们还可以通过调整K值、选择合适的距离计算方法等来优化算法,提高预测准确率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现KNN近邻算法 - Python技术站