机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型

一. KNN简介

KNN思想

K-近邻算法K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别

KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别

K值根据网格交叉验证来确定

样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。

利用K近邻算法预测电影类型

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第1张图片

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第2张图片

K值的选择

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第3张图片

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第4张图片

KNN的应用方式

解决问题:分类问题、回归问题

算法思想

若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别

相似性:欧氏距离

分类问题的处理流程

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第5张图片

  1. 计算未知样本到每一个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的 K 个训练样本

  4. 进行多数表决,统计 K 个样本中哪个类别的样本个数最多

  5. 将未知的样本归属到出现次数最多的类别

回归问题的处理流程

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第6张图片

  1. 计算未知样本到每一个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的 K 个训练样本

  4. 把这个 K 个样本的目标值计算其平均值

  5. 作为将未知的样本预测的值

总结

KNN概念: K Nearest Neighbor

一个样本最相似的k个样本中的大多数属于某一个类别, 则该样本也属于这个类别

KNN分类流程

  1. 计算未知样本到每个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的K个训练样本

  4. 进行多数表决, 统计k个样本中哪个类别的样本个数最多

  5. 将未知的样本归属到出现次数最多的类别

KNN回归流程

  1. 计算未知样本到每个训练样本的距离

  2. 将训练样本根据距离大小升序排列

  3. 取出距离最近的k个样本

  4. 把这k个样本的目标值计算平均值

  5. 平均值就是这个未知样本的预测值

K值的选择

K值过小, 模型过于复杂, 造成过拟合(训练集表现很好, 测试集表现不好)

K值过大, 模型过于简单, 造成欠拟合(训练集和测试集的表现都不好)

机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型_第7张图片

二. KNN算法API

KNN算法介绍

概述

类似于: 近朱者赤近墨者黑

流程

  1. 导包.

  2. 创建 (分类)算法对象.

  3. 准备 训练集数据, 即: x_train, y_train

  4. 训练模型 => 机器学习.

  5. 模型预测(评估)

  6. 打印模型预测的结果.

前提

环境中已经安装了 scikit-learn 包

分类问题演示

原理

先计算样本数据 到 训练集每个记录的 欧式距离, 然后根据欧式距离升序排列, 取出最近的 K个 样本值. 然后进行 投票, 哪个分类, 则该分类的标签, 就是: 预测值的标签.

代码演示

模块: KNeighborsClassifier

# 1. 导包.
from sklearn.neighbors import KNeighborsClassifier
​
# 2. 创建 (分类)算法对象.
# estimator 单词的意思是 => 估量值, 评估值...
# Neighbors 单词的意思是 => 近邻(邻居)...
# estimator = KNeighborsClassifier(n_neighbors=1)  # 即: k=1, 找最近的哪个样本.
estimator = KNeighborsClassifier(n_neighbors=3)  # 即: k=1, 找最近的哪个样本.
​
# 3. 准备 训练集数据, 即: x_train, y_train
x_train = [[0], [1], [2], [3]]
y_train = [0, 0, 1, 1]  # 分类 => 2分类
# 4. 训练模型 => 机器学习.
estimator.fit(x_train, y_train)  # fitting => 拟合
# 5. 模型预测(评估)
my_result = estimator.predict([[4]])
# 6. 打印模型预测的结果.
print(f'预估值: {my_result}')

注:

上述代码中的y_train= [0, 0, 0, 1]时: 输出评估结果为0

上述代码中的estimator = KNeighborsClassifier(n_neighbors=2),

​ y_train= [0, 0, 0, 1] 时:

输出评估结果为0(选择较为简单的模型, 此案例中类似于排序后的第一个)

回归问题演示

原理

先计算样本数据训练集每个记录的 欧式距离, 然后根据欧式距离升序排列, 取出最近的 K个样本值. 然后 计算这些样本值的平均值, 将平均值作为该分类的标签, 即: 预测值的标签.

代码演示

模块: KNeighborsRegressor

# 1. 导包.
# from sklearn.neighbors import KNeighborsRegressor
# from sklearn.neighbors import KNeighborsClassifier
# from sklearn.neighbors import KNeighborsRegressor, KNeighborsClassifier
​
from sklearn.neighbors import KNeighborsRegressor
​
# 2. 创建 (回归)算法对象.
# 细节: 因为k值是手动传入的, 所有手动传入的值都称之为: 超参数.
estimato

你可能感兴趣的:(机器学习篇-KNN算法实现鸢尾花模型和手写数字识别模型)