机器学习实战:Python基于K近邻KNN进行分类预测(四)

2023-11-07

1 前言

1.1 K近邻的介绍

K近邻(K-Nearest Neighbor, KNN)是一种基本的分类与回归算法。其基本思想是将新的数据样本与已知类别的数据样本进行比较,根据K个最相似的已知样本的类别进行预测。

具体来说,KNN算法通过计算待分类样本与已知样本之间的距离(欧式距离曼哈顿距离等),选取距离待分类样本最近的K个已知样本,再通过对这K个已知样本的类别进行投票、取平均等方式确定待分类样本的类别。KNN算法中,K的取值是一个重要的超参数,不同的取值可能会影响算法的性能。

优点:

  • 简单易懂:KNN算法的原理简单,易于理解和实现。
  • 无需训练:KNN算法是一种基于实例的学习方法,它不需要显式地训练模型,而是直接使用训练集中的实例进行预测。
  • 适用于多分类问题:KNN算法可以应用于多分类问题,不需要额外的处理。
  • 对异常值不敏感:KNN算法不受异常值的影响,因为它是基于相邻的投票决定结果,不会受到单个数据点的影响。
  • 模型可解释性高:KNN算法的结果可以被解释为离查询点最近的邻居的平均值或众数。

缺点:

  • 需要大量内存:KNN算法需要存储所有的训练样本,因此随着样本数量的增加,内存开销也会相应增加。
  • 计算量大:对于每个测试样本,KNN算法需要计算它与所有训练样本之间的距离,因此随着样本数量的增加,计算量也会相应增加。
  • 效果受参数K的影响:KNN算法中的K值是一个重要参数,需要根据实际问题进行选择,K值过大或过小都会影响预测结果。
  • 受特征空间的影响:KNN算法的效果受特征空间的影响,如果特征空间维度过高,会影响算法的准确性。
  • 对于不平衡数据集的处理效果较差:如果训练集中的某个类别的数据样本比其他类别的数据样本数量少,那么KNN算法会偏向于选择数量较多的类别进行预测,从而影响预测结果的准确性。

1.2 K近邻的应用

应用相对广泛:

  1. 图像识别:KNN算法可以用于图像识别领域,例如面部识别、手写数字识别等。

  2. 推荐系统:KNN算法可以用于基于用户行为和喜好的推荐系统,例如在线商店和社交媒体平台。

  3. 金融领域:KNN算法可以用于信用评分和风险管理,例如预测客户违约概率和市场波动。

  4. 医疗诊断:KNN算法可以用于医疗诊断,例如预测病人患某种疾病的可能性。

  5. 文本分类:KNN算法可以用于文本分类领域,例如垃圾邮件过滤、情感分析等。

  6. 时间序列预测:KNN算法可以用于时间序列预测,例如股票价格预测和气象预测。

  7. 其他领域:KNN算法还可以用于语音识别、游戏AI、生物信息学、物流和交通等领域。

提一下,单是生信领域使用的场景其实还是挺多的

  1. 基因分类:KNN可以用于对基因进行分类,例如在癌症研究中,可以使用KNN分类器来识别患有癌症的患者和健康人之间的基因表达模式的差异。

  2. 蛋白质结构预测:KNN可以用于预测蛋白质的三维结构,例如使用KNN回归来预测残基-残基相互作用的能量。

  3. 突变预测:KNN可以用于预测基因突变的影响,例如在基因组学中,可以使用KNN分类器来预测某种突变对蛋白质功能的影响。

  4. 数据集分类:KNN也可以用于分类未知数据集中的样本,例如在微生物组学中,可以使用KNN分类器来对未知的微生物样本进行分类。

  5. 基因表达数据分析:KNN可以用于分析基因表达数据,例如在单细胞RNA测序中,可以使用KNN来对细胞进行分类和聚类。

2 二维数据集演示

2.1 导入函数

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
# 作图
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
import seaborn as sns

2.2 导入数据

# 莺尾花数据集的前两维数据
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target

2.3 训练模型及可视化

k_list = [1, 3, 5, 8, 10, 15]
h = .02
# 创建不同颜色的画布
cmap_light = ListedColormap(['#a6cee3', '#1f78b4', '#b2df8a'])
cmap_bold = ListedColormap(['#e41a1c', '#377eb8', '#4daf4a'])

