赞
踩
KNN(K-Nearest Neighbor)即K邻近法,是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类,用老话说:“人以群分,物以类聚”。KNN 算法是有监督学习中的分类算法,它看起来和另一个机器学习算法 K-means 有点像(K-means 是无监督学习算法),但却是有本质区别的。
KNN算法又叫K近邻算法,由这个名字我们不难猜测出这个算法的一些蛛丝马迹,这个算法肯定和K个最近的邻居有很大的关系,而对于这个K的取值也肯定是至关重要的,事实也确实如此。算法大概的意思是:当我们要预测一个新的位置值(点)是属于哪个类别的时候,我们可以看这个点附近什么类别的点数量最多,而附近是指多少距离就是由K决定的,我们可以这么理解,我们以未知点为圆心,以K的大小为半径画圆,在这个圆里面找出各种点类型的数量,哪个类型点最多我们就认为这个未知点属于哪个类型,所以K的取值很重要。具体见下图:
绿色点即为位置点,当K等于3时,不难发现三角形这类最多,所以我们把位置点归类为三角形。
而当K=5时,我们就发现,范围内圆圈的数量最多,所以这时我们把位置点归类为圆形。
从这个例子中我们不难看出K取值的重要性,他决定了我们算法判断的准确性,可以想象下:
1.如果我们的K取值很小的话,谁离未知点近的话未知点就归为哪类,这样未知点是不是很容易受到异常点的影响(即出现我们常说的过拟合)。
2.那如果K的取值很大,那这时离未知点很远的样本也会对未知点产生影响,而按理说这些点和未知点的关系应该是很小的,那这样我们就会有样本均衡的问题(此时模型变得简单,决策边界变平滑,又称欠拟合)。
3.如果K取N的话,那么就是取全部的样本,那当我们要判断未知点时,结果就是把未知点归类为所有样本中最多分类的一种,那这样我们对未知点的分类就失效了,也就是说分类是没有意义的,完全不准确的了。
由此可见一个合适的K值对于KNN算法来说时十分重要的。
交叉验证:将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如7:3拆分出部分训练数据和验证数据,然后选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。简单的说就是:把一些可能的K逐个去尝试一遍,然后选出效果最好的K值。
1.欧式距离(即两点之间的直线距离):
2.曼哈顿距离:
优点:
- 简单易实现:KNN算法的原理简单,易于理解和实现,无需训练过程。
- 适用于多分类问题:KNN算法可以应用于多分类问题,并且对样本分布的假设较少。
- 对异常值不敏感:KNN算法对异常值不敏感,因为它是通过距离计算来确定最近邻样本,即使某个样本是异常值,也不会对整体结果产生很大影响。
缺点:
- 计算复杂度高:KNN算法需要计算测试样本与所有训练样本之间的距离,计算复杂度较高,尤其是在大规模数据集上。
- 高度数据相关:KNN算法依赖于特征空间中的距离度量,如果特征空间中的距离度量不合理或者特征权重不准确,可能会导致预测性能下降。
- 决策边界不规则:KNN算法的决策边界通常是不规则的,因为它只考虑了局部样本的信息,而没有对全局进行建模。
- 对内存要求较高,因为该算法存储了所有训练数据。
- 预测阶段可能很慢。
- import numpy as np
- from sklearn.datasets import load_iris
- from sklearn.model_selection import train_test_split
- from sklearn.neighbors import KNeighborsClassifier
- from sklearn.metrics import accuracy_score
代码如下(示例):
- # 加载鸢尾花数据集
- iris = load_iris()
- X = iris.data # 特征向量
- y = iris.target # 类别标签
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42) #训练集占比为0.4
-
- # 构建KNN分类器
- knn = KNeighborsClassifier(n_neighbors=10) # 设置邻居数量为10
- knn.fit(X_train, y_train) # 在训练集上训练模型
-
- # 在测试集上进行预测
- y_pred = knn.predict(X_test)
-
- # 计算分类准确率
- accuracy = accuracy_score(y_test, y_pred)
- print("你的准确率为: {:.2%}".format(accuracy))

注:该代码使用的是K近邻分类器(KNeighborsClassifier),它是基于最近邻距离进行分类的算法。在这种算法中,默认情况下会使用欧氏距离来计算样本之间的距离。
经过对KNN算法的学习后,我学会了一种用于分类和回归的统计方法,KNN算法是一种简单而直观的分类算法,其基本思想是通过找到与待分类样本最近的K个已知类别样本来确定其类别。其主要优点是实现简单、可解释性强,并且适用于多分类问题和非线性分类问题。但是,KNN算法的缺点也很明显,主要包括计算复杂度高、需要大量的存储空间等。世界上没有完美的算法,每个算法都有优有劣,但KNN算法较为简单,对于我们刚入门的新手来说比较适合,KNN算法虽然有一些局限性和缺点,但是在实际应用中仍然具有很大的价值和意义。理解KNN算法的基本思想,掌握其实现方法和优化技巧,可以对我们进一步学习和应用其他机器学习算法提供很好的基础。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。