一、K近邻算法
1.算法概述
KNN(k-nearest neighbors)算法是一种基本的机器学习算法,主要用于分类和回归问题。在分类问题中,它通过计算距离来确定新样本属于哪个类别;在回归问题中,它通过计算邻居样本的平均值来预测新样本的值。
2.算法原理
KNN算法根据样本之间的距离进行分类或回归。简单来说,如果一个样本在特征空间中的多个最近邻的样本中的大多数都属于某一个类别,则该样本也属于这个类别。K表示外部定义的近邻数量。
3.三个基本要素
k值的选择:K值的选择对KNN算法的性能影响很大。较小的K值可能会导致过拟合,对噪声敏感;而较大的K值可能会使得不同类别的样本混淆,影响准确性。
距离度量:常用的距离度量方法包括欧里几得距离和曼哈顿距离。根据应用场景和数据特征,选择合适的距离度量方法可以提高算法的准确性。
欧里几得距离:指两个点在n维空间中的直线距离。
曼哈顿距离:指两个点在n维空间中在各个维度上的距离总和
分类决策规则:分类决策规则用于确定KNN算法中输入样本的类别。一般有多数表决和加权投票两种主要的分类决策规则。
多数表决:统计K个邻居中每个类别出现的频次,将频次最高的类别作为输入样本的类别。
加权投票:指在多数表决的基础上,为不同的邻居赋予不同的权重,权重可以根据距离远近或其他因素进行分配。
4.算法优劣
优点:KNN算法可以处理多分类问题,并且能够在一定程度上处理非线性分类问题,是一种简单直观的算法,易于理解和实现。
缺点:KNN算法需要计算输入样本与每个训练集样本之间的距离,计算复杂度随着训练集规模增大而增加。另外由于存储所有的训练集样本,当训练集规模较大时,会占用大量的存储空间。
二、算法实例
(1)通过包含若干种动物及其身高和体重信息的数据集,来预测一只新的动物属于哪种类别。
(2)准备数据:
(3)源码:
import numpy as np
# 动物数据(身高(cm)、体重(kg)、种类)
data = np.array([
[180, 80, '狮子'],
[175, 75, '狮子'],
[170, 70, '狮子'],
[150, 60, '老虎'],
[155, 65, '老虎'],
[120, 20, '猴子'],
[125, 22, '猴子'],
[115, 18, '猴子']
])
def knn_predict(train_X, train_y, test_X, K):
num_train = train_X.shape[0] # 训练样本数量
num_test = test_X.shape[0] # 测试样本数量
distances = np.zeros((num_test, num_train)) # 存储测试样本与训练样本之间的距离
# 计算欧氏距离
for i in range(num_test):
distances[i] = np.sqrt(np.sum((train_X - test_X[i]) ** 2, axis=1))
# 根据距离排序,获取最近的K个样本的索引
nearest_index = np.argsort(distances, axis=1)[:, :K]
# 对最近的K个样本进行投票,得到预测结果
y_pred = np.zeros(num_test)
for i in range(num_test):
y_pred[i] = np.argmax(np.bincount(train_y[nearest_index[i]]))
return y_pred
# 输入样本特征
input_data = []
height = float(input("请输入身高(cm): "))
weight = float(input("请输入体重(kg): "))
input_data.append([height, weight])
# 将输入数据转换成numpy数组
input_X = np.array(input_data)
# 提取训练数据的特征和标签
train_X = data[:, :2].astype(float)
train_y = np.array([1, 1, 1, 2, 2, 3, 3, 3])
# 使用KNN算法进行预测
K = 3 # 设置K值
y_pred = knn_predict(train_X, train_y, input_X, K)
# 输出预测结果
if y_pred == 1:
print("预测结果:狮子")
elif y_pred == 2:
print("预测结果:老虎")
elif y_pred == 3:
print("预测结果:猴子")
else:
print("无法预测结果")
- 定义了一个
knn_predict
函数,用于预测输入样本的种类。该函数接收训练样本特征、训练样本标签、测试样本特征和K值作为输入参数。 - 在
knn_predict
函数中,首先计算测试样本与训练样本之间的欧氏距离,并存储在distances
数组中。 - 根据距离排序,找到最近的K个样本的索引,存储在
nearest_index
数组中。 - 对最近的K个样本进行投票,确定预测结果。利用
np.bincount
统计K个样本中每个种类出现的次数,并使用np.argmax
选取出现最多的种类作为预测结果。 - 主程序部分,通过用户输入获取待预测样本的身高和体重,并将其转换成NumPy数组。
- 提取训练数据的特征和标签。
- 调用
knn_predict
函数进行预测,设置K值为3。 - 根据预测结果输出相应的动物种类。
(4)运行结果:
三、总结
KNN算法可以处理多分类问题,并且能够在一定程度上处理非线性分类问题。它的实现相对简单,主要包括计算距离、选择最近邻居、确定分类决策规则等步骤。但计算复杂度高、存储空间消耗大,受离群值影响较大,需要选择合适的K值,因此在实际应用中需要结合具体问题和数据特点进行选择和优化。
此外,KNN算法中的一个重要参数是K值,选择合适的K值对模型的性能影响较大。在实验过程中,可以通过交叉验证等方法来评估不同K值的效果,选择使模型性能达到最优的K值。