KNN算法的理解及鸢尾花分类实例的实现

一.KNN算法概述

        KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学习算法),但却是有本质区别的。

二.KNN算法介绍

        KNN的全称是K Nearest Neighbors,意思是K个最近的邻居。K个最近邻居,其中K的取值是至关重要的。KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。

1.距离计算

        要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离,这里只是简单说一下,拿二维平面为例,,二维空间两个点的欧式距离计算公式如下:

其实就是计算(x1,y1)和(x2,y2)的距离,拓展到多维空间,则公式变成这样:

d(x,y)=\sqrt{}\sum_{1}^{n}(Xi-Yi)^{2}

2. K值选择
        

        通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。

通过交叉验证计算方差后你大致会得到下面这样的图:

三.KNN特点
        

KNN是一种非参的,惰性的算法模型。什么是非参,什么是惰性呢?

非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。

惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

KNN算法的优势和劣势      

KNN算法优点

1、简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
2、模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
3、预测效果好。
4、对异常值不敏感

KNN算法缺点

1、对内存要求较高,因为该算法存储了所有训练数据
2、预测阶段可能很慢
3、对不相关的功能和数据规模敏感

三、KNN算法实现鸢尾花的分类

1.加载、查看鸢尾花数据集

         首先,你需要导入所需的库,如numpy、pandas和sklearn。然后,使用sklearn库中的load_iris函数加载鸢尾花数据集,并使用pandas库将其转换为DataFrame格式。最后,使用head()函数查看数据集的前几行。

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

# 加载、查看鸢尾花数据集
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
print(df.head())

输出结果:

2.使用matplotlib对鸢尾花数据集进行可视化

        导入matplotlib库,并使用scatter函数绘制散点图来可视化鸢尾花数据集。你可以根据不同的特征来绘制不同的图形,比如以花瓣长度和宽度为坐标轴。

# 使用matplotlib对鸢尾花数据集进行可视化
plt.scatter(df['sepal length (cm)'], df['sepal width (cm)'], c=df['target'])
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')
plt.show()

输出结果:

 

3.将数据集拆分为训练集和测试集 

         使用sklearn库中的train_test_split函数将数据集拆分为训练集和测试集。你可以指定拆分比例,比如80%的数据用于训练,20%的数据用于测试 

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris['data'], iris['target'], test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape)

 输出结果:

4.构建K-NN模型,评估并预测

        导入sklearn库中的KNeighborsClassifier类,并创建一个K-NN模型对象。使用fit函数将训练集数据和对应的标签传入模型进行训练。然后,使用predict函数对测试集进行预测,并使用sklearn库中的accuracy_score函数计算预测准确率。

# 构建K-NN模型,评估并预测
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率:", accuracy)

输出结果:

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KNN算法是一种基于实例的学习算法,主要用于分类和回归问题。在鸢尾花分类问题,我们可以使用KNN算法进行分类。 鸢尾花数据集是机器学习领域最经典的数据集之一,由3种不同品种的鸢尾花组成,每个样本包含4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。 以下是使用Python实现鸢尾花分类KNN算法示例代码: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载鸢尾花数据集 iris = load_iris() # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42) # 创建KNN分类器 knn = KNeighborsClassifier(n_neighbors=5) # 训练模型 knn.fit(X_train, y_train) # 预测测试集 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 在上述代码,我们使用sklearn库加载鸢尾花数据集,然后使用train_test_split函数将数据集划分为训练集和测试集。接着,我们创建了一个KNN分类器,并使用fit函数训练模型。最后,我们使用predict函数预测测试集,并使用accuracy_score函数计算准确率。 在这个例子,我们设置K值为5,即KNN算法将选择5个与测试样本最相似的训练样本进行分类。你可以根据实际情况调整K值,以达到更好的分类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值