目录
拉到文末有福利
k-nearest neighbors(KNN)算法是监督机器学习中最简单但最常用的算法之一。
KNN通常被认为是一种惰性的学习算法,从技术上讲,它只是存储训练数据集,而不经历训练阶段。
KNN的原理是将新样本的特征与数据集中现有样本的特征进行比较。然后通过算法选择最接近的k个样本(k是自定义参数),新样本的输出是基于"k"最近样本的多数类(用于分类)或平均值(用于回归)确定的。
机器学习算法可以分为参数模型和非参数模型:
参数模型:估计训练数据集中的参数,学习可以对新数据点进行分类的函数,而不再需要原始训练数据集。典型模型有感知器、逻辑回归和线性 SVM。
非参数模型不能用一组固定的参数来表征,参数的数量随着训练数据量的变化而变化。典型的模型有决策树分类器/随机森林、SVM、KNN。
KNN在分类问题中应用更加广泛,但也可以应用于回归问题。
KNN 算法本身相当简单,可以概括为以下步骤:
-
选择k的值和距离度量
-
根据计算的距离,选择最近的K个邻近点
-
分类:根据选定邻近点中不同类别的比例来决定测试样本的类别。
回归:根据选定邻近点的平均值(或基于距离的加权平均),作为测试样本的预测值。
寻找观测值的最近邻
k近邻算法 (KNN) 的目标是识别给定测试点的最近邻,以便我们可以为该点分配一个类标签,因此确定距离的度量方法有助于形成决策边界,而决策边界可将测试点划分为不同的区域
要找到一个观测值的 k 个最近的观测值(邻居),可以使用 scikit-learn 的NearestNeighbors
类,scikit-learn 提供了多种距离度量方法,默认情况下,NearestNeighbors
使用闵可夫斯基距离(Minkowski distance)距离:
其中,xi 和 yi 是我们正在计算距离的两个值。
实际上,闵可夫斯基距离 (Minkowski Distance)是将多种距离公式(曼哈顿距离、欧式距离、切比雪夫距离)的一个推广。
当闵可夫斯基距离的超参数 p = 1时为曼哈顿距离(Manhattan distance):
当p = 2 时为欧几里得距离(Euclidean distance):
默认情况下,scikit-learn 中 p = 2。
下面基于鸢尾花数据集,使用NearestNeighbors
来找到新建观测值new_observation
在标准化特征空间中距离最近的两个点:
# Load libraries
from sklearn import datasets
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler
# Load data
iris = datasets.load_iris()
features = iris.data
# Create standardizer
standardizer = StandardScaler()
# Standardize features
features_standardized = standardizer.fit_transform(features)
# Two nearest neighbors
nearest_neighbors = NearestNeighbors(n_neighbors=2).fit(features_standardized)
# Create an observation
new_observation = [ 1, 1, 1, 1]
# Find distances and indices of the observation's nearest neighbors
distances, indices = nearest_neighbors.kneighbors([new_observation])
# View the nearest neighbors
features_standardized[indices]
# View distances
distances
还可以使用metric
参数设置距离度量,例如通过metric
参数将距离度量方法设为欧式距离:
# Find two nearest neighbors based on Euclidean distance
nearestneighbors_euclidean = NearestNeighbors( n_neighbors=2, metric='euclidean').fit(features_standardized)
p
参数与metric
参数都可以用于设置距离度量方法,区别在于p
参数用于指定Minkowski距离的阶数,因此只有当metric='minkowski'
时才生效,其他情况下p
参数会被忽略。
此外,我们