plt.figure(figsize=(15,14))
# 根据不同的k值进行可视化
for ind,k in enumerate(k_list):
    clf = KNeighborsClassifier(k)
    clf.fit(X, y)
    # 画出决策边界
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    # 根据边界填充颜色
    Z = Z.reshape(xx.shape)

    plt.subplot(321+ind)  
    plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
    # 数据点可视化到画布
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,
                edgecolor='k', s=20)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.title("3-Class classification (k = %i)"% k)

plt.show()

k=1的时候,在分界点位置的数据很容易受到局部的影响,图中会有蓝绿相间,主要是数据太局部敏感。当k=15的时候,不同的数据基本根据颜色分开,当时进行预测的时候,会直接落到对应的区域,模型相对为“粗糙”。

3 莺尾花数据集全数据演示

3.1 导入函数

### iris数据集
import numpy as np
# 加载莺尾花数据集
from sklearn import datasets
# 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

3.2 导入数据

iris = datasets.load_iris()

X = iris.data
y = iris.target
# 7/3分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

3.3 训练模型及预测

# 训练模型
clf = KNeighborsClassifier(n_neighbors=5, p=2, metric="minkowski")
clf.fit(X_train, y_train)

# 预测
X_pred = clf.predict(X_test)
acc = sum(X_pred == y_test) / X_pred.shape[0]
print("预测的准确率ACC: %.3f" % acc)

很可,能达到0.978。训练和预测的过程大家可以自行去算,用knn.predict(x)算出每个样本的欧式距离,给每个样本编一个独立的id、排序、打分

4 模拟数据集演示

4.1 导入函数

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor

4.2 模拟数据集

np.random.seed(0)
# 随机生成40个(0, 1)之前的数,乘以5,再进行升序
X = np.sort(5 * np.random.rand(40, 1), axis=0)
# 创建[0, 5]之间的500个数的等差数列, 作为测试数据
T = np.linspace(0, 5, 500)[:, np.newaxis]
# 使用sin函数得到y值,并拉伸到一维
y = np.sin(X).ravel()
# Add noise to targets[y值增加噪声]
y[::5] += 1 * (0.5 - np.random.rand(8))

4.3 建模比较

# 设置多个k近邻进行比较
n_neighbors = [1, 3, 5, 8, 10, 40]

# 设置图片大小
plt.figure(figsize=(20,14))

# 输出设为两列三行
rows = 3
cols = 2

for i, k in enumerate(n_neighbors):
    # 默认使用加权平均进行计算predictor
    clf = KNeighborsRegressor(n_neighbors=k, p=2, metric="minkowski")
    # 训练
    clf.fit(X, y)
    # 预测
    y_ = clf.predict(T)
    
    plt.subplot(rows, cols, i + 1)
    plt.scatter(X, y, color='red', label='data')
    plt.plot(T, y_, color='navy', label='prediction')
    plt.axis('tight')
    plt.legend()
    plt.title("KNeighborsRegressor (k = %i)" % (k))

plt.tight_layout()
plt.show()

很明显,当k=1时,预测的结果只和最近的一个训练样本相关,从预测曲线中可以看出当k很小时候很容易发生过拟合。当k=40时,预测的结果和最近的40个样本相关,因为我们只有40个样本,此时是所有样本的平均值,此时所有预测值都是均值,很容易发生欠拟合。

因此根据结果,3,5,8,10都是可以考虑的。

5 马绞痛数据+pipeline演示

5.1 下载数据集

这里包括了数据集和表头信息,确保自己已经安装了wget

# 下载需要用到的数据集
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.csv
# 下载数据集介绍
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.names

5.2 导入函数

## 导入函数
import numpy as np
import pandas as pd
# kNN分类器
from sklearn.neighbors import KNeighborsClassifier
# kNN数据空值填充
from sklearn.impute import KNNImputer
# 计算带有空值的欧式距离
from sklearn.metrics.pairwise import nan_euclidean_distances
# 交叉验证
from sklearn.model_selection import cross_val_score
# KFlod的函数
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

5.3 填充空值

这个数据集里面有很多,因此还是用欧式距离计算后填充

## 空值填充
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2, metric='nan_euclidean')
imputer.fit_transform(X)

## 带空值的欧式距离计算公式
nan_euclidean_distances([[np.nan, 6, 5], [3, 4, 3]], [[3, 4, 3], [1, 2, np.nan], [8, 8, 7]])

# load dataset, 将?变成空值
input_file = './horse-colic.csv'
df_data = pd.read_csv(input_file, header=None, na_values='?')

