什么是knn算法?

KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm)。它是一种简单但非常有效的分类和回归算法。
该算法的基本思想是:对于一个新的输入样本,通过计算它与训练集中所有样本的距离,找到与它距离最近的K个训练集样本,然后基于这K个样本的类别信息来进行分类或回归预测。KNN算法中的“K”代表了在预测时使用的邻居数,通常需要手动设置。
KNN算法的主要优点是简单、易于实现,并且在某些情况下可以获得很好的分类或回归精度。但是,它也有一些缺点,如需要存储所有训练集样本、计算距离的开销较大、对于高维数据容易过拟合等。

KNN算法常用于分类问题,如文本分类、图像分类等,以及回归问题,如预测房价等。

我们这次学习机器学习的knn算法分别对前二维数据和前四维数据进行训练和可视化。

两个目标:

1、通过knn算法对iris数据集前两个维度的数据进行模型训练并求出错误率,最后进行可视化展示数据区域划分。
2、通过knn算法对iris数据集总共四个维度的数据进行模型训练并求出错误率,并对前四维数据进行可视化。

基本思路:

1、先载入iris数据集 Load Iris data
2、分离训练集和设置测试集split train and test sets
3、对数据进行标准化处理Normalize the data
4、使用knn模型进行训练Train using KNN
5、然后进行可视化处理Visualization
6、最后通过绘图决策平面plot decision plane

1、通过knn算法对iris数据集前两个维度的数据进行模型训练并求出错误率,最后进行可视化展示数据区域划分:

from sklearn import datasets
import numpy as np
### Load Iris data
iris = datasets.load_iris()
x = iris.data[:,:2]#前2个维度
# x = iris.data
y = iris.target
print("class labels: ", np.unique(y))
x.shape
y.shape
### split train and test sets
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y)
x_train.shape
print("Labels count in y:", np.bincount(y))
print("Labels count in y_train:", np.bincount(y_train))
print("Labels count in y_test:", np.bincount(y_test))
### Normalize the data
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)
print("TrainSets Orig mean:{}, std mean:{}".format(np.mean(x_train,axis=0), np.mean(x_train_std,axis=0)))
print("TrainSets Orig std:{}, std std:{}".format(np.std(x_train,axis=0), np.std(x_train_std,axis=0)))
print("TestSets Orig mean:{}, std mean:{}".format(np.mean(x_test,axis=0), np.mean(x_test_std,axis=0)))
print("TestSets Orig std:{}, std std:{}".format(np.std(x_test,axis=0), np.std(x_test_std,axis=0)))
### Train using KNN
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(x_train_std, y_train)
pred_test=knn.predict(x_test_std)
err_num = (pred_test != y_test).sum()
rate = err_num/y_test.size
print("Misclassfication num: {}\nError rate: {}".format(err_num, rate))#计算错误率
### Visualization
x_combined_std = np.vstack((x_train_std, x_test_std))
y_combined = np.hstack((y_train, y_test))
plot_decision_regions(x_combined_std, y_combined,
classifier=knn, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
#### plot decision plane
x_combined_std = np.vstack((x_train_std, x_test_std))
y_combined = np.hstack((y_train, y_test))
plot_decision_regions(x_combined_std, y_combined,
classifier=knn, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()

代码及其可视化效果截图:

2、通过knn算法对iris数据集总共四个维度的数据进行模型训练并求出错误率并进行可视化:

from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
x = iris.data  #4个维度
# x = iris.data
y = iris.target
print("class labels: ", np.unique(y))
x.shape
y.shape
### split train and test sets
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y)
x_train.shape
print("Labels count in y:", np.bincount(y))
print("Labels count in y_train:", np.bincount(y_train))
print("Labels count in y_test:", np.bincount(y_test))
### Normalize the data
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)
print("TrainSets Orig mean:{}, std mean:{}".format(np.mean(x_train,axis=0), np.mean(x_train_std,axis=0)))
print("TrainSets Orig std:{}, std std:{}".format(np.std(x_train,axis=0), np.std(x_train_std,axis=0)))
print("TestSets Orig mean:{}, std mean:{}".format(np.mean(x_test,axis=0), np.mean(x_test_std,axis=0)))
print("TestSets Orig std:{}, std std:{}".format(np.std(x_test,axis=0), np.std(x_test_std,axis=0)))
### Train using KNN
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(x_train_std, y_train)
pred_test=knn.predict(x_test_std)
err_num = (pred_test != y_test).sum()
rate = err_num/y_test.size
print("Misclassfication num: {}\nError rate: {}".format(err_num, rate))#计算错误率
#四维可视化在二维或三维空间中是无法呈现的,但我们可以使用降维技术来可视化数据。在这种情况下,我们可以使用主成分分析(PCA)或线性判别分析(LDA)等技术将数据降到二维或三维空间中,并在此空间中可视化数据。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA# Perform PCA to reduce the dimensionality from 4D to 3D
pca = PCA(n_components=3)
x_train_pca = pca.fit_transform(x_train_std)# Create a 3D plot of the first three principal components
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')# Plot the three classes in different colors
for label, color in zip(np.unique(y_train), ['blue', 'red', 'green']):ax.scatter(x_train_pca[y_train==label, 0], x_train_pca[y_train==label, 1], x_train_pca[y_train==label, 2], c=color, label=label, alpha=0.8)ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')
ax.legend(loc='upper right')
ax.set_title('Iris Dataset - PCA')
plt.show()

四维可视化在二维或三维空间中是无法呈现的,但我们可以使用降维技术来可视化数据。在这种情况下,我们可以使用主成分分析(PCA)或线性判别分析(LDA)等技术将数据降到二维或三维空间中,并在此空间中可视化数据。
下面是代码效果图,展示如何使用PCA将四维数据降至三维,并在三维空间中可视化iris数据集:

