KNN是什么东东?

2020-08-27  本文已影响0人  一只怂货小脑斧

小白自学路上的备忘记录。。。


一、KNN

KNN(K-Nearest Neighbor)K-近邻算法,是一种最简单常用的监督学习算法,属于“懒惰学习”,即在训练阶段仅仅是把样本保存起来,训练时间开销为0,待收到测试样本后再进行处理。而那些在训练阶段就对样本进行学习处理的方法,称为“急切学习”。

懒惰学习是一种训练集处理方法,其会在收到测试样本的同时进行训练,与之相对的是急切学习,其会在训练阶段开始对样本进行学习处理。

若任务数据更替频繁,则可采用懒惰学习方式,先不进行任何训练,收到预测请求后再根据当前数据进行概率估值;若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值进行 增量学习 ,其只需对相关概率估值进行技术修正即可

https://hyper.ai/wiki/4266

二、模型原理

为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。

KNN 既然是K个近邻投票选择类别,那么就有两个问题:

在KNN中,具体执行步骤为:

(1) 计算待测样本和训练集中每个样本点的距离

ps.通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

(2) 对上面的所有距离排序

(3) 选前K 个最小距离的样本作为“选民”

在 scikit-learn 中 KNN算法的 K 值是通过 n_neighbors 参数来调节的,默认值是 5

K 值较大:距离较远的训练样本也可以对结果产生影响,模型鲁棒,误差大,欠拟合

K值较小:在较小的近邻区域内训练,结果对近邻点十分敏感

可通过交叉验证确定K值。

在 KNN 算法中,所选择的邻居都是已经正确分类的对象,基本上邻居们是均匀权重投票,即一人一票,计数比较结果。 在 scikit-learn 中通过设置 weights 参数选择对应的权重算法。

三、KNN的特点

四、KNN 的应用

1.处理二分类问题

2.处理多分类问题

3.回归分析

五、鸢尾花分类代码样例

实现鸢尾花属性类别的分类器

代码

import numpy as np # 快速操作结构数组的工具
import pandas as pd # 数据分析处理工具
import matplotlib.pyplot as plt # 画图工具
from sklearn import datasets # 机器学习库

#数据集 0-setosa、1-versicolor、2-virginica
scikit_iris = datasets.load_iris()
# 转换成pandas的DataFrame数据格式,方便观察数据
iris = pd.DataFrame(data=np.c_[scikit_iris['data'], scikit_iris['target']],
                     columns=np.append(scikit_iris.feature_names, ['y']))

print(iris.head(2))

# 检查数据是否有缺失
print(iris.isnull().sum())

# 观察样本中按类别数量是否比较均衡
print(iris.groupby('y').count())

# 选择全部特征训练模型
X = iris[scikit_iris.feature_names]
# label
y = iris['y']

# 第一步,选择model
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
# 第二步,fit X、y
knn.fit(X, y)
# 第三步,predict新数据
print(knn.predict([[3, 2, 2, 5]]))

参考资料:

https://blog.csdn.net/pengjunlee/article/details/82713047

《机器学习之路》

上一篇下一篇

猜你喜欢

热点阅读