240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类

KNN(K近邻)算法实现红酒聚类

K近邻算法,是有监督学习中的分类算法,可以用于分类和回归,本篇主要讲解其在分类上的用途。

文章目录

  • KNN(K近邻)算法实现红酒聚类
    • 算法原理
    • 数据下载
    • 数据读取与处理
    • 模型构建--计算距离
    • 模型预测

算法原理

KNN算法虽然是机器学习算法,但是他不学习,他的原理是把所有的训练集都存储下来,在测试的时候把测试集放到原图里面,根据测试点和训练集的距离判定属于的类别。如下图示例,假设我们现在有两个类别,分别是A和B,用三角和圆圈(不太圆见谅)表示,我们把这两种类别都画在坐标系中。此时载入一个未知类别方框,我们的KNN算法就开始了。

110098762832b5a36dc6b017825df1d

首先我们要指定一个K值,K值就是距离值,比如我们先指定K=2,就可以在这个位置类别周围画一个圆(可以理解为半径为2),如下图:

36b42e26031f9e5e878ea7b6e1a1df2

此时我们这个圆框进去了两个A类别,根据算法原理,此时就会把这个未知类别判断为A类别。而如果我们扩大K值呢

6ac9ca29672e8c05d90f380e5101696

当我们把K值从2扩大到4时(小圆外面的大圆),可以看到,此时包进来了4个B类别值,A类别值仍然只有2个,此时就会判断为B类别。这个算法有一点划地盘的意思,画个圈,这圈里谁人多,你就跟谁走,是这意思。歪理原理就这么结束了,下面让我们看看正经的解释。

K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出(Cover等人,1967),是机器学习最基础的算法之一。它正是基于以上思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计出这些样本的类别并进行投票,票数最多的那个类就是分类的结果。KNN的三个基本要素:

  • K值,一个样本的分类是由K个邻居的“多数表决”确定的。K值越小,容易受噪声影响,反之,会使类别之间的界限变得模糊。
  • 距离度量,反映了特征空间中两个样本间的相似度,距离越小,越相似。常用的有Lp距离(p=2时,即为欧式距离)、曼哈顿距离、海明距离等。
  • 分类决策规则,通常是多数表决,或者基于距离加权的多数表决(权值与距离成反比)。

预测算法(分类)的流程如下:

(1)在训练样本集中找出距离待测样本x_test最近的k个样本,并保存至集合N中;

(2)统计集合N中每一类样本的个数𝐶𝑖,𝑖=1,2,3,…,𝑐𝐶𝑖,𝑖=1,2,3,…,𝑐;

(3)最终的分类结果为argmax𝐶𝑖𝐶𝑖 (最大的对应的𝐶𝑖𝐶𝑖)那个类。

在上述实现过程中,k的取值尤为重要。它可以根据问题和数据特点来确定。在具体实现时,可以考虑样本的权重,即每个样本有不同的投票权重,这种方法称为带权重的k近邻算法,它是一种变种的k近邻算法。

数据下载

我们使用Wine数据集进行展示,Wine数据集的官网:Wine Data Set,这个数据集是对同一地区三个不同品种的葡萄酒进行化学分析后记录的结果。数据集分析了三种葡萄酒中每种所含13种成分的量。这些13种属性是

  1. Alcohol,酒精
  2. Malic acid,苹果酸
  3. Ash,灰
  4. Alcalinity of ash,灰的碱度
  5. Magnesium,镁
  6. Total phenols,总酚
  7. Flavanoids,类黄酮
  8. Nonflavanoid phenols,非黄酮酚
  9. Proanthocyanins,原花青素
  10. Color intensity,色彩强度
  11. Hue,色调
  12. OD280/OD315 of diluted wines,稀释酒的OD280/OD315
  13. Proline,脯氨酸

可以采用两种下载方式:

  • 方式一,从Wine数据集官网下载wine.data文件。
  • 方式二,从华为云OBS中下载wine.data文件。

此时我们默认已经安装了Mindspore环境,采用从华为云OBS中下载数据集

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 pltimport mindspore as ms
from mindspore import nn, opsms.set_context(device_target="CPU")
with open('wine.data') as csv_file:data = list(csv.reader(csv_file, delimiter=','))
print(data[56:62]+data[130:133])

