赞
踩
本文主要介绍使用MindSpore在部分wine数据集上进行KNN实验。
K近邻算法原理
K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出(Cover等人,1967),是机器学习最基础的算法之一。它正是基于以上思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计出这些样本的类别并进行投票,票数最多的那个类就是分类的结果。KNN的三个基本要素:
Wine数据集是模式识别最著名的数据集之一,Wine数据集的官网:Wine Data Set。这些数据是对来自意大利同一地区但来自三个不同品种的葡萄酒进行化学分析的结果。数据集分析了三种葡萄酒中每种所含13种成分的量,分别是:
获取方式:
Key | Value | Key | Value |
---|---|---|---|
Data Set Characteristics: | Multivariate | Number of Instances: | 178 |
Attribute Characteristics: | Integer, Real | Number of Attributes: | 13 |
Associated Tasks: | Classification | Missing Values? | No |
代码示例:
from download import download
# 下载红酒数据集
url = "https://ascend-professional-construction-dataset.obs.cn-north-4.myhuaweicloud.com:443/MachineLearning/wine.zip"
path = download(url, "./", kind="zip", replace=True)
代码示例:
%matplotlib inline import os import csv import numpy as np import matplotlib.pyplot as plt import mindspore as ms from mindspore import nn, ops ms.set_context(device_target="CPU") # 读取Wine数据集并查看部分数据 with open('wine.data') as csv_file: data = list(csv.reader(csv_file, delimiter=',')) print(data[56:62]+data[130:133]) # 取三类样本(共178条),将数据集的13个属性作为自变量X。将数据集的3个类别作为因变量Y 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) # 将数据集按128:50划分为训练集(已知类别样本)和验证集(待验证样本) train_idx = np.random.choice(178, 128, replace=False) test_idx = np.array(list(set(range(178)) - set(train_idx))) X_train, Y_train = X[train_idx], Y[train_idx] X_test, Y_test = X[test_idx], Y[test_idx] # 取样本的某两个属性进行2维可视化,可以看到在某两个属性上样本的分布情况以及可分性 attrs = ['Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline'] plt.figure(figsize=(10, 8)) for i in range(0, 4): plt.subplot(2, 2, i+1) a1, a2 = 2 * i, 2 * i + 1 plt.scatter(X[:59, a1], X[:59, a2], label='1') plt.scatter(X[59:130, a1], X[59:130, a2], label='2') plt.scatter(X[130:, a1], X[130:, a2], label='3') plt.xlabel(attrs[a1]) plt.ylabel(attrs[a2]) plt.legend() plt.show()
运行结果:
利用MindSpore提供的tile, square, ReduceSum, sqrt, TopK等算子,通过矩阵运算的方式同时计算输入样本x和已明确分类的其他样本X_train的距离,并计算出top k近邻。
代码示例:
class KnnNet(nn.Cell): def __init__(self, k): super(KnnNet, self).__init__() self.k = k def construct(self, x, X_train): #平铺输入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) #-dist表示值越大,样本就越接近 values, indices = ops.topk(-dist, self.k) return indices 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
在验证集上验证KNN算法的有效性,取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。