k-近邻算法

一、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)之间的欧几里得距离计算公式为:

(d(A, B) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2})

对于多维空间中的两个点A(x1, y1, z1)和B(x2, y2, z2),其欧几里得距离计算公式为:

(d(A, B) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2})

2.2 曼哈顿距离

曼哈顿距离也称为城市街区距离,表示在标准坐标系上两个点在标准坐标系上的绝对轴距总和。在二维空间中,点A(x1, y1)与点B(x2, y2)之间的曼哈顿距离计算公式为:

(d(A, B) = |x_2 - x_1| + |y_2 - y_1|)

对于多维空间中的两个点A(x1, y1, z1)和B(x2, y2, z2),其曼哈顿距离计算公式为:

(d(A, B) = |x_2 - x_1| + |y_2 - y_1| + |z_2 - z_1|)

在水果分类实验中,我们可以将水果的各种特征(如颜色、味道)作为数据点的维度,通过计算不同水果之间的距离来进行分类


 

三、代码实现水果分类

      定义一个函数 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算法的理论知识和应用技巧,还提高了自己的动手能力和解决问题的能力。我深刻认识到实验是理论知识和实践操作的桥梁,

  • 26
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值