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

python—————knn算法

一、knn算法介绍

1.什么是 KNN 算法?

KNN(K-Nearest Neighbors,K 最近邻)是机器学习中最直观、最容易理解的算法之一。它的核心思想源自我们日常生活中的常识:相似的事物总会聚集在一起

想象一下,如果你走进一个陌生的聚会,看到一群人分成几个小圈子交谈,你想知道自己应该加入哪个圈子,最自然的做法就是看看周围和你最像的几个人(最近邻)在哪个圈子,然后做出选择。这正是 KNN 算法的工作方式。

KNN 属于 "懒惰学习"(Lazy Learning)算法,这意味着它不需要像决策树或神经网络那样进行繁琐的模型训练过程,而是在需要预测时才进行计算。这种特性也让它被称为 "基于实例的学习"。

2.knn算法的工作原理

KNN 算法的工作流程可以概括为三个简单步骤:

计算距离:对于需要预测的新样本,计算它与训练集中所有样本的距离

寻找邻居:找出距离最近的 K 个样本(这就是 "K 近邻" 中的 K)

投票决定:根据这 K 个邻居的类别进行投票,得票最多的类别就是新样本的预测类别

3.距离度量方式

KNN 算法中最常用的距离度量方式有:

欧氏距离:最常用的距离度量,即两点之间的直线距离

曼哈顿距离:各维度差的绝对值之和,适用于高维数据

闵可夫斯基距离:欧氏距离和曼哈顿距离的一般形式

4.k值如何选择

K 值是 KNN 算法中唯一的关键参数,它的选择直接影响模型性能:

K 值过小:模型容易过拟合,对噪声敏感,决策边界复杂

K 值过大:模型过于简单,可能忽略数据的局部模式,决策边界趋于平滑

K 为奇数:可以避免投票时出现平局的情况

通常我们会通过交叉验证来选择最优的 K 值,绘制 K 值与模型准确率的关系图,找到性能最佳的 K 值点。

一、环境配置

1.sklearn库

scikit-learn(简称 sklearn)是 Python 中最流行的机器学习库之一,它提供了简单高效的数据挖掘和数据分析工具,适用于各种监督和无监督学习算法。

主要特点:

  1. 丰富的算法:包含分类、回归、聚类、降维、模型选择和预处理等多种算法
  2. 易用性:统一的 API 接口,所有算法都遵循 fit ()、predict () 等一致的方法
  3. 与其他库集成:与 NumPy、Pandas 和 Matplotlib 等数据科学库无缝协作
  4. 文档完善:提供详细的文档和丰富的示例
2.knn中sklearn的使用模块

在 scikit-learn(sklearn)中,K 近邻(KNN)算法主要通过 sklearn.neighbors 模块实现,支持分类(KNeighborsClassifier)和回归(KNeighborsRegressor)两种任务。 

 KNeighborsClassifier 的重要参数:

  1. n_neighbors:K 值(最关键参数),决定考虑多少个近邻的投票
  2. weights
    • 'uniform'(默认):所有近邻权重相同
    • 'distance':权重与距离成反比(距离越近影响越大)
  3. metric:距离度量方式
    • 'euclidean'(默认):欧氏距离
    • 'manhattan':曼哈顿距离
    • 'minkowski':闵可夫斯基距离(可通过 p 参数调整,p = 1为曼哈顿距离,p=2为欧式距离)
  4. algorithm:计算近邻的算法
    • 'auto'(默认):自动选择最优算法
    • 'ball_tree''kd_tree''brute'(暴力搜索)

 二、代码实现knn算法:

 1.读取并提取所需文件数据

读取数据:

使用numpy库读取数据

 data = np.load文件类型("文件名")

 示例代码:

读取名为datingTestSet2的txt文件

import numpy as npdata = np.loadtxt('datingTestSet2.txt')

 提取所需文件:

任务目标:

利用matolotkib库实现学生分配。将相同类型的学生在一个三维坐标轴上用同一种形式表达出来。爱学习的一类,爱玩游戏一类,爱旅游一类

示例代码: 

import numpy as np
import matplotlib.pyplot as pltdata = np.loadtxt("datingTestSet2.txt")
data_1 = data[data[:,-1]==1]
data_2 = data[data[:,-1]==2]
data_3 = data[data[:,-1]==3]
fig = plt.figure()
ax = plt.axes(projection="3d")
ax.scatter(data_1[:,0],data_1[:,1],zs=data_1[:,2],c="red",marker="o")
ax.scatter(data_2[:,0],data_2[:,1],zs=data_2[:,2],c="blue",marker="^")
ax.scatter(data_3[:,0],data_3[:,1],zs=data_3[:,2],c="black",marker="+")
ax.set(xlabel='x',ylabel='y',zlabel='z')
plt.show()

