ML - kNN


本质

kNN:k-Nearest Neighbors,K近邻

理论基础:如果样本A 和 样本B 足够相似,就A 和 B 大概率属于同一个类别。
如果A 和 n 个样本相似,A 和n个样本属于同一个类别。


示例说明

K近邻算法示例:

  • 数据:两类点方块和三角
  • 绿色的点属于方块还是三角呢?
  • K=3 还是 K=5? 结果一样吗?


计算流程

  1. 计算 已知类别数据集中的点 与 当前点 的距离;
  2. 按照距离依次排序;
  3. 选取与当前点距离最小的K个点;
  4. 确定前K个点所在类别的出现概率;
  5. 返回前K个点出现频率最高的类别作为当前点预测分类;

特点

  • 思想极度简单;它是一种 lazy-learning 算法。
  • 应用数学知识少(几乎为0);
  • 效果好;
  • 很适合入门机器学习;
    更完整的刻画机器学习应用的流程;
    分类器不需要使用训练集进行训练,训练时间复杂度为0。
    可以解释机器学习算法 使用过程中的很多细节问题;

  • 可以解决分类问题;

  • 可以解决回归问题,如预测房价、考试分数。
    方法:找到距离最近的 k 个节点,计算他们的平均值,或者根据距离添加权重。

  • KNN分类的计算复杂度和训练集中的文档数目成正比。
    也就是说,如果训练集中文档总数为n,那么KNN的分类时间复杂度为O(n)。

  • K值的选择,距离度量和分类决策规则 是该算法的三个基本要素

  • KNN 不需要训练过程,没有产生模型;
    为了和其他算法统一,可以认为训练数据集 就是 模型本身。

  • sklearn 中对应的类:KNeighborsRegressor


缺点:

  1. 效率低下(最大的缺点)
    如果训练集有 m 个样本,n 个特征,则预测 每一个新的数据,需要 O(m*n) 的时间复杂度。
    优化:使用树结构:KD-Tree, Ball-Tree;即使如此,kNN 的效率依然非常低。

  2. 高度数据相关
    相较其他机器学习算法,kNN 对 outlier 更加敏感。

  3. 预测的结果不具有可解释性。

  4. 维数灾难
    随着维度的增加,看似相近的两个点之间的距离 越来越大。处理高维度的数据,很容易产生维数灾难。如下:


维数 距离
1维 0到1的距离 1
2维 (0,0)到(1,1) 的距离 1.414
3维 (0,0,0)到(1,1,1)的距离 1.73
64维 (0,0…0)到(1,1…1)的距离 8
10000维 (0,0…0)到(1,1…1)的距离 100

维数灾难解决方法:降维


超参数 & 模型参数

超参数:运行算法之前需要决定的参数
模型参数:算法过程中学习的参数

kNN 算法中没有模型参数,k 是经典的超参数;


如何寻找好的超参数:

  • 领域知识
  • 经验数值
    如 kNN 中 k 的经典数值为5;但实际问题以实际为准。
  • 试验搜索

kNN 算法中的超参数

  • 如果只考虑最邻近节点,那么附近蓝色节点多于红色节点,会被判断为蓝色节点;
  • 但红色距离它更近,所以需要将距离(距离的倒数)也考虑进去。 1 > 1/3 + 1/4
  • 这样还可以解决 平票 的问题;即四个节点时,两蓝两红。

KNN 的实现

python 原生的实现

from math import sqrt
distances = []
for x_ train in X_train:
    d = sqrt(np. sum((x_ train - x)**2) ) 
    distances.append(d)

 # 排序后 原数据的索引
nearest = np.argsort(distance) 

k = 6
topK_y = [ y_train[i] for i in nearest[:k] ]

from collections import Counter

votes = Counter(topK_y)

votes.most_common(2) # 最多的数据


以上方法封装

import numpy as np
from math import sqrt
from collections import Counter

def kNN_classify(k, X_train, y_train, x):
    assert 1 <= k <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值