如何在Python中实现KNN算法的曼哈顿距离
K最近邻(KNN)是一种用于分类和回归的非参数监督学习算法。它的核心思想是根据训练数据中距离测试样本最近的K个邻居来进行预测。本文将详细介绍如何在Python中实现KNN算法,并使用曼哈顿距离来计算数据点间的距离。
整体流程
下面是实现KNN算法的整体流程:
步骤 | 描述 |
---|---|
1 | 准备数据集 |
2 | 实现计算曼哈顿距离的函数 |
3 | 实现KNN算法的主逻辑 |
4 | 测试算法并进行预测 |
5 | 可视化结果 |
流程图
以下是整个流程的可视化表示:
flowchart TD
A[准备数据集] --> B[实现曼哈顿距离函数]
B --> C[实现KNN算法]
C --> D[测试算法]
D --> E[可视化结果]
各步骤详解
步骤1:准备数据集
我们首先需要一个数据集来进行KNN算法的训练。在这里,我们将使用NumPy库来创建一个简单的二维数据集。
import numpy as np
# 创建数据集,包含样本特征和对应的标签
# 特征:x1, x2 ; 标签:0或1
data = np.array([[1, 2, 0],
[2, 3, 0],
[3, 3, 1],
[6, 5, 1],
[7, 8, 1]])
# 提取特征和标签
X = data[:, :2] # 前两列是特征
y = data[:, 2] # 第三列是标签
步骤2:实现计算曼哈顿距离的函数
曼哈顿距离是两点间的绝对距离之和,定义如下: [ D_{Manhattan}(p, q) = \sum_{i=1}^{n} |p_i - q_i| ]
以下是实现曼哈顿距离的代码:
def manhattan_distance(point1, point2):
"""
计算两个数据点之间的曼哈顿距离
:param point1: 第一个数据点
:param point2: 第二个数据点
:return: 曼哈顿距离
"""
return np.sum(np.abs(point1 - point2))
步骤3:实现KNN算法的主逻辑
我们接下来实现KNN算法的主要逻辑,包括计算每个邻居的距离并进行投票。
def knn(X_train, y_train, X_test, k=3):
"""
KNN算法的实现
:param X_train: 训练样本特征
:param y_train: 训练样本标签
:param X_test: 测试样本特征
:param k: 选择的邻居数量
:return: 测试样本的预测标签
"""
predictions = []
for test_point in X_test:
# 计算训练集中每个点到测试点的曼哈顿距离
distances = [manhattan_distance(test_point, train_point) for train_point in X_train]
# 找到距离最近的k个样本的标签
k_indices = np.argsort(distances)[:k]
k_nearest_labels = [y_train[i] for i in k_indices]
# 找到最近邻的多数投票结果
prediction = np.bincount(k_nearest_labels).argmax()
predictions.append(prediction)
return np.array(predictions)
步骤4:测试算法并进行预测
现在,我们将使用测试数据来评估KNN算法的效果。
# 测试数据
X_test = np.array([[1, 1],
[5, 5]])
# 进行预测
predicted_labels = knn(X, y, X_test, k=3)
print(f'预测标签: {predicted_labels}') # 输出预测标签
步骤5:可视化结果
我们可以使用Matplotlib库来绘制数据点,观察KNN算法的效果。
import matplotlib.pyplot as plt
# 绘制训练数据
plt.scatter(X[:, 0], X[:, 1], c=y, marker='o', label='Train Data')
# 绘制测试数据
plt.scatter(X_test[:, 0], X_test[:, 1], c='red', marker='x', label='Test Data')
plt.title('KNN Visualization')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
饼状图展示
为了可视化我们对预测结果的分析,我们可以使用饼状图来展示预测与实际结果的关系。
pie
title 预测类别分布
"类别 0": 1
"类别 1": 1
结尾
综上所述,我们成功实现了K最近邻(KNN)算法,并利用曼哈顿距离计算数据点间的距离。通过这个简单的例子,你可以看到KNN算法如何对数据进行分类。通过理解整个流程以及Python代码的实现,你可以将这个算法应用于更多复杂的数据集上。
希望这篇文章能帮助你更好地理解KNN算法的实现过程,祝你在机器学习的旅途中一路顺风!