草庐IT

机器学习-KNN算法(鸢尾花分类实战)

吾仄lo咚锵 2023-09-27 原文

文章目录

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介


K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。

“近朱者赤近墨者黑",所谓的K近邻,也就是根据样本相邻最近的K个数据来进行判断,看K个邻居中所属类别最多的是哪一类,则将该样本分为这一类。

算法原理很简单,如下图,K取3时,输入数据为红色点,在它最近的3个邻居点中,有2个黄色1个蓝色,故应把它分类为黄色这一类。

可以看出K的取值应为奇数,避免K近邻中有相同个数的类别,同时也不能为类别数的倍数,如3分类中K取3时,出现1:1:1无法分类的情况。注意如果K过小可能造成过拟合。

此外距离的定义公式也有很多,这里不再赘述,根据实际场景进行甄选,一般使用欧式距离更多,即 d i s t ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 dist(x,y)=\sqrt{\sum_{i=1}^n(x_i-y_i)^2} dist(x,y)=i=1n(xiyi)2

代码复现


  1. 数据处理

采用典中典——鸢尾花数据集,Kaggle中有上传鸢尾花数据(下载链接
鸢尾花数据集包含四个特征,和三种鸢尾花标签类别,共150条数据。

采用sepal length和petal width两个特征,你也可以采用其他特征。
使用pandas读取数据,不懂pandas可以参考我这篇:Pandas光速入门-一文掌握数据操作

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

data = pd.read_csv("D:\\Iris_flower_dataset.csv")
x = np.array(data.iloc[:, [1, 4]])
y_tmp = np.array(data["Species"])
y = []
label = ["Iris-setosa", "Iris-virginica", "Iris-versicolor"]
for i in y_tmp:  # 将英文压为整型
    if i == label[0]:
        y.append(0)
    elif i == label[1]:
        y.append(1)
    else:
        y.append(2)
y = np.array(y)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2022)
# 训练集可视化
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)
plt.xlabel("sepal length[cm]")  # 设置x轴名
plt.ylabel("petal width[cm]")  # 设置y轴名
plt.show()


可视化可参考:Matplotlib光速入门-从安装到绘图实战

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

  1. KNN定义

只考虑两个特征,就简单化处理了,即用 ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (x1x2)2+(y1y2)2

class KNN(object):

    def __init__(self, k):  # 初始化函数
        self.k = k

    def fit(self, x, y):  # 载入训练集
        self.x = x
        self.y = y

    def _distance(self, v1, v2):  # 欧式距离
        return np.sum(np.square(v1 - v2))  # (不开根号节省算力,效果一致

    def predict(self, x):
        y_pre = []
        for i in range(len(x)):  # x是测试集,是一个n维特征数组
            dist_arr = [self._distance(x[i], self.x[j]) for j in range(len(self.x))]  # 计算距离
            sorted_index = np.argsort(dist_arr)  # 排序
            top_k_index = sorted_index[:self.k]  # 得到K近邻
            nearest = self._count(y_top_k=self.y[top_k_index])  # 根据K近邻分类做出预测
            y_pre.append(nearest)  # 加入预测答案
        return np.array(y_pre)

    def _count(self, y_top_k):  # 统计各分类数量
        y_map = {}
        for y in y_top_k:
            if y not in y_map.keys():
                y_map[y] = 1  # 首次不在字典则置1
            else:
                y_map[y] += 1  # 否则value++
        sorted_vote_dict = sorted(y_map.items(), key=operator.itemgetter(1), reverse=True)  # 排序
        return sorted_vote_dict[0][0]  # 返回数量最多的分类
  1. 测试
if __name__ == "__main__":
	# 数据处理
    data = pd.read_csv("D:\\Iris_flower_dataset.csv")
    x = np.array(data.iloc[:, [1, 4]])
    y_tmp = np.array(data["Species"])
    y = []
    label = ["Iris-setosa", "Iris-virginica", "Iris-versicolor"]
    for i in y_tmp:  # 将英文压为整型
        if i == label[0]:
            y.append(0)
        elif i == label[1]:
            y.append(1)
        else:
            y.append(2)
    y = np.array(y)
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2022)
    # 创建KNN对象
    clf = KNN(5)
    # 训练
    clf.fit(x_train, y_train)
    # 测试
    pre_test = clf.predict(x_test)
    # 计算正确率
    correct = np.count_nonzero((pre_test == y_test) == True)
    print("正确率:%.3f" % (correct / len(pre_test)))

  1. 结果可视化
    # 结果可视化
    plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, alpha=0.3)
    for i in range(len(x_test)):
        if pre_test[i] == y_test[i]:  # 正确标绿
            plt.scatter(x_test[i][0], x_test[i][1], color="green")
        else:  # 错误标红
            plt.scatter(x_test[i][0], x_test[i][1], color="red")
    plt.xlabel("sepal length[cm]")  # 设置x轴名
    plt.ylabel("petal width[cm]")  # 设置y轴名
    plt.show()


半透明的是训练数据,测试数据中,绿色是分类正确的点,红色是分类错误的点,可以看出上图只错了一个。

sklearn库调用


使用sklearn封装函数可以非常方便的实现:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 载入数据
iris = datasets.load_iris()  # 已经内置了鸢尾花数据集
x = iris.data  # 输入4个特征
y = iris.target  # 输出类别

# 随机划分数据集,默认25%测试集75%训练集
x_train, x_test, y_train, y_test = train_test_split(x, y)

# 创建一个KNN分类器对象,并设置K=5,
clf = KNeighborsClassifier(n_neighbors=5)  # clf意为Classifier

# 训练
clf.fit(x_train, y_train)  # 用训练数据拟合分类器模型

# 测试
pre_test = clf.predict(x_test)  # 得到测试集的预测结果

# 计算正确率
print('正确率:%.3f' % accuracy_score(y_test, pre_test))
# 由于数据集是随机划分,每次得到正确率自然不同,可以设置random_state让随机一致


直接调用库函数简直不要太方便,芜湖起飞(~ ̄▽ ̄)~

原创不易,请勿转载本不富裕的访问量雪上加霜
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤

有关机器学习-KNN算法(鸢尾花分类实战)的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  9. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