首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 为何选择机器学习
1.1.1 机器学习能够解决的问题
1.1.2 熟悉任务和数据
1.2 为何选择Python
1.3 scikit-learn
1.4 必要的库和工具
1.4.1 Jupyter Notebook
1.4.2 NumPy
1.4.3 SciPy
1.4.4 matplotlib
1.4.5 pandas
1.4.6 mglearn
1.5 Python 2 与Python 3 的对比
1.7 第 一个应用:鸢尾花分类
1.7.1 初识数据
1.7.2 衡量模型是否成功:训练数据与测试数据
1.7.3 要事第 一:观察数据
1.7.4 构建第 一个模型:k 近邻算法
1.7.5 做出预测
1.7.6 评估模型
2.1 分类与回归
2.2 泛化、过拟合与欠拟合
2.3 监督学习算法
2.3.1 一些样本数据集
2.3.2 k 近邻
2.3.3 线性模型
2.3.4 朴素贝叶斯分类器
2.3.5 决策树
2.3.6 决策树集成
2.3.7 核支持向量机
2.3.8 神经网络(深度学习)
2.4 分类器的不确定度估计
2.4.1 决策函数
2.4.2 预测概率
2.4.3 多分类问题的不确定度
3.1 无监督学习的类型
3.2 无监督学习的挑战
3.3 预处理与缩放
3.3.1 不同类型的预处理
3.3.2 应用数据变换
3.3.3 对训练数据和测试数据进行相同的缩放
3.3.4 预处理对监督学习的作用
3.4 降维、特征提取与流形学习
3.4.1 主成分分析
3.4.2 非负矩阵分解
3.4.3 用t-SNE 进行流形学习
3.5 聚类
3.5.1 k 均值聚类
3.5.2 凝聚聚类
3.5.3 DBSCAN
3.5.4 聚类算法的对比与评估
3.5.5 聚类方法小结
当前位置:
首页>>
技术小册>>
Python机器学习基础教程(上)
小册名称:Python机器学习基础教程(上)
### 2.3.2 k近邻(k-Nearest Neighbors, k-NN) 在机器学习领域,k近邻(k-Nearest Neighbors,简称k-NN)是一种既简单又强大的分类与回归方法。其核心思想在于“近朱者赤,近墨者黑”——即一个样本的类别(或回归值)应该与其在特征空间中最近的k个邻居的类别(或回归值)最为接近。k-NN算法不需要进行模型的显式训练,而是直接将整个训练集作为参考集,在预测时根据待预测样本与训练集中各样本的距离来找出最近的k个邻居,并基于这些邻居的信息进行预测。 #### 2.3.2.1 k-NN算法原理 **1. 距离度量** 在k-NN算法中,首先需要定义一个合适的距离度量方式,用以计算样本之间的距离。最常用的距离度量是欧氏距离(Euclidean Distance),但在不同的问题背景下,也可以采用曼哈顿距离(Manhattan Distance)、闵可夫斯基距离(Minkowski Distance)等。对于二维空间中的两点$p_1(x_1, y_1)$和$p_2(x_2, y_2)$,它们的欧氏距离公式为: $$d(p_1, p_2) = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$$ 扩展到n维空间,两点$p_1(x_1^{(1)}, x_1^{(2)}, \ldots, x_1^{(n)})$和$p_2(x_2^{(1)}, x_2^{(2)}, \ldots, x_2^{(n)})$之间的欧氏距离为: $$d(p_1, p_2) = \sqrt{\sum_{i=1}^{n} (x_1^{(i)} - x_2^{(i)})^2}$$ **2. k值选择** k-NN算法中的k是一个超参数,其选择对算法的性能有显著影响。k值较小时,模型对噪声较为敏感,容易发生过拟合;k值较大时,模型则变得简单,但可能会忽略掉一些重要的局部信息,导致欠拟合。在实际应用中,通常需要通过交叉验证等方法来确定最优的k值。 **3. 投票机制(分类)** 在分类任务中,k-NN算法通过多数投票的方式来确定待预测样本的类别。即,找出待预测样本的k个最近邻,然后统计这k个邻居中每个类别的出现次数,将待预测样本归类为出现次数最多的那个类别。 **4. 平均值/中位数(回归)** 在回归任务中,k-NN算法则通过计算k个最近邻的目标值(即因变量)的平均值或中位数来预测待预测样本的目标值。这种方法虽然简单,但在某些情况下能够取得不错的预测效果。 #### 2.3.2.2 k-NN算法的优势与局限 **优势**: 1. **简单易懂**:k-NN算法思想直观,易于实现和理解。 2. **无需显式训练**:与其他机器学习算法不同,k-NN算法不需要进行模型的显式训练,而是直接将训练集用于预测。 3. **适用于多分类问题**:k-NN算法天然支持多分类问题,且无需对算法本身进行任何修改。 4. **对异常值不敏感(取决于k值)**:当k值较大时,单个异常值对预测结果的影响会减弱。 **局限**: 1. **计算成本高**:随着训练集样本数量的增加,计算待预测样本与所有训练样本之间距离的成本会迅速上升,导致算法效率降低。 2. **维度灾难**:在高维空间中,由于数据点之间的相对距离趋于相等,k-NN算法的性能会显著下降。 3. **对k值敏感**:k值的选择对算法性能有重要影响,而k值的选择往往依赖于具体问题和先验知识。 4. **易受不平衡数据集影响**:在不平衡数据集中,k-NN算法可能会偏向于多数类样本,导致对少数类样本的预测效果不佳。 #### 2.3.2.3 k-NN算法的优化策略 为了克服k-NN算法的上述局限,研究者们提出了多种优化策略: 1. **数据预处理**:通过特征选择、特征降维等方法降低数据的维度,提高算法效率并缓解维度灾难问题。 2. **使用KD树、球树等数据结构**:这些数据结构可以高效地查找最近邻,显著减少计算成本。 3. **权重投票**:在分类任务中,可以根据邻居与待预测样本之间的距离远近为其投票结果赋予不同的权重,使得距离更近的邻居对预测结果的影响更大。 4. **k值动态调整**:根据数据的分布情况和预测任务的需求,动态调整k值以提高算法性能。 5. **处理不平衡数据集**:通过重采样、合成少数类样本等方法改善数据集的不平衡性,提高k-NN算法对少数类样本的预测能力。 #### 2.3.2.4 实战案例:使用Python实现k-NN分类 在Python中,我们可以利用`scikit-learn`库中的`KNeighborsClassifier`类来实现k-NN分类。以下是一个简单的示例代码: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建k-NN分类器实例,设置k=3 knn = KNeighborsClassifier(n_neighbors=3) # 训练模型 knn.fit(X_train, y_train) # 预测测试集 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f'Accuracy: {accuracy:.4f}') ``` 在上述代码中,我们首先加载了鸢尾花(Iris)数据集,并将其划分为训练集和测试集。然后,我们创建了一个k-NN分类器实例,设置了k值为3,并使用训练集数据对模型进行了训练。最后,我们使用训练好的模型对测试集进行了预测,并计算了模型的准确率。 通过调整k值和其他参数,我们可以进一步探索k-NN算法在不同设置下的性能表现。同时,结合上述提到的优化策略,我们可以尝试对算法进行改进,以提高其在特定任务上的预测效果。
上一篇:
2.3.1 一些样本数据集
下一篇:
2.3.3 线性模型
该分类下的相关小册推荐:
Python编程轻松进阶(一)
Python数据分析与挖掘实战(下)
Python合辑7-集合、列表与元组
Python合辑8-变量和运算符
Python与办公-玩转Excel
Python3网络爬虫开发实战(上)
Python编程轻松进阶(二)
Python合辑9-判断和循环
机器学习算法原理与实战
Python高并发编程与实战
Python自动化办公实战
Python合辑5-格式化字符串