将iris数据集的四维数据降至三维,并在三维空间中可视化了训练集。每个点代表一个数据样本,不同颜色代表不同的类别。我们可以看到,在三维空间中,有两个类别可以相对清晰地分开,而另一个类别则分布在两个主成分的中间。

我们要注意对于高维数据使用knn算法容易出现高维数据容易过拟合的情况,这是因为在高维空间中,数据点之间的距离变得很大,同时训练样本的数量相对于特征的数量很少,容易导致KNN算法无法很好地进行预测。

为了避免高维数据容易过拟合的情况,可以采取以下措施:

  1. 特征选择:选择有意义的特征进行训练,可以降低特征数量,避免过拟合。常用的特征选择方法有Filter方法、Wrapper方法和Embedded方法。

  2. 降维:可以通过主成分分析(PCA)等方法将高维数据映射到低维空间中,以减少特征数量,避免过拟合。

  3. 调整K值:KNN算法中的K值决定了邻居的数量,K值过大容易出现欠拟合,而K值过小容易出现过拟合。因此,可以通过交叉验证等方法来确定最佳的K值。

  4. 距离度量:KNN算法中的距离度量方法对结果影响较大,不同的距离度量方法会导致不同的预测结果。因此,可以尝试不同的距离度量方法,选择最优的方法。

  5. 数据增强:在数据量较少的情况下,可以通过数据增强的方法来增加训练样本,以提高模型的泛化能力。

希望通过这片文章能够进一步认识knn算法的原理及其应用。
今天是五一劳动节,在这里小马同学祝各位五一劳动节快乐!

机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化相关推荐

  1. KNN算法实现鸢尾花数据集分类

    KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...

  2. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  3. Python原生代码实现KNN算法(鸢尾花数据集)

    一.作业题目 Python原生代码实现KNN分类算法,使用鸢尾花数据集. KNN算法介绍: K最近邻(k-Nearest Neighbor,KNN)分类算法,是机器学习算法之一. 该方法的思路是:如果 ...

  4. 机器学习、深度学习面试知识点汇总

    作者丨Oldpan 来源丨oldpan博客 编辑丨极市平台 导读 本文总结了一些秋招面试中会遇到的问题和一些重要的知识点,适合面试前突击和巩固基础知识. 前言 最近这段时间正临秋招,这篇文章是老潘在那 ...

  5. 机器学习和深度学习到底先学哪个?

    最近几年,我看过市面上很多 Python和人工智能的教程,基本都是先介绍Python基本语法,然后学习机器学习.深度学习的常用算法...... 但我与赵辛和褚英昊两位AI博士沟通后发现:这些内容看似合 ...

  6. 内部推荐!陌陌深度学习实验室招聘算法实习生

    ???内部推荐!陌陌深度学习实验室招聘算法实习生 岗位名称 算法实习生 岗位职责 1.负责虚拟形象的语音驱动,情感识别: 2.负责机器学习和深度学习等相关算法的研究和系统搭建: 3.根据业务需求,设计 ...

  7. 深度学习分析--TextCNN算法原理及分类实现

    深度学习算法背景 人工智能发展历史 随着算力提高以及深度学习的应用,近几年算法发展很快 应用场景 计算机视觉 用于车牌识别和面部识别等的应用. 信息检索 用于诸如搜索引擎的应用 - 包括文本搜索和图像 ...

  8. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处

    新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...

  9. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(综合性)--机器学习.深度学习算法中常用数据集大集合(建议收藏,持续更新) 目录 常规数据集 各大方向分类数据集汇总 具体数据集分类 相关文章 DL:关于深度学习常用数据集 ...

最新文章

  1. spark 获取广播变量_Spark流式程序中广播变量和累加器为何使用单例模式
  2. 细数Ajax Control Toolkit 34个服务器端控件
  3. Django2.x中url路由的path()与re_path()参数解释(亲测)
  4. 深入理解PHP Opcode缓存原理
  5. java中方法的参数传递机制
  6. Redis:13--常用功能之redis-cli redis-server等命令
  7. 分布式存储首选,浪潮商用机器FP5466G2服务器测评分析
  8. 某IDC科技风登录页面模板
  9. 并行开发的基本概念及两个重要的定律
  10. 软件架构(7)---软件架构设计-五视图方法论
  11. python len函数_Python 初学者必备的常用内置函数
  12. LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
  13. jenkins集成钉钉
  14. Linux Centos快速屏蔽IP访问(iptables)
  15. 黑苹果麦克风无法使用的问题(仅针对自己的配置)
  16. excel数据处理,表格数据处理成树形结构
  17. 句子迷,语录,苏引华
  18. Identifying a Blocking Query After the Issuing Session Becomes Idle
  19. 新手主播在一对一视频直播平台更容易发展,轻松月入过万!
  20. 智慧医疗BI助你释放医疗大数据潜力

热门文章

  1. Java测试-mockito学习
  2. c语言如何产生彩票随机数,随机随机数(彩票概率原理)的详细说明
  3. 无领导小组讨论面试真题解析(五)——沙漠求生记
  4. video标签在iOS上无法播放解决思路及办法
  5. Python运维开发(CMDB资产管理系统)--环境部署(上)
  6. 半天速成Python超简网站
  7. idea提交时忽略.class、.iml文件和文件夹或目录的方法
  8. 定制化开发小程序与模板开发小程序的区别?
  9. Mall电商实战项目(一)
  10. mac 苹果如何才能实现剪切文件