K近邻——KNN

KNN

(emmmmm……..原计划要写的支持向量机,感觉内容有点多,先写个KNN过度一下吧,以后一定会补上的!)


k近邻,简称kNN,全称k-Nearest Neighbor,是机器学习算法中最简单的算法之一。其基本原理是:根据与待测样本最近的k个邻居的标签来判断待测样本的标签,是一种监督学习方法。简单来说就是“物以类聚,人以群分”、“近朱者赤,近墨者黑”。这种算法严格来说甚至是不需要去“学习”的,它前期只对样本进行一个机械式的记忆,也就是说训练时间开销为零,待收到待测样本后在进行算法操作,是“懒惰学习”(lazy learning)的著名代表。相应的,在训练阶段就对样本进行学习处理,最终学得一个模型的处理方法称为“急切学习”(eager learning)。
这个算法的原理已经非常简单,能产生变数的地方也就是如何去计算样本与邻居的距离,再严格点来说是如何定义样本与样本之间的距离,下面来介绍几种KNN中常用距离公式。

(1)欧式距离

D(x,y)=dj=1(xjyj)2 D ( x , y ) = ∑ j = 1 d ( x j − y j ) 2

最常用的一种距离,非常容易计算,属性的差的平方和开根即可。缺点也很明显,他忽略属性对个体的影响,对每个属性都是无差别对待的。假设 A(170,60000),B(170,59000),C(180,60000)。第一个数值是身高,单位是cm。第二个属性是体重,单位是g。按我们的生活经验来判断,怎么想都是A和B的体型差不多,但是如果要按欧式距离来算,体重差那1000对结果的影响非常大,就会出现判断失误。

(2) 曼哈顿距离(城市街区距离)

D(x,y)=dj=1xjyj D ( x , y ) = ∑ j = 1 d | x j − y j |

这就是纯距离的和了,简单粗暴。如果你把x和y看作xy坐标平面的两个点,欧式距离是将他们连线计算距离,曼哈顿距离是计算他们x轴和y轴方向上的距离之和,也就是一个计算的是三角形的斜边,一个计算的是两条直角边。

(3)切比雪夫距离

D(x,y)=max(xiyi) D ( x , y ) = m a x ( | x i − y i | )

切比雪夫距离计算的是两个点所有维度中差值绝对值最大的值,也就是所有属性中差值绝对值最大的值。

(4)海明距离

D(x,y)=dj=1(xjyj)0 D ( x , y ) = ∑ j = 1 d ( x j − y j ) 0

海明距离主要用于度量非零元素的个数,因为0的0次幂是0,非零元素的0次幂是1。

(5)闵可夫斯基距离

D(x,y)=(dj=1xjyjp)1/p D ( x , y ) = ( ∑ j = 1 d | x j − y j | p ) 1 / p

闵可夫斯基距离不是一个距离,是一组距离。
其中d是维数,理解为属性个数,p是阶数,也称为p范数。
当p=1时,是曼哈顿距离
当p=2时,是欧氏距离
当p→∞时,是切比雪夫距离(此时可用夹逼定理去推导,左边一个最大值,右边d个最大值,这样一夹两边的值最后都等于最大值)
当p=0时,是海明距离

常用距离介绍到这里基本结束,如果还想了解机器学习中更多的距离公式,建议点击这位博友写的博客

计算出距离之后我们对于分类问题一般采用投票法,即选择k个样本中出现最多的标签作为预测标签。在回归问题中可以使用平均法,即将这k个样本的输出的平均值作为预测结果。还可基于距离远近进行加权平均或加权投票,距离越近样本的权重越大。