执行完这几行代码后我们会打印出来部分数据进行查看,比如我这里打印出这样的数据

image-20240703222223714

此时最开始的每个list最开始的第一个数都是1或2或3,这就是葡萄酒的三种类别,后面紧跟着的13个参数就是他的13种化学成分。

取三类样本(共178条),将数据集的13个属性作为自变量X,将数据集的3个类别作为因变量Y。此时X和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)

取样本的某两个属性进行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)# 选择的化学成分由循环轮数i决定a1, a2 = 2 * i, 2 * i + 1# 选择前59个类别为1的数据,化学成分选a1和a2类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()

这里执行完了就可以看到四张打印出来的图,就体现了每一类葡萄酒其中两种化学成分的关系

将数据集按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]

模型构建–计算距离

利用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 = kdef 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 indicesdef 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

模型预测

在验证集上验证KNN算法的有效性,取𝑘=5𝑘=5,验证精度接近80%,说明KNN算法在该3分类任务上有效,能根据酒的13种属性判断出酒的品种。

acc = 0
knn_net = KnnNet(5)
for x, y in zip(X_test, Y_test):pred = knn(knn_net, x, X_train, Y_train)acc += (pred == y)print('label: %d, prediction: %s' % (y, pred))
print('Validation accuracy is %f' % (acc/len(Y_test)))

打卡图片:

image-20240703215517332

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日产X-Trail | 压电式喷油器故障

故障现象 冷启动正常,但超车或者发动机处于负荷状态时就会出现熄火。熄火后无法重新发动,要等发动机完全冷却下来才能再次启动。 有两个故障代码:“P2146:喷油器1和2电源对地短路” 和 “P2146:喷油器3和4电源对地短…

vscode python调试,找不到控制调试工具栏,被隐藏了

问题: 如图所示,最开始蓝框中的调试台被莫名其妙的隐藏了,没法进行调试。 解决办法: 打开设置输入调试点击调试(31)找到红框选的那个选项,选择floating

激活函数、向前传播、损失函数、梯度下降

激活函数 作用:主要引入了非线性。从而能解决很复杂的非线性关系。能更好地处理现实世界的数据和任务。 向前传播 向前传播描述了,神经网络中,输入层到输出层的信号传播和处理过程。输入层将特征数据输入,加权求和,…

Django QuerySet对象,all()方法

all()方法 在Django中,all()方法是QuerySet对象的一个方法,用于获取模型的所有实例。 当你调用ModelName.objects.all()时,Django会生成一个SQL查询,从数据库中获取该模型的所有记录,并返回一个QuerySet对象&#xf…

匠心独运:红酒与手工艺的很好结合

在岁月的长河中,红酒与手工艺都以其不同的魅力和技艺,书写着各自的故事。当这两者相遇,仿佛是一场跨越时空的对话,不仅展现了匠心独运的技艺之美,更在无声中诉说着对品质与生活的热爱。今天,就让我们一起探…

Springboot访问resources下的静态资源遇到的问题