# 得到训练数据和label, 第23列表示是否发生病变, 1: 表示Yes; 2: 表示No. 
data = df_data.values
ix = [i for i in range(data.shape[1]) if i != 23]
X, y = data[:, ix], data[:, 23]

# 查看所有特征的缺失值个数和缺失率
for i in range(df_data.shape[1]):
    n_miss = df_data[[i]].isnull().sum()
    perc = n_miss / df_data.shape[0] * 100
    if n_miss.values[0] > 0:
        print('>Feat: %d, Missing: %d, Missing ratio: (%.2f%%)' % (i, n_miss, perc))

# 查看总的空值个数
print('KNNImputer before Missing: %d' % sum(np.isnan(X).flatten()))
# 定义 knnimputer
imputer = KNNImputer()
# 填充数据集中的空值
imputer.fit(X)
# 转换数据集
Xtrans = imputer.transform(X)
# 打印转化后的数据集的空值
print('KNNImputer after Missing: %d' % sum(np.isnan(Xtrans).flatten()))

5.4 建模计算

## 构建pipeline
results = list()
strategies = [str(i) for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 18, 20, 21]]
for s in strategies:
    # create the modeling pipeline
    pipe = Pipeline(steps=[('imputer', KNNImputer(n_neighbors=int(s))), ('model', KNeighborsClassifier())])
    # 数据多次随机划分取平均得分
    scores = []
    for k in range(20):
        # 得到训练集合和验证集合, 8: 2
        X_train, X_test, y_train, y_test = train_test_split(Xtrans, y, test_size=0.2)
        pipe.fit(X_train, y_train)
        # 验证model
        score = pipe.score(X_test, y_test)
        scores.append(score)
    # 保存results
    results.append(np.array(scores))
    print('>k: %s, Acc Mean: %.3f, Std: %.3f' % (s, np.mean(scores), np.std(scores)))
# print(results)
# plot model performance for comparison
plt.boxplot(results, labels=strategies, showmeans=True)
plt.show()

可以观察到结果是随着k值增大先上升后下降再上升的一个波浪趋势,在模拟数据集的结果提到,k取太小太大会过拟合和欠拟合,**因此在第一次下降谷底时可简单认为不再发生过拟合,因而取此前的结果。**这里的话3、4、5都可以考虑,可以结合accstd来选。

6 讨论

KNN是一种惰性学习算法,可用于回归或分类。主要就是关注两个点:k值的选择距离的计算

一般情况下这个k和数据有很大关系,都是交叉验证进行选择,但是建议使用交叉验证的时候,k∈[2,20],使用交叉验证得到一个很好的k值。

