当前位置: 首页 > news >正文

机器学习(九):KNN算法全解析与项目实践

声明:未经允许,禁止转载

算法原理

kkk近邻算法是一种常见的懒惰监督学习算法,懒惰指的是该算法不需要训练,只需要计算测试样本到各个训练集样本的距离,然后找出距离测试样本最近的kkk个训练样本:

  • 对于分类任务,使用投票法,将kkk个训练样本的大多数样本所属的类别作为该预测样本的类别;
  • 对于回归任务,将kkk个样本实值的均值作为预测结果。

kkk近邻算法中,kkk和距离度量的选择都十分重要,kkk取不同值时,分类结果可能会差异很大(见下图),而距离度量的不同会影响kkk个近邻的选择。

k-nearest-neighbor

算法实践

本文在鸢尾花数据集上进行kkk近邻算法的实践。数据集按训练集和测试集7:37:37:3的比例划分,具体实现代码如下:

import numpy as np
from scipy.spatial.distance import cdist
from scipy.stats import mode
from process import read_data
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as pltclass KNNClassifier:def __init__(self, k, metric='euclidean'):self.k = kself.train_x = Noneself.train_y = Noneself.metric = metricdef fit(self, x, y):self.train_x = xself.train_y = ydef euclidean_distance(self, x1, x2):return cdist(x1, x2, metric=self.metric)def predict(self, test_x):# 距离计算dis_x = self.euclidean_distance(test_x, self.train_x)# 获取测试样本对应的k个最近邻的索引k_indices = np.argsort(dis_x, axis=1)[:, :self.k]# 根据索引获取对应的标签k_labels = self.train_y[k_indices]# 对每个样本的k个最近邻的标签进行投票选出频率最高的作为预测概率y_hat, _ = mode(k_labels, axis=1)return y_hatif __name__ == "__main__":data_path = "../datasets/iris.csv"metric = 'euclidean'train_x, train_y, test_x, test_y = read_data(data_path)k_max = 20accs = []for k in range(1, k_max + 1):# 自建模型cknn = KNNClassifier(k, metric)cknn.fit(train_x, train_y)cy_hat = cknn.predict(test_x)custom_acc = accuracy_score(test_y.reshape(-1), cy_hat.reshape(-1))# 调库sknn = KNeighborsClassifier(n_neighbors=k, metric=metric)sknn.fit(train_x, train_y)sy_hat = sknn.predict(test_x)sklearn_acc = accuracy_score(test_y.reshape(-1), sy_hat.reshape(-1))accs.append(custom_acc)print("k[{}]\tcustom acc[{}]\tsklearn acc[{}]".format(k, custom_acc, sklearn_acc))x = np.arange(1, k_max + 1)plt.figure()plt.xlabel("k")plt.ylabel("accuracy")plt.xticks(x)plt.plot(x, accs, marker="<")plt.savefig("accuracy.png")

实践结果中计算了k=[1,2,3,...,20]k=[1,2,3,...,20]k=[1,2,3,...,20]时的准确率,下图为对应的结果,横轴为kkk的取值,纵轴为对应在测试集上的准确率:

knn-accuracy

结语

参考资料:《机器学习》周志华
源码地址:KNN
以上便是本文的全部内容,若有任何错误敬请批评指正,觉得不错的话可以支持一下,不胜感激!!!。

http://www.dtcms.com/a/298252.html

相关文章:

  • 记录es收集日志报错问题as the final mapping would have more than 1 type[XXX,doc]
  • HCIP MGRE实验
  • 【机器学习之推荐算法】基于矩阵分解和损失函数梯度下降的协同过滤算法实现
  • RAG实战指南 Day 24:上下文构建与提示工程
  • C 语言 | 结构体详解:自定义数据类型的艺术
  • 【第四章:大模型(LLM)】01.神经网络中的 NLP-(1)RNN、LSTM 和 GRU 的基本原理和应用
  • MySQL常用日期函数总结
  • [1-01-01]第42节:不可变字符序列 - String类中常用的API
  • 福彩双色球篮球号码的加减法
  • 探秘抖音商城:软件采集视角下的电商生态与数据价值
  • DeepSeek DeepEP学习(四)normal combine
  • zabbix----设置告警
  • Linux 系统时间设置(date 和 ntpdate)-linux028
  • Zookeeper学习专栏(十):核心流程剖析之服务启动、请求处理与选举协议
  • 最新Amos 29下载及详细安装教程,附免激活中文版Amos安装包
  • Dart 异步编程之 Future 详解
  • 盟接之桥说制造:构建以预防为核心的供应链客诉管理体系
  • Excel——重复值处理
  • 用友ERP 反射xss漏洞复现(CVE-2025-2709)
  • Python柱状图
  • 文件被删除了怎么恢复?恢复方法总结与重点注意事项
  • 解放生产力:Amazon API Gateway 与 Amazon Lambda 的优雅组合
  • miniz:一个轻量级、高性能的开源压缩库
  • linusb + Zadig 2.x - 用户指南
  • 飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍
  • The Magic Mask for Android:解锁无限可能的安卓自定义套件
  • “Vibe Coding”:用自然语言对话,15分钟打造Python终端速读App
  • 正交实验设计法(心血整理总结)
  • 【第四章:大模型(LLM)】01.Embedding is all you need-(6)从 Word2Vec 到推荐/广告系统,再到大语言模型(LLM)
  • Linux下提权root权限