zoukankan      html  css  js  c++  java
  • knn算法

    理论基础

      knn是k近邻算法(k-nearest neighbor),可以用在分类,回归当中。这里讨论一下分类问题。

      knn是一种基于实例的学习,在训练的时候只是把数据加载进去,预测的时候基于已经加载的数据预测出输入实例的标签。预测的策略是:采用距离这个实例最近的k个数据的标签。

      所以这里涉及到一些技术:1:如何选择k。2:如何度量实例之间的距离。 3:距离度量以后如何选择标签。 如果这三个因素确定了,那么一个knn算法也就确定了。

    1:如何选择k

      k对于模型的影响。当k的值越小的时候,数据集当中只有较少的数据会对新的实例产生影响。如果这些数据的噪声比较大,那么对于结果的影响也非常的大。会出现过拟合的现象。 而k的值越大,那么,数据当中大多数的数据都会对预测结果产生影响,这个时候在训练集上面的表现就会很差,对训练集的拟合不是很好。

      选择k的时候运用交叉验证加上网格搜索的策略可以选择最优的k。

    2:如何度量距离

    使用$L_p$距离(又叫做闵可夫斯基Minkowski距离)来进行度量。$L_p(mathbf{x} , mathbf{y} ) = (sum limits_{i=1} ^{n}  lvert x_i – y_i vert ^ p )^{frac{1}{p}}$

      当p为1的时候为曼哈顿距离,当p为2的时候为欧氏距离。 一般选择欧氏距离就可以。

    3:如何选择标签

      最简单的方法是使用投票法选择出现类最多的标签。除此之外我们还可以根据计算出来的距离进行加权,如果距离比较近,那么对这个类的加权就比较高。

    如何搜索k个近邻数据

      还有一个非常重要的,值得研究的地方。当我们输入一个实例的时候如何得到距离它最近的k个实例。可能最简单的想法是直接计算出来距离,然后看它和这些值之间的距离,哪个最近选择哪个。 但是这个想法在数据量很大的时候是不可以的。为了解决这个问题有很多的方法,比如kd树,球树等。这里没有介绍。

    sklearn当中的knn

      sklearn当中提供了无监督的knn,knn回归还有knn分类。这里看一下knn分类算法。

      knn分类算法有两种实现 KNeighborsClassifier,RadiusNeighborsClassifier 。前者控制k的个数,后者是控制半径。

      我们来看一下KNeighborsClassifier当中的参数:

      n_neighbors: knn当中n的个数。

      weights: 权重,衡量输入实例到每个样本的权重。uniform的时候是每个样本权重相等,distance是距离越近,样本权重越高。还可以传入自定义的算法。

      algorithm : {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}  我们使用的算法,可以选择:球树,kd树,brute-force算法。

      leaf_size: 为球树和kd树设置的叶子的大小。

      p:闵可夫斯基距离度量的P值默认为2

      metric: 度量距离的标准,默认为闵可夫斯基度量标准,也可以自定义。

      metric_params:自定义的metric的参数。

      n_jobs: 算法并行工作的数目。

    参考:

      李航 《机器学习方法》

  • 相关阅读:
    微服务-分布式事务解决方案
    Python cannot import name 'Line' from 'pyecharts'
    powershell 基础
    Linux SSH config
    神奇的Python代码
    GitHub 中 readme 如何添加图片
    Linux 笔记(自用)
    Anaconda 安装 TensorFlow ImportError:DLL加载失败,错误代码为-1073741795
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
    Git入门教程 Git教程入门
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8947791.html
Copyright © 2011-2022 走看看