样本之间的距离的计算,我们一般使用对于一般使用Lp距离进行计算。当p=1时候,称为曼哈顿距离(Manhattan distance),当p=2时候,称为欧氏距离(Euclidean distance),当p=∞时候,称为极大距离(infty distance), 表示各个坐标的距离最大值,另外也包含夹角余弦等方法。一般采用欧式距离较多,但是文本分类则倾向于使用余弦来计算相似度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习实战:Python基于K近邻KNN进行分类预测(四) 的相关文章

  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • 微信小程序开发1.简易教程

    微信小程序 简易教程 一 基础 第一章 起步 开发小程序的第一步 你需要拥有一个小程序帐号 通过这个帐号你就可以管理你的小程序 跟随这个教程 开始你的小程序之旅吧 申请账号 点击 https mp weixin qq com wxopen
  • C++ 面向对象之引用

    前言 引用是c 区别于c的一个特别好用的特性 它和指针的作用很相似 或者说类似于指针中的常量指针 本文将会从其语法 注意事项 做函数等方面浅谈引用 同时 本文参考了B站视频 链接如下 https www bilibili com video
  • 小白的福音—秒懂UDP协议&TCP协议

    ForeWord 本文介绍了UDP TCP协议的基础知识 主要内容有 UDP TCP协议在TCP IP协议栈中的位置和作用 UDP TCP协议数据段格式 TCP协议如何保证数据传输的可靠性 tips 全文阅读需5min 小伙伴们燥起来 TC
  • 在Linux中配置Samba服务器实现网盘

    在Linux中配置Samba服务器实现网盘 文章目录 在Linux中配置Samba服务器实现网盘 1 安装与基本配置 2 在Windows中使用共享文件夹 3 高级配置 3 1 smb cfg 文件详解 3 2 多用户 多用户组 3 3 典
  • Python网络爬虫实战:爬取携程网酒店评价信息

    这个爬虫是在一个小老弟的委托之下写的 他需要爬取携程网上的酒店的评价数据 来做一些分词和统计方面的分析 然后来找我帮忙 爬这个网站的时候也遇到了一些有意思的小麻烦 正好整理一下拿出来跟大家分享一下 这次爬取过程稍微曲折 各种碰壁 最终成功的
  • Java时间格式化

    Java中的时间格式化是将时间对象转换为指定格式的字符串 或将字符串解析为时间对象 Java提供了丰富的时间格式化API 可以帮助我们方便地处理时间格式化 本篇技术博客将详细介绍Java时间格式化的定义 使用和示例代码 时间格式化 Java
  • 【JavaEE初阶】第八节.多线程(基础篇)阻塞队列(案例二)

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 JavaEE初阶 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 一 阻塞队列概论 1 1 阻塞队列的概念与作用 1 2 阻塞队列的应用场景 生产者消费者模
  • Mac 不是私密连接,拒绝访问

    备忘 1 鼠标停在该页面 直接键盘输入 输入时没有任何显示 thisisunsafe 2 刷新页面 参考 Mac chrome 提示您的连接不是私密连接 没有继续访问 20201116更新 同样适用于在打开git图片时 thisisunsa
  • 最简单的大屏适配解决方案---autofit.js

    在工作开发当中 我们避免不了要去做大屏 那么做大屏其实最难的点和最核心的问题就是适配 下面为大家介绍最好用的大屏解决方案 autofit js 一行代码搞定 开袋即食 效果图展示 可根据窗口大小进行自动适配 使用方法 1 npm下载 npm
  • 元代理模型可迁移对抗攻击

    1 引言 该论文是关于黑盒攻击可迁移性的文章 在当前大量的研究中 许多方法直接攻击代理模型并获得的可迁移性的对抗样本来欺骗目标模型 但由于代理模型和目标模型之间的不匹配 使得它们的攻击效果受到局限 在该论文中 作者从一个新颖的角度解决了这个
  • centos 8 配置LVS+ keepalived 高可用

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 前言 现在的努力的程度就是以后生活的好坏 目录
  • 【GPU】显卡算力对比表

    参考链接 英伟达GPU算力表 https developer nvidia com cuda gpus 显卡算力对比表
  • 用paltform框架的驱动形式,编写驱动,应用层程序,在应用层通过ioctl控制LED灯流水,当按键KEY1按下,让风扇转动

    驱动文件 include
  • 期权保证金算法

    看涨期权保证金算法 股指期权当日结算价 沪深300当日收盘价 max 股指期权保证金调整系数 虚值额 沪深300当日收盘价 股指期权保证金调整系数 最低保障系数 合约乘数 看涨期权虚值额 max 股指期权行权价格 沪深300当日收盘价 0
  • pytorch做自己的目标检测模型(训练部分)

    pytorch做自己的目标检测模型 先放上代码的百度云链接 链接 https pan baidu com s 1ms12 2aUvm5M9hjofP8UHA 提取码 8xpf 第一章 制作数据集 要训练自己的pytorch目标检测模型 第一
  • YOLOV7训练自己的数据集(只需四步快速上手)

    论文地址 https arxiv org abs 2207 02696 源码地址 https github com WongKinYiu yolov7 一 数据集 直接把YOLOV5的数据集复制到根目录下 Images文件夹中是图片 Lab
  • coverity代码检测工具介绍_微服务测试之静态代码扫描

    静态代码扫描为整个发展组织增加价值 无论您在开发组织中发挥的作用如何 静态代码扫描解决方案都具有附加价值 拥有软件开发中所需要的尖端功能 最大限度地提高质量并管理软件产品中的风险 背景 微服务架构模式具有服务间独立 可独立开发部署等特点 独
  • 函数调用约定(整理稿)

    函数调用约定 整理稿 Function calling convention 在C语言中 假设我们有这样的一个函数 int function int a int b 调用时只要用result function 1 2 这样的方式就可以使用这
  • 【华为OD机试】仿 LISP 运算 (C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 机器学习实战:Python基于K近邻KNN进行分类预测(四)

    文章目录 1 前言 1 1 K近邻的介绍 1 2 K近邻的应用 2 二维数据集演示 2 1 导入函数 2 2 导入数据 2 3 训练模型及可视化 3 莺尾花数据集全数据演示 3 1 导入函数 3 2 导入数据 3 3 训练模型及预测 4 模