机器学习之入门级-KNN算法

本文介绍了KNN算法的基本概念,包括算法步骤和在sklearn中的实现。KNN是一种非参数、惰性的分类算法,其优点包括简单易用、模型训练快、预测效果好,并对异常值不敏感。同时,文章对比了KNN与Kmeans的区别,KNN用于分类,而Kmeans用于聚类。
摘要由CSDN通过智能技术生成

KNN算法

1.概述

KNN算法又称为k近邻分类(k-nearest neighbor classification)算法。
k-最近邻方法是20世纪50年代引进的。当给定大量数据集时,改方法是计算密集的,直到20世纪60年代计算能力大大增强之后才流行起来。此后它广泛应用于模型识别领域。
最近邻分类法是基于类比学习,即通过将给定的检验元组与和它相似的训练元组进行比较来学习。训练元组用n个属性描述。每个元组代表n维空间的一个点。这样,所有的训练元组都存放在n维模式空间中。当给定一个未知元组时,k-最近邻分类法(k-nearest neighbor classification) 搜索模式空间,找出最接近未知元组的k个训练元组。这k个训练元组是未知元组的k个“最近邻”。
“近邻性“用距离度量,如欧几里得距离。二维空间两个点的欧式距离计算公式如下:
二维空间欧式距离
其实就是计算(x1,y1)和(x2,y2)的距离。拓展到多维空间,则公式变成这样:
在这里插入图片描述

2.算法步骤:

1.确定一个参数k
2.依次计算所有其他样本点到我们测试样本点的距离
3.对所有样本点的距离进行排序
4.找出距离测试点最近的k个样本点
5.对这k个样本点所属的类别进行投票,哪个类别多,就将该点预测成哪个类别。
KNN算法的实现

def knn(raw_data, new_data, k):
    """功能: 实现KNN分类器
    参数说明: raw_data:原始数据
    new_data: 新数据
    k: 最近邻数量
    
    返回值: 分类结果"""
    # 提取前两列
    X = raw_data.iloc[:, :2]
    # 距离算出来了
    d = np.sqrt(np.sum((X - new_data)**2,  axis=1))
    topk = d.sort_values().iloc[:k].index
    # 投票, 0就是最终的投票结果
    result = wine_data.loc[topk, '品种'].value_counts().index[0]
    return result

3.sklearn中接下来我们讲解一下sklearn包中的KNN算法的实现:

def KNeighborsClassifier(n_neighbors = 5,
weights=‘uniform’,
algorithm = ‘’,
leaf_size = ‘30’,
p = 2,
metric = ‘minkowski’,
metric_params = None,
n_jobs = None
)

  • n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。

  • weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight
    这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
    • ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。
    • ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。
    • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。

  • algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD
    树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下: • ‘brute’ :蛮力实现 •
    ‘kd_tree’:KD 树实现 KNN • ‘ball_tree’:球树实现 KNN • ‘auto’:
    默认参数,自动选择合适的方法构建模型 不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’

  • leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。

  • p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。

  • metric:指定距离度量方法,一般都是使用欧式距离。 • ‘euclidean’ :欧式距离 • ‘manhattan’:曼哈顿距离 • ‘chebyshev’:切比雪夫距离 • ‘minkowski’: 闵可夫斯基距离,默认参数

  • n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

```bash
# 传入整个数据集X, y
# test_size : 从里面抽取出数据的百分比作为测试集
cancer = load_breast_cancer()
X = pd.DataFrame(cancer.data)
y = cancer.target
X_train, X_test, y_train, y_test = train_test_split(
   X, y, test_size=0.3, random_state=0)

### KNN建模

# 实例化
knn = KNeighborsClassifier(n_neighbors=3)

# 采用训练集进行训练
knn.fit(X_train, y_train)

# 评估模型
# 可以评估模型在训练集上的表现情况
knn.score(X_train, y_train)

# 评估在测试集上的表现情况
knn.score(X_test, y_test)

4.总结

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

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

  • 1、简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。

  • 2、模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。

  • 3、预测效果好。

  • 4、对异常值不敏感

  • 5、从经验上看k的一般设值为奇数

3、Knn和Kmeans区别
Knn和Kmeans的核心都是通过计算空间中点的距离来实现目的,只是他们的目的是不同的。KNN的最终目的是分类,而Kmeans的目的是给所有距离相近的点分配一个类别,也就是聚类。
简单说,就是画一个圈,KNN是让进来圈子里的人变成自己人,Kmeans是让原本在圈内的人归成一类人。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值