机器学习--K近邻

概述

笔者目前是一名大三的机器学习菜鸟。本着以学习的目的,从今天开始将会记录所学习的机器学习常用算法,以便加深理解跟后续翻看。都是些概念理解,至于代码的话,还是找其他大牛去吧。

算法思想总结

在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

  1. 计算测试数据与各个训练数据之间的距离;
  2. 按照距离的递增关系进行排序;
  3. 选取距离最小的K个点;
  4. 确定前K个点所在类别的出现频率;
  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类;

所使用数学公式介绍

一、欧式距离
计算空间中两点(x,y)的距离
d ( x , y ) = ∑ k = 1 n ( x k − y k ) 2 d(x,y)= \sqrt{\sum_{k=1}^n(x_{k}-y_{k})^2} d(x,y)=k=1n(xkyk)2
二、Min-Max标准化
也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间
V a l u e = X − M i n X − M a x Value= \frac{X - Min} {X - Max} Value=XMaxXMin
如果想要将数据映射到(-1,1),则将公式换成:
V a l u e = X − M e a n X − M a x Value= \frac{X - Mean} {X - Max} Value=XMaxXMean
三、均方根误差:
衡量观测值与真实值之间的偏差
R M S E = ∑ k = 1 n ( A c t u a l k − P r e d i c t e d k ) 2 n RMSE= \sqrt\frac{\sum_{k=1}^n(Actual_{k}-Predicted_{k})^2}{n} RMSE=nk=1n(ActualkPredictedk)2

算法优点

  • 简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
  • 可用于数值型数据和离散型数据
  • 训练时间复杂度为O(n);无数据输入假定;
  • 对异常值不敏感

算法缺点

  • 计算复杂性高;空间复杂性高;
  • 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
  • 一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。
  • 最大的缺点是无法给出数据的内在含义。

Sklearn实现k近邻算法简介

链接: 官方文档.

MethodDescribe
fit(X, y)Fit the model using X as training data and y as target values
get_params([deep])Get parameters for this estimator.
kneighbors([X, n_neighbors, return_distance])Finds the K-neighbors of a point.
kneighbors_graph([X, n_neighbors, mode])Computes the (weighted) graph of k-Neighbors for points in X
predict(X)Predict the class labels for the provided data
predict_proba(X)Return probability estimates for the test data X.
score(X, y[, sample_weight])Returns the mean accuracy on the given test data and labels.
set_params(**params)Set the parameters of this estimator.

KNneighborsClassifier参数说明:

  • n_neighbors:默认为5,就是k-NN的k的值,选取最近的k个点。
  • weights:默认是uniform,参数可以是uniform、distance,也可以是用户自己定义的函数。uniform是均等的权重,就说所有的邻近点的权重都是相等的。distance是不均等的权重,距离近的点比距离远的点的影响大。用户自定义的函数,接收距离的数组,返回一组维数相同的权重。
  • algorithm:快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。ball tree是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。
  • leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。
  • metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。
  • p:距离度量公式。在上小结,我们使用欧氏距离公式进行距离度量。除此之外,还有其他的度量方法,例如曼哈顿距离。这个参数默认为2,也就是默认使用欧式距离公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。
  • metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
  • n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的所有cores都用于并行工作。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值