【人工智能与深度学习】KNN算法学习
创始人
2025-05-29 14:15:46

KNN算法

    • 问题的提出
    • 惯性思维解决
    • K值选取与训练
    • 具体使用 KNeighborsClassifier
      • 参数概述
        • 代码实现

问题的提出

假设我们已知一些数据具有的类别,知道一些数据属于A类,一些数据属于B类,现在我们有一些不知道什么类型的数据集C,再假设我们对于这类数据的分类要求只要A、B类。我们想要把C中的数据分到A或者B类中,我们应该怎么办?

惯性思维解决

一堆20mm的螺丝钉和22mm螺丝钉混合在一起,我们有一堆分好的20mm螺丝钉子,有一堆分好的22mm螺丝钉,在正常情况下,我们拿起一个未知的螺丝钉,可能这个螺丝钉因为工艺问题,比22mm短了一点,或者比20mm长了一点。我们就会拿起几个分好的20或者22,比较一下,这个未知的螺丝钉,距离20近呢?还是22近呢?,可能只拿一个22的比较还不够,我们再拿K个判断,这就是KNN在现实生活的应用

K值选取与训练

https://zhuanlan.zhihu.com/p/143092725

具体使用 KNeighborsClassifier

参数概述

def KNeighborsClassifier(n_neighbors = 5,weights='uniform',algorithm = '',leaf_size = '30',p = 2,metric = 'minkowski',metric_params = None,n_jobs = None)

其中:
n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。
weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:

  • ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。

  • ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。

  • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自

定义权重的目的。

algorithm:在 Sklearn 中,要构建 KNN 模型有三种构建方式:

  1. 暴力法,就是直接计算距离存储比较的那种方式。

  2. 使用 Kd 树构建 KNN 模型。

  3. 使用球树构建。

其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 Kd 树构建 KNN 模型,而当 Kd 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:

  • ‘brute’ :蛮力实现;

  • ‘kd_tree’:KD 树实现 KNN;

  • ‘ball_tree’:球树实现 KNN ;

  • ‘auto’: 默认参数,自动选择合适的方法构建模型。

不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’。

leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的。当使用 Kd 树或球树,它就是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。

p:和 metric 结合使用,当 metric 参数是 “minkowski” 的时候,p=1 为曼哈顿距离, p=2 为欧式距离。默认为p=2。

metric:指定距离度量方法,一般都是使用欧式距离。

  • ‘euclidean’ :欧式距离;

  • ‘manhattan’:曼哈顿距离;

  • ‘chebyshev’:切比雪夫距离;

  • ‘minkowski’: 闵可夫斯基距离,默认参数。

n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

引用自此

代码实现

from sklearn.datasets import load_iris
from sklearn.model_selection  import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifieriris = load_iris()
x = iris.data
y = iris.target
k_range = range(1,31)
k_error = []
for k in k_range :knn = KNeighborsClassifier(n_neighbors=k)scores = cross_val_score(knn,x,y,cv=6,scoring='accuracy')k_error.append(1-scores.mean())plt.plot(k_range,k_error)
plt.xlabel('K value')
plt.ylabel('ERROR')
plt.show()

相关内容

热门资讯

特朗普:没有必要解雇鲍威尔,此... 7月25日消息,美国总统特朗普周四参观美联储大楼时表示,他与美联储主席鲍威尔进行了“良好会谈”,讨论...
河北升级重大气象灾害(暴雨)应... 7月25日消息,从河北省气象灾害防御指挥部获悉,河北省决定于7月25日6时升级重大气象灾害(暴雨)应...
两市融资余额增加60.25亿元 7月25日消息,截至7月24日,上交所融资余额报9730.55亿元,较前一交易日增加23.62亿元;...
LG新能源二季度净利润906亿... 7月25日消息,LG新能源(LG Energy Solution)发布的财报显示,2025年第二季度...
人民币兑美元中间价报7.141... 7月25日消息,人民币兑美元中间价报7.1419,下调34点。(科股宝播报)