从零开始学习数学建模:K近邻算法(KNN)
目录
K近邻算法(KNN)
概念简介:
K近邻算法(K-Nearest Neighbors, KNN)是一种用于分类和回归的非参数化监督学习方法。它的核心思想是:给定一个待分类的样本,根据距离度量找到其在特征空间中最接近的K个邻居,然后通过这K个邻居的标签来确定该样本的类别(分类任务)或输出(回归任务)。KNN 具有简单直观、易于理解的特点,但由于需要存储所有训练样本,它的计算复杂度相对较高。
KNN 的距离度量通常采用欧氏距离、曼哈顿距离或者闵可夫斯基距离等。通过调整邻居数量K的值,KNN 可以适应不同的场景:
-
K 值较小时,对噪声数据敏感,但预测更准确。
-
K 值较大时,对噪声的影响较小,但预测可能过于平滑。
应用场景:
-
推荐系统:KNN 可用于基于用户的相似性来推荐电影、音乐等。例如,根据某个用户与其他用户的兴趣相似度,推荐给他可能喜欢的电影。
-
模式识别:KNN 常用于手写数字识别、图像分类等模式识别任务,例如根据一张新图片的特征,找到最相似的几张已标记的图片,来确定新图片的类别。
-
信用风险评估:根据客户的财务状况、历史信用评分等,KNN 可以用来评估客户的信用风险。
-
医学诊断:KNN 可用于对疾病进行分类,例如基于病人的症状和病史,预测某人是否患有某种疾病。
生活中的例子:
-
电影推荐:根据你喜欢的电影类型,KNN 可以找到和你有相似偏好的观众喜欢的电影,然后推荐给你。
-
朋友推荐:在社交媒体中,KNN 可以根据你的社交行为(如共同好友、共同兴趣),找到与你最相似的人,并推荐你添加他们为好友。
-
饮食选择:根据个人口味和健康偏好,KNN 可以在餐厅菜单中推荐适合你的食物。
MATLAB代码示例
以下示例展示了如何在MATLAB中使用 K 近邻算法对鸢尾花数据集进行分类。我们将使用fitcknn函数来构建模型并进行预测。
% 加载示例数据集
load fisheriris;
% 定义输入特征和目标标签
X = meas;
y = species;
% 训练 K 近邻分类器
k = 5; % 设置邻居数
knnModel = fitcknn(X, y, 'NumNeighbors', k);
% 使用训练好的分类器进行预测
sample = [5.1, 3.5, 1.4, 0.2]; % 示例数据
predicted_label = predict(knnModel, sample);
% 显示预测结果
fprintf('预测结果:%s\n', predicted_label{1});
在这个示例中,我们使用 MATLAB 的fitcknn函数来训练一个 K 近邻分类器,并对新的数据点进行预测。可以通过调整邻居数量 k 来更改模型的行为。
Python代码示例
在 Python 中,可以使用 scikit-learn 库中的 KNeighborsClassifier 来实现 KNN 分类器。以下是用 Python 实现相同分类任务的代码示例:
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
# 加载示例数据集
iris = load_iris()
X, y = iris.data, iris.target
# 训练 K 近邻分类器
k = 5 # 设置邻居数
knn_model = KNeighborsClassifier(n_neighbors=k)
knn_model.fit(X, y)
# 使用训练好的分类器进行预测
sample = [[5.1, 3.5, 1.4, 0.2]] # 示例数据
predicted_label = knn_model.predict(sample)
print(f'预测结果:{iris.target_names[predicted_label[0]]}')
在这个 Python 示例中,我们使用 KNeighborsClassifier 类来训练一个 K 近邻分类器,并对新的样本进行预测。可以通过调整 n_neighbors 来更改邻居数量,灵活地控制模型的行为。
MATLAB与Python实现对比
| 特性 | MATLAB 实现优势 | Python 实现优势 |
|---|---|---|
| 使用便捷性 | MATLAB 提供内置的工具箱,简洁直观,适合快速进行 KNN 模型训练和验证 | Python 的 scikit-learn 库功能丰富,代码简洁,适合处理大规模数据集 |
| 可视化功能 | MATLAB 提供集成的可视化工具,适合交互式数据展示 | Python 的 Matplotlib 提供更多的可视化自定义选项,适合复杂数据可视化 |
| 开源与生态 | MATLAB 是商业软件,功能强大但需要购买许可 | Python 完全开源,社区资源丰富,拥有大量机器学习相关的扩展库 |
| 社区支持 | MATLAB 有专门的技术文档和详细的工具支持,适合科研和教学 | Python 社区庞大,scikit-learn 有丰富的文档和示例,广泛应用于工业和科研 |
K 近邻在 MATLAB 与 Python 中的应用
| 应用场景 | MATLAB 优势 | Python 优势 |
| 推荐系统 | MATLAB 的工具箱便于快速设计推荐系统原型 | Python 拥有丰富的数据分析工具,适合实现复杂的推荐系统 |
| 模式识别 | MATLAB 的图形化界面便于进行快速原型和可视化测试 | Python 的灵活性和多样化库,适合处理大规模模式识别任务 |
| 信用风险评估 | MATLAB 的金融工具箱适合进行快速建模和风险评估 | Python 与 Pandas 和 NumPy 结合,易于处理大规模金融数据 |
| 医学诊断 | MATLAB 界面友好,适合医生和研究人员使用 | Python 与 Scikit-learn 和数据处理库结合,处理复杂医学数据 |
总结:
-
MATLAB 提供了高效的 K 近邻模型训练工具,非常适合快速原型设计和教学使用,尤其在对模型进行可视化和交互式展示时,MATLAB 的图形化环境可以提高效率。
-
Python 则以其开源特性和灵活性成为处理复杂 K 近邻任务的理想选择,尤其是在结合大数据和其他机器学习工具时,Python 的
scikit-learn库表现尤为出色。
对于初学者,如果目标是理解 K 近邻的基本概念并快速进行模型构建和验证,MATLAB 是一个很好的选择。而对于希望处理更复杂的数据集、需要与其他机器学习方法结合的开发者,Python 则是不二之选。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)