一、k-近邻算法概述
K-近邻(K-Nearest Neighbors,简称KNN)算法是一种基于实例的学习,或者说是局部逼近和将所有的计算推迟到分类之后的惰性学习。它是一种基本的机器学习算法,主要用于分类和回归问题。在分类问题中,KNN算法通过测量不同数据点之间的距离进行分类。
KNN的工作原理是:在特征空间中,如果一个实例的大多数k个最近邻实例属于某个类别,则该实例也属于这个类别。具体来说,对于给定的测试实例,基于某种距离度量方式找出训练集中与其最靠近的k个训练实例,然后统计这k个实例中最多的类别作为预测结果。
KNN算法的主要优点包括简单、易于理解和实现,无需参数估计,以及对于异常值和噪声有较好的容忍度。然而,它也有一些缺点,如计算量大(特别是当样本容量较大时),需要大量的内存来存储样本数据,以及结果可能会受到样本不平衡的影响
二、距离计算
在KNN算法中,计算数据点之间的距离是非常关键的步骤。常用的距离计算公式有欧几里得距离(Euclidean Distance)和曼哈顿距离(Manhattan Distance)。
2.1 欧几里得距离
欧几里得距离是最常见的距离计算方法,用于测量两点之间的直线距离。在二维空间中,点A(x1, y1)与点B(x2, y2)之间的欧几里得距离计算公式为:
对于多维空间中的两个点A(x1, y1, z1)和B(x2, y2, z2),其欧几里得距离计算公式为:
2.2 曼哈顿距离
曼哈顿距离也称为城市街区距离,表示在标准坐标系上两个点在标准坐标系上的绝对轴距总和。在二维空间中,点A(x1, y1)与点B(x2, y2)之间的曼哈顿距离计算公式为:
对于多维空间中的两个点A(x1, y1, z1)和B(x2, y2, z2),其曼哈顿距离计算公式为:
在水果分类实验中,我们可以将水果的各种特征(如颜色、味道)作为数据点的维度,通过计算不同水果之间的距离来进行分类
三、代码实现水果分类
定义一个函数 knn_classify
X_train
: 训练数据的特征。y_train
: 训练数据的标签。X_test
: 测试数据的特征。k
: k-NN 算法中的 k 值,表示要考虑的最近邻居的数量
from collections import Counter#从模块导入类,它用于计数可哈希对象,如列表中元素的出现次数collectionsCounter
import numpy as np
#将模块导入并简称为np,是一个用于处理大型多维数组和矩阵的库,它提供了大量的数学函数来操作这些数组
def knn_classify(X_train, y_train, X_test, k):
# 计算测试样本与训练样本之间的距离
distances = np.sqrt(((X_train - X_test) ** 2).sum(axis=1))
# 对距离数组进行排序,并取前k个最小距离的索引。这些索引对应于中的k个最近邻居
k_indices = np.argsort(distances)[:k]
# 使用上面得到的索引从中提取对应的标签。这些标签是第的k个最近邻居的标签
k_nearest_labels = y_train[k_indices]
class_counts = Counter(k_nearest_labels)#使用计数k个最近邻居的标签出现的次数
# 从计数结果中找到出现次数最多的标签。返回一个列表,其中包含一个元组,元组的第一个元素是出现次数最多的标签,第二个元素是该标签的出现次数
most_common = class_counts.most_common(1)
return most_common[0][0] # 返回最常见的标签
# 我们有以下训练数据和测试数据
X_train = np.array([
[1, 0, 0], # 苹果(红色,甜味)
[0, 1, 0], # 香蕉(黄色,酸味)
[0, 0, 1] # 橙子(绿色,无味)
])
y_train = np.array(['苹果', '香蕉', '橙子'])
X_test = np.array([
[1, 0, 1] # 一个红色的酸味水果,可能是苹果或香蕉
])
# 使用KNN进行分类
prediction = knn_classify(X_train, y_train, X_test, k=3)
print(f"预测结果: {prediction}")
四、代码运行结果
五、实验总结
实验通过使用KNN算法对水果进行分类,让我深刻理解了该算法的原理和实际应用。在实验中,我学习了如何计算不同数据点之间的距离,并根据最近邻的类别来预测未知数据的类别,通过这次实验,我不仅学习了KNN算法的理论知识和应用技巧,还提高了自己的动手能力和解决问题的能力。我深刻认识到实验是理论知识和实践操作的桥梁,