文章目录
前言
KNN算法是一种简单但实用的分类算法,它基于实例学习,通过将新实例与已知分类的实例进行比较来做出预测。在本文中,我们将深入探讨KNN算法的基本原理、实现步骤、优缺点、应用场景以及如何改进其存在的问题。
一、KNN算法概述
KNN算法是一种基于实例的学习方法,它假定类别是由实例的特征决定的,并且类别之间的界限是清晰的。KNN算法的主要思想是,如果一个实例的周围大多数实例都属于某个类别,则该实例也属于这个类别。
例如,要确定绿圆属于哪个类别,如果k=3,在其最近的3个样本中红色三角形数量最多,绿圆属于红色三角形类别,如果k=5,在其最近的5个样本中蓝色矩形数量最多,绿圆属于蓝色矩形类别,可见k的选择很重要。
二、KNN算法主要实现步骤
1.确定K的大小
一般而言,从K= 1 开始,随着的逐渐增大,K近邻算法的分类效果会逐渐提升;在增大到某个值后,随着的进一步增大,K近邻算法的分类效果会逐渐下降。
K值越小,分类效果越精细,越容易导致过拟合现象;K值越大,分类效果越粗糙,整体的模型变得简单。因此,在开始时,一般选用较小的奇数作为K的取值,并在训练过程中,使用交叉验证来调整K的大小来达到最好的训练效果。
2.计算待分类实例与已知分类实例之间的距离
距离计算通常采用欧几里得距离、曼哈顿距离等。在实际应用中,为了提高算法效率,可以采用一些优化方法,如空间索引和KD树等。本文以欧几里得距离为例。
对于两个点 P1(x1, y1, ...) 和 P2(x2, y2, ...),它们之间的欧几里得距离是:
d(P1, P2) = sqrt((x1-x2)^2 + (y1-y2)^2 + ...)
其中,平方和的项取决于你的数据维数。例如,如果你的数据是二维的(x,y),那么平方和的项就是 (x1-x2)^2 + (y1-y2)^2。如果数据是三维的(x,y,z),那么平方和的项就是 (x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2,以此类推。详细代码如下:
def euclideanDistance(a, b, length): //length为数据维数
distance = 0
for x in range(length):
distance += pow((a[x]-b[x]), 2)
return math.sqrt(distance)
3.获取距待分类实例最近的K个实例
为了实现这一功能,我们可以通过在数据集中循环遍历每个实例,然后使用上面提到的欧几里得距离公式来完成。对于非常大的数据集,这个步骤可能会非常耗时。
获取了所有距离后,对这些距离进行排序。这可以通过使用排序算法(例如快速排序或归并排序)来完成。
选取距离最小的K个实例。这可以直接从排序后的距离列表中获取前K个元素,将他们加入neightbors数组。具体代码实现如下:
def getNeighbors(Dataset, instance, k):
distances = []
length = len(instance)-1
for x in range(len(Dataset)):
distance = euclideanDistance(instance, Dataset[x], length) //计算点之间的距离
distances.append((Dataset[x], distance)) //加入distances数组
distances.sort(key=operator.itemgetter(1)) //对所有的距离进行排序
neighbors = []
for x in range(k): //获取到距离最近的k个点
neighbors.append(distances[x][0])
return neighbors
4.确定K个近邻类别的中次数最多的类别
在KNN算法中,确定K个近邻类别后,我们要选择这K个近邻类别中数量最多的类别作为预测的结果,实现此机制的方法是投票机制。
对每个K个邻居,计算他们各自的类别分布。例如,如果邻居中有3个属于类别A,2个属于类别B,那么类别A的得票数为3,类别B的得票数为2,随后,选择得票数最多的类别作为预测结果。如果有多个类别得票数相同,那么预测结果可以是这些类别中的任意一个。代码实现如下:
def getClass(neighbors):
votes = {}
for x in range(len(neighbors)):
vote = neighbors[x][-1]
if vote in votes:
votes[vote] += 1
else:
votes[vote] = 1
sortedVotes = sorted(votes.items(), key=operator.itemgetter(1), reverse=True)
return sortedVotes[0][0]
三、总结
KNN算法的优缺点
-
KNN算法优点
- KNN算法简单易理解,实现简单,对数据集的要求较低;
- 能够处理多类问题和多维特征;
- 对数据的预处理要求较低,例如不需要进行特征选择和参数优化等。
-
KNN算法缺点
- 对噪声数据敏感,容易导致分类准确率下降;
- 需要对数据集进行充分的训练,否则无法得到较好的分类效果;
- 需要确定K值,如果K值选择不当,会对分类结果产生影响;
- 在处理大量数据时,效率较低。