机器学习中knn算法介绍及其案例实现
一,
KNN(K近邻)算法是一种基于实例的监督学习分类方法,其核心思想是“物以类聚”。下面从原理、实现和应用三个层面逐步解析:
一、核心原理
-
基本假设
在特征空间中,相邻样本具有相似的类别属性。对于新样本 $x_q$,通过其最近邻的 $k$ 个已知样本的类别投票决定其类别。 -
距离度量
关键公式:欧氏距离(最常用)
$$ d(x_i, x_j) = \sqrt{\sum_{m=1}^n (x_{i,m} - x_{j,m})^2} $$
其他距离:曼哈顿距离、余弦相似度等。 -
k值选择
- $k$ 过小:对噪声敏感,易过拟合
- $k$ 过大:决策边界平滑,但可能忽略局部特征
(经验法则:$k \leq \sqrt{\text{样本数}}$)
二、算法实现
import numpy as np
from collections import Counter
def knn_predict(X_train, y_train, X_test, k=3):
predictions = []
for test_point in X_test:
# 计算所有训练样本的距离
distances = np.sqrt(np.sum((X_train - test_point)**2, axis=1))
# 获取最近的k个样本索引
nearest_indices = np.argsort(distances)[:k]
# 统计k个邻居的类别
nearest_labels = y_train[nearest_indices]
# 多数投票决策
pred = Counter(nearest_labels).most_common(1)[0][0]
predictions.append(pred)
return predictions
三、典型应用场景
-
分类问题
- 医疗诊断:基于患者指标判断疾病类型
- 图像识别:手写数字分类(如MNIST数据集)
-
回归问题
输出为连续值(如房价预测),取 $k$ 个邻居的平均值:
$$ \hat{y}q = \frac{1}{k} \sum{i \in N_k} y_i $$
四、优缺点总结
| 优势 | 劣势 |
|---|---|
| 无需训练阶段 | 计算复杂度高($O(n)$) |
| 直观易理解 | 对高维数据效果差(维度灾难) |
| 天然支持多分类 | 需妥善处理特征缩放 |
提示:实际应用中常结合KD树或球树优化搜索效率,并建议使用
scikit-learn的KNeighborsClassifier实现。
KNN(K近邻)算法是一种基于实例的监督学习分类方法,其核心思想是“物以类聚”。下面从原理、实现和应用三个层面逐步解析:
一、核心原理
-
基本假设
在特征空间中,相邻样本具有相似的类别属性。对于新样本 $x_q$,通过其最近邻的 $k$ 个已知样本的类别投票决定其类别。 -
距离度量
关键公式:欧氏距离(最常用)
$$ d(x_i, x_j) = \sqrt{\sum_{m=1}^n (x_{i,m} - x_{j,m})^2} $$
其他距离:曼哈顿距离、余弦相似度等。 -
k值选择
- $k$ 过小:对噪声敏感,易过拟合
- $k$ 过大:决策边界平滑,但可能忽略局部特征
(经验法则:$k \leq \sqrt{\text{样本数}}$)
二、算法实现
import numpy as np
from collections import Counter
def knn_predict(X_train, y_train, X_test, k=3):
predictions = []
for test_point in X_test:
# 计算所有训练样本的距离
distances = np.sqrt(np.sum((X_train - test_point)**2, axis=1))
# 获取最近的k个样本索引
nearest_indices = np.argsort(distances)[:k]
# 统计k个邻居的类别
nearest_labels = y_train[nearest_indices]
# 多数投票决策
pred = Counter(nearest_labels).most_common(1)[0][0]
predictions.append(pred)
return predictions
三、典型应用场景
-
分类问题
- 医疗诊断:基于患者指标判断疾病类型
- 图像识别:手写数字分类(如MNIST数据集)
-
回归问题
输出为连续值(如房价预测),取 $k$ 个邻居的平均值:
$$ \hat{y}q = \frac{1}{k} \sum{i \in N_k} y_i $$
四、优缺点总结
| 优势 | 劣势 |
|---|---|
| 无需训练阶段 | 计算复杂度高($O(n)$) |
| 直观易理解 | 对高维数据效果差(维度灾难) |
| 天然支持多分类 | 需妥善处理特征缩放 |
提示:实际应用中常结合KD树或球树优化搜索效率,并建议使用
scikit-learn的KNeighborsClassifier实现。
全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。
其中knn算法中有两种经典距离即为欧式距离和曼哈顿距离



其中knn算法中参数的具体意义如下:
n_neighbors:k值,邻居的个数,默认为5。【关键参数】
weights:权重项,默认 uniform 方法。
- Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
- Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
- Callable:用户自定义权重。
algorithm:用于计算最近邻的算法。
- ball_tree:球树实现
- kd_tree:KD 树实现,是一种对 n 维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
- brute:暴力实现
- auto:自动选择,权衡上述三种算法。【一般按自动即可】
leaf_size:空值 KD 树或者球树的参数,停止建子树的叶子节点的阈值。
p:距离的计算方式。P=1 为曼哈顿距离,p=2 为欧式距离。
metric:用于树的距离度量
1. 曼哈顿距离
2. 欧式距离
3. 切比雪夫距离
4. 闵可夫斯基距离
5. 带权重闵可夫斯基距离
6. 标准化欧式距离
7. 马氏距离
metric_params:用于比较复杂的距离的度量附加参数。【用不上】
score()
更多推荐
所有评论(0)