【基础不牢,地动山摇】K近邻算法--KNN

什么是K近邻算法?

K近邻是最为基础的分类和回归算法!他的基本原则就是:对给定的训练实例点和输入实例点,首先确定输入实例点的 k k k个最近邻训练实例点,然后利用这 k k k个训练实例点的类的多数来预测输入实例点的类。简单的说就是近朱者赤,近墨者黑。该点周围的K个点绝大部分是红色的,那么它是红色的概率也大。如果绝大部分是黑色的,那么它也极有可能是黑色的!
在这里插入图片描述

K K K近邻三要素

k k k近邻法三要素有:

  • 距离度量
    距离度量:就是用何种方式选择 K K K个点:一般的方法就是用欧式距离

  • k k k值的选择
    K K K的选择一般是采用交叉验证来选择,它的选择反映出了近似误差与估计误差之间的权衡。

  • 分类决策规则
    分类决策通常为多数表决,对应于经验风险最小化。也就是少数服从多数。

key point

k k k近邻法的实现需要考虑如何快速搜索k个最近邻点。对于一维变量来说,二叉树是一个不错的先择。对于K维空间则使用kd树(上一篇博客进行过介绍

距离度量

设特征空间 x x x n n n维实数向量空间 , x i , x j ∈ X x_{i}, x_{j} \in \mathcal{X} xi,xjX, x i = ( x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( n ) ) T x_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}} xi=(xi(1),xi(2),,xi(n))T, x j = ( x j ( 1 ) , x j ( 2 ) , ⋯   , x j ( n ) ) T x_{j}=\left(x_{j}^{(1)}, x_{j}^{(2)}, \cdots, x_{j}^{(n)}\right)^{\mathrm{T}} xj=(xj(1),xj(2),,xj(n))T ,则: x i x_i xi, x j x_j xj L p L_p Lp距离定义为:

L p ( x i , x j ) = ( ∑ i = 1 n ∣ x i ( i ) − x j ( l ) ∣ p ) 1 p L_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{i=1}^{n}\left|x_{i}^{(i)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}} Lp(xi,xj)=(i=1nxi(i)xj(l)p)p1

p = 1 p= 1 p=1 曼哈顿距离
p = 2 p= 2 p=2 欧氏距离
p = i n f p= inf p=inf 闵式距离

python实现距离度量
import math
from itertools import combinations
def L(x, y, p=2):
    # x1 = [1, 1], x2 = [5,1]
    if len(x) == len(y) and len(x) > 1:
        sum = 0
        for i in range(len(x)):
            sum += math.pow(abs(x[i] - y[i]), p)
        return math.pow(sum, 1 / p)
    else:
        return 0
scikit-learning 种的knn
from sklearn.neighbors import KNeighborsClassifier
clf_sk = KNeighborsClassifier()
clf_sk.fit(X_train, y_train)
clf_sk.score(X_test, y_test)
整体的流程
  • 划分好训练集,测试集
  • 设置好距离度量方法
  • 选择出测试点距离最近的K个点
  • 对这K个点的标签进行投票
  • 获得最终的决策
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值