昇思25天学习打卡营第9天 |昇思MindSpore K近邻算法实现红酒聚类
本次实验主要运用 MindSpore 在部分 wine 数据集上开展 KNN 实验,旨在深入理解 KNN 算法的原理与应用,并通过实际操作掌握其在数据分类中的具体实现。通过本次实验,对 KNN 算法的原理和实践有了更深入的理解,为进一步应用和优化算法奠定了基础。本实验运用 MindSpore 实现 KNN 算法,对 wine 数据集的三类样本进行分类,验证了算法能依据酒的 13 种属性判别酒的品种
一、介绍
本次实验主要运用 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 = k
def 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]] += 1
cls = np.argmax(topk_cls)
return cls
- 模型预测
- 在验证集上进行预测,k 取 5,验证精度约 80%,表明 KNN 算法在该三分类任务上有效。
六、可用于 K 近邻算法聚类实验的其他数据集
| 数据集 | 描述 |
|---|---|
| Iris 数据集 | 包含鸢尾花的花瓣长度、宽度等特征,用于花卉种类的分类。 |
| MNIST 数据集 | 手写数字图像数据集,可用于数字分类任务。 |
| 20 Newsgroups 数据集 | 文本分类数据集,可通过提取文本特征进行分类。 |
七、KNN 算法中距离度量的作用
距离度量在 KNN 算法中起着至关重要的作用:
- 确定样本相似性:通过计算距离来衡量两个样本之间的相似程度。距离越小,表明样本越相似;距离越大,相似性越低。
- 选择近邻样本:KNN 算法的核心是找到距离待测样本最近的 k 个样本。距离度量的准确性直接影响到近邻样本的选择。
- 影响分类结果:不同的距离度量方式可能会导致选择不同的近邻样本,从而影响最终的分类决策。
例如,在欧式距离中,它对各维度上的差异同等对待。而在曼哈顿距离中,更侧重于考虑坐标差值的绝对值之和。
八、实验小结
本实验运用 MindSpore 实现 KNN 算法,对 wine 数据集的三类样本进行分类,验证了算法能依据酒的 13 种属性判别酒的品种。
通过本次实验,对 KNN 算法的原理和实践有了更深入的理解,为进一步应用和优化算法奠定了基础。未来可探索更多复杂数据集和改进算法,提升分类效果和泛化能力。
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)