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

机器学习 KNN 算法,鸢尾花案例

目录

一.机器学习概述

二.人工智能的两大方向

三.KNN算法介绍

1.核心思想:“物以类聚,人以群分”

2.算法步骤

四.KNN算法实现

1.安装scikit-learn库

2.导入knn用于分类的类KNeighborsClassifier

3.设置KNeighborsClassifier的相关参数

4.训练模型

5.进行预测

6.计算准确率

五.鸢尾花案例实现

1.准备训练集和测试集数据

2.读取数据

3.划分训练集

4.调用KNN,完成训练过程

5.用训练集中的数据预测,并计算结果的正确率

6.划分测试集

7.将测试集中的数据进行预测,计算准确率

8.完整代码呈现


一.机器学习概述

  • 机器学习是人工智能的核心技术之一,涉及利用数学公式从数据中总结规律。
  • 经典算法(如KNN、线性回归、决策树等)是学习重点,掌握后可轻松扩展至衍生算法。
  • 机器学习流程分为三个阶段:
    • 数据收集:需大量高质量数据(如GPT训练数据达45TB)。
    • 模型训练:通过数学公式求解未知参数(如抛物线公式中的ABC)。
    • 预测:将新数据代入训练好的模型得出结果。

二.人工智能的两大方向

  • 回归:预测连续型数值(如房价、股票价格、温度)。
  • 分类:划分离散类别(如人脸识别、指纹识别、动物分类)。

三.KNN算法介绍

1.核心思想:“物以类聚,人以群分”

KNN 分类的核心逻辑是:一个样本的类别,由它周围距离最近的 K 个邻居的类别决定

  • 如果一个样本周围的多数邻居属于某一类,则该样本也被判定为该类。
  • 这是一种 “懒惰学习”(Lazy Learning)算法,训练阶段不进行模型拟合,仅存储所有训练数据;直到预测时,才通过计算新样本与训练样本的距离来确定类别。

2.算法步骤

  1. 确定参数 K:选择一个正整数 K(例如 K=3、5、7),表示要参考的 “邻居数量”。

    • K 值过小:容易受噪声影响,模型过拟合(泛化能力差)。
    • K 值过大:可能包含过多其他类别的样本,模型欠拟合(分类模糊)。
  2. 计算距离:对于待预测的新样本,计算它与所有训练样本之间的距离(衡量样本间的 “相似性”)。 常用距离度量方式:

    • 欧氏距离(最常用,适用于连续特征):
    • 二维空间公式:√[(x₁-x₂)² + (y₁-y₂)²]。
    • 三维空间公式:√[(x₁-x₂)² + (y₁-y₂)² + (z₁-z₂)²]。
    • N维空间扩展:对每个维度差值平方求和后开根号。
    • 曼哈顿距离(适用于高维数据,抗噪声):\(\text{距离} = |x_1-y_1| + |x_2-y_2| + ... + |x_d-y_d|\)
    • 余弦相似度(适用于文本、向量等,衡量方向相似性)。
  3. 筛选 K 个最近邻:根据距离从小到大排序,选取与新样本距离最近的 K 个训练样本(即 “K 个邻居”)。

  4. 投票决定类别:统计 K 个邻居的类别,出现次数最多的类别即为新样本的预测类别(“少数服从多数”)。

四.KNN算法实现

1.安装scikit-learn库

KNN算法已封装于Scikit-learn(SKL)库中,无需手动实现距离公式和训练过程,所以我们要先安装好scikit-learn库(可以自己指定版本号),命令如下:

 pip install scikit-learn==1.0.2 -i Https://pypi.tuna.tsinghua.edu.cn/simple 

2.导入knn用于分类的类KNeighborsClassifier

from sklearn.neighbors import KNeighborsClassifier

3.设置KNeighborsClassifier的相关参数

源码如下:

class KNeighborsClassifier(KNeighborsMixin, ClassifierMixin, NeighborsBase):"""Classifier implementing the k-nearest neighbors vote.def __init__(self,n_neighbors=5,*,weights="uniform",algorithm="auto",leaf_size=30,p=2,metric="minkowski",metric_params=None,n_jobs=None,):super().__init__(n_neighbors=n_neighbors,algorithm=algorithm,leaf_size=leaf_size,metric=metric,p=p,metric_params=metric_params,n_jobs=n_jobs,)self.weights = weights
  • 关键参数:
    • n_neighborsK值,默认5):控制邻居数量。
    • weights(权重):可调整不同类别的优先级(如偏好红色数据)。
    • algorithm(计算算法):优化排序速度(如暴力搜索、KD树、球树或自动选择)。

4.训练模型

KNeighborsClassifier中已经封装过fit()方法,所以我们只用调用方法即可完成训练过程

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train_x,train_y)

train_x为训练集中的特征数据

train_y为根据特征而得到的分类类别数据

5.进行预测

可以直接通过KNeighborsClassifier中的predict()方法完成对数据的预测

train_predicted = knn.predict(要预测的数据)

6.计算准确率

可以直接通过KNeighborsClassifier中的score()方法完成对预测数据结果的准确率的计算

train_score = knn.score(train_x,train_y)

五.鸢尾花案例实现

1.准备训练集和测试集数据

鸢尾花训练数据.xlsx 如下:

鸢尾花测试数据.xlsx 如下:

2.读取数据

train_data=pd.read_excel('鸢尾花训练数据.xlsx')
test_data=pd.read_excel('鸢尾花测试数据.xlsx')

3.划分训练集

将训练集的特征列划分到train_x数据,分类类型则划分到train_y中

train_x=train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
train_y=train_data['类型_num']

4.调用KNN,完成训练过程

knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(train_x,train_y)

5.用训练集中的数据预测,并计算结果的正确率

train_predicted = knn.predict(train_x)
train_score = knn.score(train_x,train_y)
print('train_score={}'.format(train_score))train_score=0.9696969696969697

可以看到,即使使用训练集中的数据进行预测,也达不到百分百的正确率

6.划分测试集

test_x=test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
test_y=test_data['类型_num']

7.将测试集中的数据进行预测,计算准确率

test_predicted=knn.predict(test_x)
test_score = knn.score(test_x,test_y)
print('test_score={}'.format(test_score))test_score=1.0

由于测试集中数据比较少,所以正确率达到了百分百

8.完整代码呈现

from  sklearn.neighbors import KNeighborsClassifier
import pandas as pd
train_data=pd.read_excel('鸢尾花训练数据.xlsx')
test_data=pd.read_excel('鸢尾花测试数据.xlsx')train_x=train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
train_y=train_data['类型_num']knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(train_x,train_y)
train_predicted = knn.predict(train_x)
train_score = knn.score(train_x,train_y)
print('train_score={}'.format(train_score))test_x=test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
test_y=test_data['类型_num']
test_predicted=knn.predict(test_x)
test_score = knn.score(test_x,test_y)
print('test_score={}'.format(test_score))

http://www.xdnf.cn/news/16387.html

相关文章:

  • DP4871音频放大芯片3W功率单通道AB类立体声/音频放大器
  • Python day24
  • 残月头像阁
  • Vue3中的标签 ref 与 defineExpose:模板引用与组件暴露
  • Java零基础入门学习知识点2-JDK安装配置+Maven
  • vue3 组件生命周期,watch和computed
  • 【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署
  • Agent领域,近年来的前沿研究方向:多智能体协作、认知启发架构、伦理安全、边缘计算集成
  • 《计算机组成原理与汇编语言程序设计》实验报告一 基本数字逻辑及汉字显示
  • Avalonia 发布完cv到Linux上运行 出现字体丢失/不显示问题
  • 【C++详解】模板进阶 非类型模板参数,函数模板特化,类模板全特化、偏特化,模板分离编译
  • 【第十二篇】 SpringBoot定时任务
  • 详解FreeRTOS开发过程(八)-- 时间标志
  • HyperWorks教程:HyperWorks助力精准打造游艇的设计
  • SIP广播对讲系统:构建高效智能的语音通信网络
  • 一道检验编码能力的字符串的题目
  • Vue2-VueRouter
  • 刷题日记0725
  • Python,仿生计算新前沿:Python实现进化-强化学习混合算法
  • php语法--foreach和in_array的使用
  • HttpServletRequest知识点
  • 线性代数 下
  • Oracle转Mysql建表脚本
  • RocketMQ常见问题梳理
  • IDM:registered with a fake serial number
  • 【JavaEE】Spring Web MVC(上)
  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Canal 1.1.7的安装
  • 焊接机器人节能先锋
  • Kafka——多线程开发消费者实例