1. No mapping for GET ... 我的实现了WebMvcConfigurationSupport接口的配置文件WebMvcConfiguration.java里配置了静态资源的处理规则,也就是addResourceHandlers()这个方法,修改后的正确方法如下 protected void addResourceHandlers(ResourceHandle…

echarts-wordcloud:打造个性化词云库

前言 在当今信息爆炸的时代,如何从海量的文本数据中提取有用的信息成为了一项重要的任务。词云作为一种直观、易于理解的数据可视化方式,被广泛应用于文本分析和可视化领域。本文将介绍一种基于 echarts-wordcloud 实现的词云库,通过其丰富的…

探索 Vim 的撤销树:时光倒流的编辑艺术

⏫️ 探索 Vim 的撤销树:时光倒流的编辑艺术 在文本编辑的世界里,Vim 是一款让无数开发者和系统管理员爱不释手的编辑器。它不仅仅是一个编辑器,更是一个强大的工具,其中撤销树(Undo Tree)功能让编辑历史变…

react动态渲染列表与函数式组件

1.如何使用jsx语法动态渲染列表呢&#xff0c;下边我用一个例子来切实总结一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scal…

主流 Canvas 库对比:Fabric.js、Konva.js 和 Pixi.js

在前端开发中&#xff0c;HTML5 Canvas 是一个强大的工具&#xff0c;可以用来创建图形、动画和各种视觉效果。为了简化和增强 Canvas 的使用&#xff0c;社区中出现了许多库。本文将对比三种主流的 Canvas 库&#xff1a;Fabric.js、Konva.js 和 Pixi.js&#xff0c;分析它们的…

魔行观察-AI数据分析>>勒泰中心购物中心

摘要 本报告基于 魔行观察 搜集整理的数据&#xff0c;对勒泰中心购物中心的营业状态、商户构成、业态分布以及消费者评价进行了详细分析。 商场概览 勒泰中心是一个正常营业的购物中心&#xff0c;自2013年开业以来&#xff0c;已成为当地居民和游客的重要购物和休闲场所。…

golang写的自动更新器

文件自动更新器&#xff0c;这个很多端游和软件都有用到的。 golang的rpc通信&#xff0c;是非常好用的一个东西&#xff0c;可以跟调用本地函数一样&#xff0c;调用远程服务端的函数&#xff0c;直接从远程服务端上拉取数据下来&#xff0c;简单便捷。 唯一的遗憾就是&#x…

Vue3实战笔记(65)—记录本项目浪费不少时间求证的问题

文章目录 前言一、多个根问题二、动画失效三、首次加载动画效果不生效&#xff0c;不同router-view之间切换无动画效。总结 前言 笔记最重要的作用就是温故而知新&#xff0c;最近遇到不少问题都是曾经遇到的&#xff0c;知道就是想不起来&#xff0c;查查自己的笔记都轻松解决…

Speculative decoding 投机采样原理和验证

概念 做法有很多&#xff0c;这里介绍最广泛被人认识的一种&#xff08;朴素投机采样&#xff09; 瓶颈&#xff1a; 大模型推理自回归采样&#xff0c;逐步串行解码。 生成的每个Token都需要将所有参数从存储单元传输到计算单元。 因此&#xff1a;内存访问带宽成为重要的瓶颈…

python gdal 压缩栅格数据

1 压缩方法LZW 使用 LZW&#xff08;Lempel-Ziv-Welch&#xff09;&#xff0c;主要对图像数据压缩&#xff0c;可逆 2 代码 函数gdal_translate()&#xff1a;转换栅格的不同格式 我们使用的数据是GTiff格式的数据 GTiff – GeoTIFF File Format — GDAL documentation 参…

EtherCAT主站IGH-- 6 -- IGH之device.h/c文件解析

EtherCAT主站IGH-- 6 -- IGH之device.h/c文件解析 0 预览一 该文件功能`device.c` 文件功能函数预览二 函数功能介绍1. `ec_device_init`2. `ec_device_clear`3. `ec_device_attach`4. `ec_device_detach`5. `ec_device_open`6. `ec_device_close`7. `ec_device_tx_data`8. `ec…

怎样保存python文件

按下“CtrlS”键即可快速保存Python文件。 或者点击“File”&#xff0c;在下拉菜单中选择“Save”。 打开后我们就会看到这样的一个页面窗口了。 我们还能在这里进行路径的保存位置的查找。 然后在这里选择文件类型&#xff0c;并输入文件名。 接下来我们点击保存就可以完成操…

上位机网络通讯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…

[linux 配置]Ubuntu SSH登录配置

安装一个Ubuntu操作系统&#xff0c;有可能不能通过SSH登录&#xff0c;可能因为没有安装SSH或者没有配置SSH 安装 //打开终端 sudo apt-get install openssh-server 查看安装状态 ps -e |grep ssh 配置 主要修改两个配置文件&#xff1a; 进入ssh目录下 cd /etc/ssh …

【高考志愿】地质资源与地质工程

目录 一、专业概述 1.1 专业定义 1.2 主要课程 1.3 专业培养目标 二、就业前景和考研方向 三、工作特点和挑战 四、如何培养核心竞争力 五、 地质资源与地质工程专业排名 六、结语 关于高考志愿选择地质资源与地质工程专业&#xff0c;以下是一些详细的介绍和参考信息…