目录
什么是knn算法
KNN(K-Nearest Neighbors)是一种基本的分类和回归算法,它通过计算距离来判断一个样本点属于哪个类别或者预测其数值。KNN算法的核心思想是,如果一个样本附近的k个最近邻中大多数属于某个类别,那么该样本很有可能也属于这个类别。
knn算法的步骤
下面是一个KNN算法的例子,假设我们有一个二维数据集,分为两个类别,我们希望通过KNN算法对新样本进行分类:
1.加载数据集:
将训练数据集信息加载到内存中。
# 定义训练数据集
X_train = np.array([[1, 2], [2, 1], [3, 4], [4, 3]])
y_train = np.array([0, 0, 1, 1])
# 定义测试数据
X_test = np.array([[2.5, 3]])
2.特征标准化:
特征缩放可以提高模型的准确性。将所有特征值缩放到相同的范围内,例如[0, 1]。
# 特征标准化(这里简单地将特征值缩放到[0, 1]范围内)
X_train = (X_train - X_train.min()) / (X_train.max() - X_train.min())
X_test = (X_test - X_train.min()) / (X_train.max() - X_train.min())
3.计算距离:
根据选定的距离度量(如欧氏距离或曼哈顿距离),计算每个测试样本与所有训练样本之间的距离。
# 计算距离
distances = np.sqrt(np.sum((X_train - X_test) ** 2, axis=1))
4.选择最近的K个样本:
根据计算出的距离,选择与测试样本距离最近的K个训练样本。
# 选择最近的K个样本
k = 3
nearest_indices = distances.argsort()[:k]
nearest_labels = y_train[nearest_indices]
5.进行投票或计算平均值:
在分类问题中,使用这K个样本的标签进行投票,将得票最多的标签作为测试样本的预测结果。在回归问题中,使用这K个样本的目标变量的平均值作为测试样本的预测结果。
# 进行投票,选出得票最多的标签
prediction = np.bincount(nearest_labels).argmax()
print("预测结果:", prediction)
我们首先定义了一个训练数据集`X_train`和对应的标签`y_train`,然后定义了一个测试数据`X_test`。接下来,我们进行特征标准化,计算每个训练样本与测试样本之间的距离,并选择最近的K个训练样本。最后,通过投票的方式确定测试样本的类别,并输出预测结果。
实验中遇到的问题
计算距离的方法:在K近邻算法中,计算样本之间的距离是一个重要的步骤。常用的距离计算方法有欧氏距离、曼哈顿距离。
本次实验使用的是欧氏距离。欧氏距离是最常用的距离度量方法,其定义为两个向量之间的欧氏距离,即两个向量各个维度差值的平方和的平方根。
欧氏距离适用于连续特征的距离度量,计算两个向量之间的直线距离。本实验中,欧氏距离是一个合适的选择。
knn算法的优缺点
优点:
1. 无需训练:KNN算法属于一种懒惰学习算法,不需要显式地进行模型训练,而是将所有的训练样本保存在内存中,当需要进行预测时直接计算距离即可。
2. 适用性广泛:KNN算法可以用于分类问题和回归问题,并且对数据分布没有假设,适用于各种类型的数据。
缺点:
1. 计算复杂度高:KNN算法需要计算测试样本与所有训练样本之间的距离,当训练集很大时,计算复杂度会很高。
2. 需要确定K值:KNN算法需要选择合适的K值,不同的K值可能会导致不同的预测结果。
总结
KNN算法是一种简单而常用的机器学习算法,适用于各种类型的数据和问题,根据具体问题和数据特点来选择是否使用KNN算法,进行相应的优化和调参。