机器学习之KNN(K近邻算法)

KNN - K nearest neighbor 

算法利用的数学思想极少


思想:对于一个新来的点,根据判断k个最近的点,来判断新来的点的类别。

过程:

1)先计算新来的点与样本中每一个点的距离(欧拉距离)

2)找到最近的k个点 (可以用np.argsort)

3)找到k个点中类别最多的点的类


所以k邻近算法可以说是没有模型的算法,也可以说训练集数据就是模型


scikit-learn中调用这个kNN算法:

from sklearn.neighbors import KNeighborsClassifier


kNN_classifier = KNeighborsClassifier(n_neighbors = 6)  #n_neighbors就是k的值

kNN_classifier.fit(X_train, y_train)  #拟合

kNN_classifier.predict(x)


超参

在前面的做法中 k个相邻节点的权重都相同,这说明在这k个节点中,离测试点最近最远的点的影响是一样的,所以加上权重可能让我们的模型更好

在sklearn.neighbors.KNeighborsClassifier 下有一个参数就是weights,我们可以通过这个来设置


有时候我们也不单单使用欧拉距离,我们也会使用曼哈顿距离、明可夫斯基距离((∑|xi-yi|^p)^(1/p) (i=1,2,...n)


但是在这个算法下仍然有很大的缺陷:

1)效率低下就是一个很大的问题,训练集有m个样本,每个样本有n个feature的话 那么算法复杂度就是O(m * n)

通常优化这个算法会使用树结构(KD-Tree, Ball-Tree)

2)对outlier太敏感了

3)可能没法去解释这个算法

4)维数灾难:对于高维的feature,距离可能会非常巨大 通常通过PCA去降维后处理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值