KNN(K-Nearest Neighbors,K近邻算法)是一种用于分类和回归的非参数化方法。其基本思想是通过找出与新样本最接近的已标记数据中的K个最近邻居来进行预测或分类。
注释:非参数化方法是指在统计学和机器学习中,不对数据分布做出严格假设(这些假设通常包括对数据的具体分布类型(如正态分布、指数分布等)、分布的参数(如均值、方差等)以及数据之间的相关性结构。)或者假设非常少的一类方法。这与参数化方法相对,参数化方法假设数据服从特定的分布形式,并且基于这些假设推断模型参数。
具体来说,对于分类问题,KNN算法会根据新样本周围K个最近的训练样本的类别来决定新样本的类别,通常采用投票法(占比最大)决定最终类别。在回归问题中,KNN算法则是通过K个最近邻居的平均值或加权平均值来预测新样本的数值输出。
KNN算法的优点包括简单易懂、无需训练过程(即所谓的非参数化方法)、适用于多分类问题以及能够处理多种类型的数据。然而,它也有一些缺点,如计算复杂度高、需要大量存储空间(因为需要保留所有训练数据)、对于特征空间中不相关的特征表现不佳等。
总的来说,KNN算法是一种强大且常用的机器学习算法,特别适合于小型数据集或对实时预测速度要求不高的情况。
KNN分类流程:
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 进行多数表决,统计 K 个样本中哪个类别的样本个数最多
- 将未知的样本归属到出现次数最多的类别
KNN回归流程:
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 把这个 K 个样本的目标值计算其平均值
- 将未知的样本预测的值了
掌握K近邻算法API处理分类问题(简单代码展示):
# 读本示例,问样本有几条,每个样本有几个特征值
from sklearn.neighbors import KNeighborsClassifier
def dm01_knnapi_分类():
estimator = KNeighborsClassifier(n_neighbors=1)
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
estimator.fit(X, y)
# 改变[]里的值
myret = estimator.predict([[4]])
print('myret-->', myret)
dm01_knnapi_分类()
掌握K近邻算法API处理回归问题(简单代码展示):
# 对于回归
# 请通过观察法确定k=1时, myret的预测值是多少?
# 请通过观察法确定k=2时, myret的预测值是多少?
from sklearn.neighbors import KNeighborsRegressor
def dm02_knnapi_回归():
'''KNeighborsRegressor 类创建了一个 k 最近邻回归模型,
其中 n_neighbors=2 指定了模型要考虑的最近邻居的数量为 2。
这意味着在预测新数据点的目标值时,模型会考虑每个数据点附近的两个最近邻居的目标值。'''
estimator = KNeighborsRegressor(n_neighbors=1)
estimator = KNeighborsRegressor(n_neighbors=2)
X = [[0, 0, 1],
[1, 1, 0],
[3, 10, 10],
[4, 11, 12]]
y = [0.1, 0.2, 0.3, 0.4]
estimator.fit(X, y)
# 改变[]里的值
myret = estimator.predict([[3, 11, 10]])
print('myret-->', myret)
dm02_knnapi_回归()