KNN算法的实现过程

本文介绍了KNN(K-Nearest Neighbor)分类算法,包括算法流程、优缺点及特殊情况的处理。KNN通过计算待预测点与已知点的距离进行分类,适用于多分类问题,但存在空间占用大和计算复杂度高的问题。通过对距离加权,可以缓解样本分布不平衡导致的误分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习算法:KNN分类算法
写文章的目的是为了巩固所学,和方便回顾查找。如有讲错的地方,欢迎指出,谢谢。

KNN算法介绍:
    KNN,k-NearestNeighborK 又称K最近邻
所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表,是一种分类算法,用于参考已知的数据,对未知实例的类别进行判断


算法流程:
将每个样本视作一个点
1. 载入数据集,对数据进行必要的预处理
2. 设置参数K,K最好选择奇数,因为后续进行归类的策略是少数服从多数,设置K为奇数的话总会有结果。
3. 计算待预测点与已知点之间的关系,这里的关系可以有多种方式来体现,常用如下:
  ①欧式距离(应用较广,其他及其算法也有广泛应用),其计算方法:
欧式距离
  ②余弦值
  ③相关度
  ④曼哈顿距离
  ⑤…
4. 之前确定了参数K,计算了待预测点与已知点之间的距离衡量,将计算的结果进行从小到大排序,取前K个点
5. 将待预测点归类为多数的那一个类别,这便是对于未知点的类别预测结果了。

算法优点:
1.简单,易于理解,易于实现,无需估计参数,无需训练;
2. 适合对稀有事件进行分类;
3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。

算法缺点:
  需要大量的空间来存储已知的实例,再一个

KNN(K-Nearest Neighbors)算法是一种基于实例的学习方法,它的基本思想是在训练集中寻找与测试样本最相近的k个样本,然后将这k个样本中出现次数最多的样本标记为测试样本的类别。 下面是KNN算法实现步骤及每一步的代码实现: 1. 计算测试样本与训练集中每个样本的距离,一般常用欧式距离或曼哈顿距离等: ```python import numpy as np def euclidean_distance(x1, x2): """ 计算两个向量之间的欧式距离 x1, x2: 两个向量 """ return np.sqrt(np.sum((x1 - x2) ** 2)) def manhattan_distance(x1, x2): """ 计算两个向量之间的曼哈顿距离 x1, x2: 两个向量 """ return np.sum(np.abs(x1 - x2)) ``` 2. 对距离的计算结果进行排序,找出距离最近的k个样本: ```python def get_k_nearest_neighbors(X_train, x_test, k, distance_metric): """ 获取距离测试样本最近的k个训练样本 X_train: 训练集 x_test: 测试样本 k: k值 distance_metric: 距离度量方式 """ distances = [] for i in range(len(X_train)): dist = distance_metric(X_train[i], x_test) distances.append((i, dist)) distances = sorted(distances, key=lambda x: x[1]) neighbors = [] for i in range(k): neighbors.append(distances[i][0]) return neighbors ``` 3. 统计k个样本中各类别出现的次数,将出现次数最多的类别作为测试样本的类别: ```python def predict(X_train, y_train, x_test, k, distance_metric): """ 对测试样本进行预测 X_train: 训练集 y_train: 训练集对应的标签 x_test: 测试样本 k: k值 distance_metric: 距离度量方式 """ neighbors = get_k_nearest_neighbors(X_train, x_test, k, distance_metric) label_counts = {} for i in neighbors: label = y_train[i] label_counts[label] = label_counts.get(label, 0) + 1 sorted_label_counts = sorted(label_counts.items(), key=lambda x: x[1], reverse=True) return sorted_label_counts[0][0] ``` 以上就是KNN算法实现过程及每一步的代码实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值