故KNN算法的一般步骤为:
1、遍历所有样本,计算距离(根据需求选择距离
2、按照距离的大小来排序,选择最近的k个样本
3、根据投票法或平均法来确定预测值

优点:
思想简单,易于实现,无需估计参数,无需训练;
可用于非线性分类;
由于KNN方法主要靠周围有限的邻近的样本,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合;
适合多分类问题;

缺点:
懒惰算法,计算时要遍历所有样本,内存开销大,效率较低。
若遇到样本不平衡问题会产生误差。
输出的可解释性不强。(例如决策树很强)

from sklearn.neighbors import KNeighborsClassifier 
knn = KNeighborsClassifier() 
knn.fit(x_train, y_train)  
y_predict = knn.predict(x_test) 

参数:

  • n_neighbors : int, optional (default = 5) —— 邻居数量
  • weights : str or callable, optional (default = ‘uniform’) ——权重。每个拥有投票权的样本是按什么比重投票,’uniform’表示等比重投票,’distance’表示按距离反比投票,[callable]表示自己定义的一个函数,这个函数接收一个。
  • algorithm : {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, optional ——决定采用什么算法来计算近邻。auto将会自动选一个认为最合适的。
  • leaf_size : int, optional (default = 30) —— 基于以上介绍的算法,此参数给出了kd_tree或者ball_tree叶节点规模,叶节点的不同规模会影响数的构造和搜索速度,同样会影响储树的内存的大小。具体最优规模是多少视情况而定。
  • p : integer, optional (default = 2)——闵可夫斯基距离中各种不同的距离参数,默认为2,即欧氏距离。
  • metric : string or callable, default ‘minkowski’——怎样度量距离,默认是闵可夫斯基距离系列。(貌似更应该放在P前面介绍,无奈官网这个顺序)
  • metric_params : dict, optional (default = None)——距离度量函数的额外关键字参数,一般不用管。
  • n_jobs : int, optional (default = 1)——并行计算的线程数量,默认为1表
  • 示一个线程,为-1的话表示为CPU的内核数,这里不是很追求速度的话不用管。

函数:
fit(X, Y)——训练
X : {array-like, sparse matrix, BallTree, KDTree}
y : {array-like, sparse matrix}

get_params(deep=True)——获得参数
Parameters: deep : boolean, optional True就会返回参数
Returns: params : mapping of string to any

kneighbors(X=None, n_neighbors=None, return_distance=True)——计算某些测试样本的最近的几个近邻训练样本。
X : array-like, shape (n_query, n_features), or (n_query, n_indexed) if metric == ‘precomputed’ 需要寻找近邻的目标样本
n_neighbors : int 邻居个数
return_distance : boolean, optional. Defaults to True. True会返回距离,反之不返回。
return:dist : array 距离 ind : array 近邻的索引

kneighbors_graph(X=None, n_neighbors=None, mode=’connectivity’)——计算X中k个近邻对应的权重
X : array-like, shape (n_query, n_features), or (n_query, n_indexed) if metric == ‘precomputed’ 样本
n_neighbors : int 邻居数
mode : {‘connectivity’, ‘distance’}, optional connectivity会返回一个0和1组成的矩阵,distance会返回欧式距离
Returns: A : sparse matrix in CSR format, shape = [n_samples, n_samples_fit] 返回一个稀疏矩阵

predict(X) 预测,这个不多说
X : array-like, shape (n_query, n_features), or (n_query, n_indexed) if metric == ‘precomputed’
y : array of shape [n_samples] or [n_samples, n_outputs]

predict_proba(X)——也是预测,不同的是返回概率,各种结果的可能性(所有结果的可能性
Parameters:
X : array-like, shape (n_query, n_features), or (n_query, n_indexed) if metric == ‘precomputed’
Returns: p : array of shape = [n_samples, n_classes], or a list of n_outputs

score(X, y, sample_weight=None)——计算准确率
X : array-like, shape = (n_samples, n_features) 测试样本
y : array-like, shape = (n_samples) or (n_samples, n_outputs) X的标签
sample_weight : array-like, shape = [n_samples], optional 是一个和X第一位一样长的各样本对准确率影响的权重(也就是样本量),一般默认为None

set_params(**params)——设置当前估计的参数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值