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 plt

import mindspore as ms
from mindspore import nn, ops

ms.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 = 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算法的有效性,取𝑘=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.mfbz.cn/a/769121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac单机游戏推荐:星际争霸母巢之战 for Mac v1.16.1汉化版

星际争霸母巢之战 for Mac是一款深受玩家的即时战略游戏,延续了原版《星际争霸》的剧情,并加入了新的游戏单位、科技、地图样式、背景音乐及平衡性调整。《星际争霸》与其它的即时战略类型游戏。 下载地址:点击下载 与原作相同,《…

一图胜千言|用Python搞定统计结果展示!

分享一份原创Python可视化教程:530张图形8000行代码,轻松搞定统计结果展示,部分如下, 每类图表包含详细代码详细代码注释,多达8000行代码,例如, 如何加入学习? 👇&#…

免费分享:2022年全国地铁站点数据(附下载方法)

数据简介 2022年全国地铁站点数据不仅反应我国城市交通网络的日益完善,也为城市规划、公共交通优化、商业布局、应急响应及智慧城市建设提供了宝贵的数据支持与参考,助力城市发展与居民生活质量的全面提升。 数据属性 数据名称:全国地铁站点…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

python gdal 压缩栅格数据

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

MySQL安装与环境配置

1.打开安装程序 2.默认配置&#xff0c;如下二三图 3.配置密码 4.等待安装完毕 5.检查 6.配置环境变量 7.从控制台登录检测

STM32F1+HAL库+FreeTOTS学习4——任务挂起与恢复

STM32F1HAL库FreeTOTS学习4——任务挂起与恢复 任务挂起和恢复的API介绍代码实现 上一期我们学习了FreeRTOS中任务创建的两种方法&#xff0c;这一期我们学习任务的挂起和恢复。 任务挂起和恢复的API介绍 在 &#xff1a;STM32F1HAL库FreeTOTS学习1——FreeRTOS入门 的学习中&…

苹果电脑虚拟机运行Windows Mac环境安装Win PD19虚拟机 parallels desktop19虚拟机安装教程免费密钥激活

在如今多元的数字时代&#xff0c;我们经常需要在不同的操作系统环境下进行工作和学习。而对于 Mac 用户来说&#xff0c;有时候需要在自己的电脑上安装 Windows 操作系统&#xff0c;以体验更多软件及功能&#xff0c;而在 Mac 安装 Windows 虚拟机是常用的一种操作。下面就来…

Python28-5 k-means算法

k-means 算法介绍 k-means 算法是一种经典的聚类算法&#xff0c;其目的是将数据集分成 ( k ) 个不同的簇&#xff0c;每个簇内的数据点尽可能接近。算法的基本思想是通过反复迭代优化簇中心的位置&#xff0c;使得每个簇内的点与簇中心的距离之和最小。k-means 算法的具体步骤…

【FFmpeg】avformat_find_stream_info函数

【FFmpeg】avformat_find_stream_info 1.avformat_find_stream_info1.1 初始化解析器&#xff08;av_parser_init&#xff09;1.2 查找探测解码器&#xff08;find_probe_decoder&#xff09;1.3 尝试打开解码器&#xff08;avcodec_open2&#xff09;1.4 读取帧&#xff08;re…

嵌入式Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

创建kobject

1、kobject介绍 kobject的全称是kernel object&#xff0c;即内核对象。每一个kobject都会对应系统/sys/下的一个目录。 2、相关结构体和api介绍 2.1 struct kobject // include/linux/kobject.h 2.2 kobject_create_and_add kobject_create_and_addkobject_createkobj…

开源自动化热键映射工具autohotkey十大用法及精选脚本

AutoHotkey&#xff08;AHK&#xff09;是一款功能强大的热键脚本语言工具&#xff0c;它允许用户通过编写脚本来自动化键盘、鼠标等设备的操作&#xff0c;从而极大地提高工作效率。以下是AutoHotkey的十大经典用法&#xff0c;这些用法不仅解放了用户的双手&#xff0c;还展示…

字节码编程ASM之插桩方法调用记录

写在前面 源码 。 正式开始之前&#xff0c;先分享一个让人”悲伤“的真实的故事。 那是一个风和日丽的周六的下午&#xff0c;俺正在开开心心的打着羽毛球&#xff0c;突然接到了来自于最不想联系的那个人&#xff08;没错&#xff0c;这个人就是我的领导&#xff01;&#x…

QT Creator生成uml类图

先说方法&#xff0c;使用Doxygen工具&#xff0c;笔者用的虚拟机linux系统下的qt5.7&#xff0c;没找到自带的uml生成类的工具。 1、Doxygen 安装 在 Ubuntu 系统中&#xff0c;执行下面命令安装 doxygen 和 graphviz 软件包。 sudo apt install graphviz # 用于生成代码…

等保2.0 实施方案之信息软件验证要求

一、等保2.0背景及意义 随着信息技术的快速发展和网络安全威胁的不断演变&#xff0c;网络安全已成为国家安全、社会稳定和经济发展的重要保障。等保2.0&#xff08;即《信息安全技术 网络安全等级保护基本要求》2.0版本&#xff09;作为网络安全等级保护制度的最新标准&#x…

Gradle学习-5 发布二进制插件

注&#xff1a;以下示例基于Gradle8.0 1、发布插件 复制一分 buildSrc&#xff0c;执行命令行&#xff0c;生成一个新目录 leon-gradle-plugin cp -rf buildSrc leon-gradle-plugin在 leon-gradle-plugin 目录下的 build.gradle 中引入maven plugins{// 引用 Groovy 插件&…

【热部署】✈️Springboot 项目的热部署实现方式

目录 &#x1f378;前言 &#x1f37b;一、热部署和手动重启 &#x1f37a;二、热部署的实现 2.1 手动启动热部署 2.2 自动检测热部署 2.3 关闭热部署 &#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;书接上文&#xff0c;通过Springboot 中的 actu…

解析Kotlin中扩展函数与扩展属性【笔记摘要】

1.扩展函数 1.1 作用域&#xff1a;扩展函数写的位置不同&#xff0c;作用域就也不同 扩展函数可以写成顶层函数&#xff08;Top-level Function&#xff09;&#xff0c;此时它只属于它所在的 package。这样你就能在任何类里使用它&#xff1a; package com.rengwuxianfun …

zabbix“专家坐诊”第244期问答

问题一 Q&#xff1a;请教一下&#xff0c;我的zabbix6.0配置的基于snmptrap上报的日志提取关键字推送告警&#xff0c;正则表达式能否帮忙看看怎么弄&#xff1f;我这配置的提示一直不正确&#xff1f; A&#xff1a;具体看一下这里的信息。 Q&#xff1a;这个我是直接复制的…