1、概述
全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。K-近邻算法是一种基本而又有效的机器学习算法,用于分类和回归任务。它属于实例学习方法,或者说是一种基于规则的记忆方法。
2、基本概念
-
K值(Number of Neighbors, K):
-
K是算法中的一个关键参数,决定了评估新数据点时考虑的最近邻居的数量。
-
-
特征空间(Feature Space):
-
特征空间是数据点的所有特征组成的空间,每个数据点在这个空间中都有一个位置。
-
-
距离度量(Distance Metric):
-
用于计算特征空间中两个点之间的距离。常见的距离度量包括欧氏距离、曼哈顿距离和闵可夫斯基距离。
-
欧氏距离(Euclidean Distance)(最常用):
-
最常用的距离度量,定义为多维空间中两点之间的直线距离。公式为:
𝑑(𝑝,𝑞)=
-
其中 p 和 q 是两个点,pi 和 qi 是它们在第 i维的坐标。
-
-
曼哈顿距离(Manhattan Distance):
-
也称为城市街区距离,是两点在标准坐标系上的绝对轴距之和。公式为:
𝑑(𝑝,𝑞)=
-
-
-
超参数(Hyperparameter):
-
算法运行之前需要设置的参数,K值就是K-NN算法的一个超参数。
-
-
训练集(Training Set):
-
用于训练模型的数据集,包含输入特征和对应的标签。
-
-
测试集(Test Set):
-
用于评估模型性能的数据集,通常不参与训练过程。
-
3、算法流程
-
选择K值:确定考虑的邻居数量。
-
确定距离度量:选择一种距离度量方法。
-
对测试数据点进行距离计算:计算测试点与训练集中所有点的距离。
-
找到K个最近邻居:根据距离排序,选择最近的K个点。
-
进行决策:根据K个邻居的标签进行投票(分类)或计算平均值(回归)。
-
输出预测结果:将决策结果作为新数据点的预测输出。
-
例子
import numpy as np
#导入txt文件,numpy可以读取txt文件以二维数组的形式保存
data=np.loadtxt("datingTestSet2.txt")
#导入k-近邻分类器
from sklearn.neighbors import KNeighborsClassifier
#获取数组除最后一列的数据子集,特征集
# 特征集(Feature Set):
# 特征集是由多个特征(Feature)组成的集合,这些特征是输入到模型中用于进行预测的数据点。
# 特征可以是连续的数值,也可以是离散的类别。
# 在监督学习中,特征集通常不包含目标变量(即我们想要预测的值)。
# 例如,在房价预测模型中,特征可能包括房屋的大小、位置、建造年份等。
x=data[:,:-1]
#获取数组最后一列的数据子集,标签集
# 标签集(Label Set):
# 标签集是与特征集相对应的,包含了每个数据点的目标变量或结果。
# 在监督学习中,标签集是我们希望模型学习并预测的值。
# 标签可以是连续的数值(如回归问题)或离散的类别(如分类问题)。
# 继续上面房价的例子,标签集将包含每个房屋的实际售价。
y=data[:,-1]
#设置k-近邻分类,近邻数为10
neigh=KNeighborsClassifier(n_neighbors=10)
#将特征集和标签集训练分类器
neigh.fit(x,y)
#对指定一个数据预测
print(neigh.predict([[42383,12.36756,1.5236]]))
#对指定列表预测
predict_data=[[56789,08.12345,2.67890],
[12345,67.23456,3.45678],
[23456,78.34567,4.56789],
[34567,89.45678,5.67890],
[45678,90.56789,6.78901],
[56789,01.23456,7.89012]]
print(neigh.predict(predict_data))
4、KNN算法优缺点
-
优点
-
简单易懂:无需训练过程,实现简单。
-
无参数学习:除了K值外,没有其他需要调节的参数。
-
适用于多分类问题。
-
-
缺点
-
计算成本高:特别是对于大规模数据集,每次预测都需要遍历整个训练集。
-
对噪声敏感:训练数据中的异常值会对预测结果产生较大影响。
-
存储需求大:需要存储全部训练数据。
-