KNN算法的主要优点和缺点
KNN(K-Nearest Neighbors)算法是一种非常简单和直观的机器学习算法,它可以用于分类和回归问题。KNN算法的主要思想是根据最近邻样本的分类情况来预测待分类样本的类别。它的主要优点是简单易懂,不需要进行模型的训练过程;然而,它也存在一些缺点,如计算复杂度高、对异常值敏感等。下面将详细介绍KNN算法的原理、公式推导、计算步骤和Python代码示例。
算法原理
KNN算法基于距离度量的思想,可以用于分类和回归问题。对于分类问题,KNN算法通过计算待分类样本与已知样本之间的距离,找到离待分类样本最近的K个样本,然后根据这K个样本的类别进行投票,最终将待分类样本分到得票最多的类别中。对于回归问题,KNN算法则采用K个最近邻样本的平均值或加权平均值作为待分类样本的预测值。
公式推导
KNN算法的公式推导主要涉及距离度量以及类别投票的过程。
- 距离度量:KNN算法一般使用欧式距离来度量样本之间的距离,表示为:
$$d(x, y) = \sqrt{\sum\limits_{i=1}^{n}(x_i – y_i)^2}$$
其中,$x$和$y$分别表示两个样本,$n$表示样本的特征数。
- 类别投票:对于分类问题,KNN算法通过投票来确定待分类样本的类别。假设已知的K个近邻样本中有$m$个属于类别$A$,$k-m$个属于类别$B$,那么待分类样本的类别可以表示为:
$$
f(x) = \begin{cases}
A, & \text{if } m > \frac{k}{2} \
B, & \text{otherwise}
\end{cases}
$$
计算步骤
KNN算法的计算步骤主要包括以下几个方面:
-
数据准备:将数据集分为训练集和测试集。
-
特征归一化:对特征进行归一化处理,通常使用最小-最大归一化方法。
-
计算距离:对于每个测试样本,计算它与训练集中每个样本之间的距离。
-
选择最近邻:选取离测试样本最近的K个样本。
-
类别投票:根据K个最近邻样本的类别进行投票。
-
预测结果:将投票得到的类别作为测试样本的预测结果。
Python代码示例
import numpy as np
from sklearn.datasets import make_classification
# 生成虚拟数据集
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, random_state=1)
# 定义KNN算法类
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X = X
self.y = y
def predict(self, X):
distances = []
for i in range(len(self.X)):
distance = np.sqrt(np.sum((X - self.X[i])**2)) # 计算欧式距离
distances.append((distance, self.y[i]))
distances.sort(key=lambda x: x[0]) # 按距离排序
neighbors = distances[:self.k] # 取最近的k个样本
classes = [neighbor[1] for neighbor in neighbors]
return max(set(classes), key=classes.count) # 类别投票
# 创建KNN对象
knn = KNN(k=5)
# 拟合训练集
knn.fit(X, y)
# 预测测试集
y_pred = [knn.predict(x) for x in X]
代码细节解释
上述代码中,我们首先使用make_classification
函数生成了一个包含100个样本的二分类问题的虚拟数据集。然后定义了一个KNN算法的类KNN
,其中fit
方法用于拟合训练集,predict
方法用于预测测试集。在predict
方法中,我们使用欧式距离计算样本之间的距离,并选择最近的K个样本。最后,使用类别投票的方式将K个样本的类别进行投票,并将得票最多的类别作为预测结果。
通过以上的示例,我们可以看到KNN算法的实现过程,它简单易懂,但也有一些局限性,如计算复杂度高、对异常值敏感等。但在某些场景下,KNN算法仍然可以有效地解决问题。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/831848/
转载文章受原作者版权保护。转载请注明原作者出处!