机器学习十大算法(8)K最近邻算法KNN(附代码实现)

一、介绍

        K最近邻算法(k-Nearest Neighbors,简称KNN)是一种常见的分类和回归算法。简单来说,通过查找测试数据点的K个最近邻居来进行分类或回归。它基于一个简单的假设:如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,则该样本也属于该类别。

        KNN算法的关键是选择合适的K值和距离度量方法。K值的选择需要根据具体问题和数据集的特点进行调整。常用的距离度量方法包括欧氏距离、曼哈顿距离和闵可夫斯基距离。

        KNN算法的优点是简单易实现,适用于多分类和回归问题。但它的缺点是计算复杂度高,需要存储全部训练样本,对于大规模数据集计算开销较大。此外,KNN对于类别不平衡和噪声数据比较敏感,需要进行数据预处理和特征选择。KNN算法在实际应用中广泛使用,特别是在模式识别、图像处理和推荐系统等领域。

KNN算法的实现步骤如下:
1. 计算测试样本与每个训练样本之间的距离。
2. 根据距离将训练样本排序。
3. 选取距离最近的K个训练样本。
4. 统计这K个训练样本中每个类别的出现次数。
5. 将测试样本分类为出现次数最多的类别。

二、代码实现

        首先定义了一个名为KNN的类,它具有三个方法:__init__fitpredict。在__init__方法中,我们初始化了K的值,默认为3。在fit方法中,我们将训练数据X和对应的标签y转换为NumPy数组。在_euclidean_distance方法中,我们计算两个样本之间的欧氏距离。在predict方法中,我们遍历测试数据,计算每个测试样本与所有训练样本的距离,并选择最近的K个样本。然后,我们统计这K个样本中标签的频数,并选择频数最高的标签作为预测结果。

import numpy as np
from collections import Counter

class KNN:
    def __init__(self, k=3):
        self.k = k
    
    def fit(self, X, y):
        self.X = np.array(X)
        self.y = np.array(y)
    
    def _euclidean_distance(self, x1, x2):
        return np.sqrt(np.sum((x1 - x2) ** 2))
    
    def predict(self, X_test):
        y_pred = []
        for x_test in X_test:
            distances = [self._euclidean_distance(x_test, x_train) for x_train in self.X]
            k_indices = np.argsort(distances)[:self.k]
            k_labels = [self.y[i] for i in k_indices]
            most_common = Counter(k_labels).most_common(1)
            y_pred.append(most_common[0][0])
        return y_pred

# 示例用法
X_train = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]
y_train = [0, 0, 1, 1, 1]
X_test = [[3, 2], [1, 5]]
knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(y_pred)  # 输出:[0, 1]

        在示例用法部分,定义了一些简单的训练数据和测试数据,并创建了一个KNN对象。通过调用fit方法,将训练数据传递给模型进行训练。然后,调用predict方法来进行预测,并打印预测结果。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哥兜兜有糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值