侧边栏壁纸
博主头像
Zeeland

The mixture of software dev+Iot+ml+anything

  • 累计撰写 59 篇文章
  • 累计创建 44 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

KNN算法及其应用

Zeeland
2022-12-20 / 0 评论 / 0 点赞 / 168 阅读 / 1,233 字

Docs

Introduction

K近邻算法(K-nearest neighbors, KNN)是一种很基本朴实的机器学习方法。在模式识别领域中,KNN是一种用于分类和回归的非参数统计方法。在这两种情况下,输入包含特征空间中的 k个最接近的训练样本。因此,在sklearn中,KNN也分为KNeighborsClassifierKNeighborsRegressor两种更加细致的算法,Classifier用于分类中,输出一些离散的枚举值,如电影分类问题,而Regressor用于回归预测中,输出一般连续的值,如房价预测问题。

Core Concept

KNN 在我们日常生活中也有类似的思想应用,比如,我们判断一个人的人品,往往只需要观察他最密切的几个人的人品好坏就能得到结果了。这就是 KNN 的思想应用,**KNN 方法既可以做分类,也可以做回归。**在本篇内容中,我们来给大家展开讲解 KNN 相关的知识原理。

  • 若 K=1,则该对象的类别直接由最近的一个节点赋予。

在 KNN 回归中,输出是该对象的属性值。该值是其 K 个最近邻居的值的平均值。

Step

image.png

总的来说,就是在K的最近邻样本中找出出现频率最大的类别作为位置样本的频率。本质上是对空间区域的划分。

Example

常见的问题豆子分类问题、电影分类,都可以用KNN来解决,这里介绍一下一个房价预测的例子:假如一套房子打算出租,但不知道市场价格,可以根据房子的规格(面积、房间数量、厕所数量、容纳人数等),在已有数据集中查找相似(K近邻)规格的房子价格,看别人的相同或相似户型租了多少钱。

详细的代码实现不记录下来,可以参考:https://www.showmeai.tech/tutorials/34?articleId=187

已知的数据集中,每个已出租住房都有房间数量、厕所数量、容纳人数等字段,并有对应出租价格。将预计出租房子数据与数据集中每条记录比较计算欧式距离,取出距离最小的5条记录,将其价格取平均值,可以将其看做预计出租房子的市场平均价格。

Disadvantage And Optimize

优缺点

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:计算复杂度高、空间复杂度高。
  • 适用数据范围:数值型和标称型。

核心要素:距离度量准则

image.png

核心要素:K的大小

对于 KNN 算法而言,K 的大小取值也至关重要,如果选择较小的 K 值,意味着整体模型变得复杂(模型容易发生过拟合),模型学习的近似误差(approximation error)会减小,但估计误差(estimation error)会增大。
如果选择较大的 K 值,就意味着整体的模型变得简单,减少学习的估计误差,但缺点是学习的近似误差会增大。

在实际的应用中,一般采用一个比较小的 K 值。并采用交叉验证的方法,选取一个最优的 K 值。

在实际的问题中,k到底取多少? 这是一个很重要的问题,一般来说工程问题都有一些trick,而在机器学习中关于参数k的取值,可以使用网格搜索来寻找最优的参数。网格搜索是一种常用的参数优化方法,它通过枚举可能的参数值来找到最优的参数。

网格搜索大致的过程如下:

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'n_neighbors': [3, 5, 7, 9, 11],
              'weights': ['uniform', 'distance']}

# 创建网格搜索对象
grid_search = GridSearchCV(knn, param_grid, cv=5)

# 进行网格搜索
grid_search.fit(X, y)

# 输出最优参数
print(grid_search.best_params_)

实际上,在房价预测的example中,3-11的取值都不是knn的最佳范围,最最优值应该为35,n_neighbors的值取的这么大,推测可能是维度增高的原因。
image.png

事实上,在这个房价预测的例子中,网格搜索的速度比我自己写寻找最佳参数的算法还慢…

缺点

只考虑了样本数量而忽略了距离。
image.png
image.png

0

评论区