一、介绍
本次实验主要运用 MindSpore 在部分 wine 数据集上开展 KNN 实验,旨在深入理解 KNN 算法的原理与应用,并通过实际操作掌握其在数据分类中的具体实现。
二、K 近邻算法原理
要素 | 描述 |
---|---|
K 值 | 决定分类结果的邻居数量,过小易受噪声影响,过大则类别界限模糊。 |
距离度量 | 反映样本相似度,常用欧式距离、曼哈顿距离、海明距离等。 |
分类决策规则 | 通常为多数表决或基于距离加权的多数表决。 |
-
分类问题
- 流程:找出待测样本的最近 k 个样本,统计各类别样本个数,取最多数类别为结果。
- 带权重的 k 近邻算法:考虑样本投票权重。
-
回归问题
- 无权重:预测值为最近 k 个训练样本标签均值。
- 带权重:预测值为加权后的标签均值。
-
距离定义
- 欧氏距离:常用于 KNN 算法,使用时需对特征向量各分量归一化。
- 其他距离:如 Mahalanobis 距离、Bhattacharyya 距离等。
三、数据处理
步骤 | 描述 |
---|---|
数据准备 | 可从 Wine 数据集官网或华为云 OBS 下载 wine.data 文件。 |
数据读取与处理 | 导入所需模块,配置运行信息,读取并处理 Wine 数据集,将数据分为自变量 X 和因变量 Y,对样本的某些属性进行二维可视化,观察样本分布和可分性,划分训练集和验证集。 |
四、数据集的作用
作用 | 说明 |
---|---|
提供数据基础 | Wine 数据集包含不同种类葡萄酒的各种特征值,为算法提供分析和学习素材。 |
验证算法效果 | 通过对已知类别的样本学习和预测,评估 K 近邻算法在该数据集上的准确性和有效性。 |
探索特征关系 | 帮助了解不同葡萄酒特征之间的内在联系,及特征如何影响分类结果。 |
以下是读取和处理数据集的代码示例:
import os
import csv
import numpy as np# 读取数据集
with open('wine.data') as csv_file:data = list(csv.reader(csv_file, delimiter=','))# 提取自变量和因变量
X = np.array([[float(x) for x in s[1:]] for s in data[:178]], np.float32)
Y = np.array([s[0] for s in data[:178]], np.int32)
五、模型构建与预测
- 计算距离
- 构建 KnnNet 类,利用 MindSpore 算子计算输入样本与训练样本的距离,并获取 top k 近邻。
class KnnNet(nn.Cell):def __init__(self, k):super(KnnNet, self).__init__()self.k = kdef construct(self, x, X_train):x_tile = ops.tile(x, (128, 1))square_diff = ops.square(x_tile - X_train)square_dist = ops.sum(square_diff, 1)dist = ops.sqrt(square_dist)values, indices = ops.topk(-dist, self.k)return indices
- 预测函数
- 定义 knn 函数,根据近邻样本类别进行预测。
def knn(knn_net, x, X_train, Y_train):x, X_train = ms.Tensor(x), ms.Tensor(X_train)indices = knn_net(x, X_train)topk_cls = [0]*len(indices.asnumpy())for idx in indices.asnumpy():topk_cls[Y_train[idx]] += 1cls = np.argmax(topk_cls)return cls
- 模型预测
- 在验证集上进行预测,k 取 5,验证精度约 80%,表明 KNN 算法在该三分类任务上有效。
六、可用于 K 近邻算法聚类实验的其他数据集
数据集 | 描述 |
---|---|
Iris 数据集 | 包含鸢尾花的花瓣长度、宽度等特征,用于花卉种类的分类。 |
MNIST 数据集 | 手写数字图像数据集,可用于数字分类任务。 |
20 Newsgroups 数据集 | 文本分类数据集,可通过提取文本特征进行分类。 |
七、KNN 算法中距离度量的作用
距离度量在 KNN 算法中起着至关重要的作用:
- 确定样本相似性:通过计算距离来衡量两个样本之间的相似程度。距离越小,表明样本越相似;距离越大,相似性越低。
- 选择近邻样本:KNN 算法的核心是找到距离待测样本最近的 k 个样本。距离度量的准确性直接影响到近邻样本的选择。
- 影响分类结果:不同的距离度量方式可能会导致选择不同的近邻样本,从而影响最终的分类决策。
例如,在欧式距离中,它对各维度上的差异同等对待。而在曼哈顿距离中,更侧重于考虑坐标差值的绝对值之和。
八、实验小结
本实验运用 MindSpore 实现 KNN 算法,对 wine 数据集的三类样本进行分类,验证了算法能依据酒的 13 种属性判别酒的品种。
通过本次实验,对 KNN 算法的原理和实践有了更深入的理解,为进一步应用和优化算法奠定了基础。未来可探索更多复杂数据集和改进算法,提升分类效果和泛化能力。