运行结果: 

代码解析:

 data = np.loadtxt("datingTestSet2.txt") :读取txt文件

data_1 = data[data[:,-1]==1] :文件内已经做好分类,最后一列有1,2,3分别代表各自属于的类型,该行代码表示最后一列为1,即为第一类学生

ax = plt.axes(projection="3d"):  建立3d坐标系

ax.scatter(data_1[:,0],data_1[:,1],zs=data_1[:,2],c="red",marker="o"):scatter:表示为散点图,括号内表示分别为x,y,z赋值。

三、knn项目实战:

前情提要:

fit(x,y)训练:将x,y数据分布传入进去模型就训练好了

predict(数据集)预测:新的数据集输入进行预测

score(x,y):计算模型的准确率

示例代码: 

任务目标1:利用人工智能模型knn 实现宿舍寝室的分配。将相同类型的学生
分配在同一个寝室。爱学习的在一起,一般般在一起,爱玩在一起
1.历史数据 通过调查问卷的形式调查学生的特征,由辅导员来决定
第一列:旅游的路程 第二列:玩游戏所有时间百分比 第三列:每个礼拜消耗零食的重量
最后一列学生类别
2.knn算法实现模型
3.新的数据(大一新生,提前预判学生是1,2,3)

数据集内1000个数据,前800个进行训练,后200进行预测

示例代码:

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
data = np.loadtxt('datingTestSet2.txt')
X = data[0:800,0:3]
y = data[0:800,-1]
neigh = KNeighborsClassifier(n_neighbors=5)
neigh.fit(X,y)
text_x = data[800:1000,0:3]
text_y = data[800:1000,-1]
a_predict = neigh.predict(text_x)
a_score = neigh.score(text_x,text_y)
print(a_score)
print(a_predict)

 任务目标2:鸢尾花判断

我们使用了 sklearn 内置的鸢尾花数据集,包含 2种鸢尾花的 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)进行训练

示例代码:


import pandas as pd
train = pd.read_excel("D:\pythonProject11\class\鸢尾花训练数据.xlsx")
text = pd.read_excel("D:\pythonProject11\class\鸢尾花测试数据.xlsx")
train_X = train[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]]
train_y = train[["类型_num"]]
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train_X,train_y)
train_predict = knn.predict(train_X)
score = knn.score(train_X,train_y)
text_x = text[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]]
text_y = text[["类型_num"]]text_predicted = knn.predict(text_x)
score = knn.score(text_x,text_y)
print(score)

在鸢尾花数据集上,KNN 算法通常能取得非常高的准确率(通常在 95% 以上)。这是因为鸢尾花的三类样本在特征空间中具有较好的可分性。

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

相关文章:

  • C++:STL中vector的使用和模拟实现
  • 计算机网络体系结构的核心思想是什么?它有什么用?
  • 大语言模型困惑度:衡量AI语言能力的核心指标
  • 数据结构自学Day15 -- 非比较排序--计数排序
  • MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
  • 推荐系统(第三课第二周)
  • Deepseek要凉了吗?
  • go-admin 构建arm镜像
  • 基于遗传算法的多无人车协同侦察与安全保护策略优化
  • Java 封装、继承与多态:从基础到实践的核心思想
  • TypeScript 中的 typeof
  • 【17】C# 窗体应用WinForm ——【文本框TextBox、富文本框RichTextBox 】属性、方法、实例应用
  • SpringBoot总结
  • 秋招Day19 - 分布式 - 限流
  • VUE2 学习笔记7 v-model、过滤器
  • 各种前端框架界面
  • ARM SMMUv3控制器注册过程分析(八)
  • odoo代码分析(一)
  • 以太坊下一阶段的关键——隐私
  • 根本是什么
  • Transformer:颠覆NLP的自注意力革命
  • ts-node 深入全面讲解
  • nginx一个域名下部署多套前端项目
  • 松茸第一品牌菌贝品质把控对行业的影响分析
  • haproxy配置详解
  • mysql查找数据库表中某几个连续的编号中中断的编号
  • RustFS for .NET 演示项目深度解析:构建 S3 兼容的分布式存储应用
  • 二次函数图像动画展示
  • 雨雪雾冰全预警:交通气象站为出行安全筑起“隐形防护网”
  • 【愚公系列】《MIoT.VC》003-构建基本仿真工作站(组件的属性、行为、视频展示)