首页 > 编程语言 >机器学习KNN算法实现例子

机器学习KNN算法实现例子

时间:2024-04-01 16:58:35浏览次数:22  
标签:KNN plt 算法 例子 类别 new data wine

KNN算法(k近邻算法)是一种有监督分类算法,它的原理非常简单,下面以一个简单的例子引入。
已知两种酒的标签:赤霞珠和黑皮诺,在这个情景中,我们对酒进行分类的依据是酒精浓度和颜色深度,如下图所示:红色代表赤霞珠,紫色代表黑皮诺,图中有一分类未知的黄点,给定一个K值,我们找到距离黄点最近的K个点,假设K取3,我们发现距离黄点最近的3个点都是红点,0个紫点,根据少数服从多数原则,红:紫 = 3:0,所以认为黄点属于红色这一类,即赤霞珠。

1.算法实现步骤
根据上面那个例子,我们可以把KNN算法过程总结为以下几个步骤:

①确定一个K值, K值我一般取奇数,方便投票;
②计算距已知类别数据集中的点与当前点的距离 ;
③找到离最小的K个点 ;
④确认这K个点的类别 ;
⑤把出现次数最多的类别作为当前点的预测类别 ;
python实现knn算法例子

导入需要的库

import numpy as np
import pandas as pd`
import matplotlib.pyplot as plt

训练数据

rowdata = {'颜色深度':[14.23,13.2,13.16,14.37,13.24,12.07,12.43,11.79,12.37,12.04],
'酒精浓度':[5.64,4.38,5.68,4.80,4.32,2.76,3.94,3. ,2.12,2.6 ],
'品种':[0,0,0,0,0,1,1,1,1,1]}

rowdata中的品种为 0 代表 “黑皮诺”,1 代表 “赤霞珠”, 设置一个未知类别的点,变量名为new_data

新设置一个未知类别的点

new_data = np.array([4.1,12.8])

把rowdata转换为DataFrame

wine_data = pd.DataFrame(rowdata)

wine_data信息如下:

颜色深度	酒精浓度	品种

0 14.23 5.64 0
1 13.20 4.38 0
2 13.16 5.68 0
3 14.37 4.80 0
4 13.24 4.32 0
5 12.07 2.76 1
6 12.43 3.94 1
7 11.79 3.00 1
8 12.37 2.12 1
9 12.04 2.60 1

绘制散点图

修改样式

plt.style.use('ggplot')

windows电脑电脑正常显示中文

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(6,4),dpi = 300)
plt.scatter(wine_data[wine_data.品种 == 0]['酒精浓度'], wine_data[wine_data.品种 == 0]['颜色深度'], c = 'purple', label = '黑皮诺' )
plt.scatter(wine_data[wine_data.品种 == 1]['酒精浓度'], wine_data[wine_data.品种 == 1]['颜色深度'], c = 'red' , label = '赤霞珠' )
plt.scatter(new_data[0] , new_data[1] ,c = 'yellow')
plt.scatter(3.5 , 12.2 ,c = 'green')
plt.title('10瓶红酒')
plt.xlabel('酒精浓度')
plt.ylabel('颜色深度')

图例添加 1. scatter 里面 添加 label 2. 添加plt.legend()

plt.legend(loc = 2)

将新的数据new_data绘制上来

plt.show()

画出的图形如下,我们可以简单的清晰的看到各点分布情况

KNN算法实现步骤:

1.确定一个k值 为 3

k = 3

2.计算已知类别数据集中的点与当前点的距离

distance = np.sqrt(np.sum((wine_data[['酒精浓度','颜色深度']] - new_data)**2,axis=1))
distance

3.找到距离最小的K个点

argsort对其排序,返回其索引值,再切片得到最近的k个值

distance.argsort()[:k]

4.确认这K个点的类别

k_vote = wine_data.loc[distance.argsort()[:k]]['品种']

5.把出现次数最多的类别作为当前点的预测类别

结果为0;

knn算法例子结束。

标签:KNN,plt,算法,例子,类别,new,data,wine
From: https://www.cnblogs.com/LanYuauAn/p/18108845

相关文章

  • 算法基础
    1.算法的特性输入输出算法具有零个或者多个输入,同时,算法具有至少一个的输出。对于在屏幕上打印”HelloWorld”一样,你可以不需要有任何的输入,直接输出得到结果即可,而对于一个没有输出的算法,没有任何意义。确定性算法的每一步都具有确定的含义,无二义性。任何条件下,算法只......
  • 数据结构与算法入门
    数据结构与算法入门1、数据结构介绍程序(Program)=数据结构(DataStructure)+算法(Algorithm)”数据结构是计算机专业中一门综合性的基础课程,它是介于数学,计算机硬件和计算机软件的三者之间一门核心课程,同时,数据结构是设计数据库,程序,操作系统,游戏等等设计方面的重要基础,是绝大多数计......
  • DIY 3 种分库分表分片算法,自己写的轮子才吊!
    大家好,我是小富~前言本文是《ShardingSphere5.x分库分表原理与实战》系列的第六篇,书接上文实现三种自定义分片算法。通过自定义算法,可以根据特定业务需求定制分片策略,以满足不同场景下的性能、扩展性或数据处理需求。同时,可以优化分片算法以提升系统性能,规避数据倾斜等问题。在......
  • 代码随想录算法训练营第二十五天(回溯2)|216. 组合总和 III、17. 电话号码的字母组合(JA
    文章目录216.组合总和III解题思路源码17.电话号码的字母组合解题思路源码216.组合总和III找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可......
  • 代码随想录算法训练营第二十七天(回溯3)|39. 组合总和、40. 组合总和 II、131. 分割回文
    文章目录39.组合总和解题思路源码40.组合总和II解题思路源码131.分割回文串解题思路源码39.组合总和给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回......
  • php采用aes算法,字符编码utf8,填充模式ECB,填充:ZeroPadding,编码:base64,实现加密
    原文:https://blog.csdn.net/yinxinyue0621/article/details/129813334一、php:三种填充模式的区别(PKCS7Padding/PKCS5Padding/ZeroPadding)(一)常见的三种填充方式:我们知道某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要......
  • 搜索算法练习——拼图问题
    拼图问题是一个经典的搜索问题,其中目标是将一个拼图板恢复到初始状态,或者找到一个初始状态到目标状态的最短路径。我们可以使用广度优先搜索(BFS)来解决这个问题,将每个状态作为节点,并尝试所有可能的移动。fromcollectionsimportdequedefswap(board,i,j,ni,nj):......
  • 一文搞定opencv中常见的关键点检测算法(附代码)
    作者:K.Fire|来源:计算机视觉工坊前言角点时图像中存在物体边缘角落位置的点或者一些特殊位置的点,角点检测(CornerDetection)是计算机视觉系统中获取图像特征的一种方法,是运动检测、图像匹配、视频跟踪、三维重建和目标识别的基础。本篇文章将介绍opencv中常用的几种角点检......
  • FFTW 最快的FFT 快速傅里叶算法实现
    FFTW isaCsubroutinelibraryforcomputingthediscreteFouriertransform(DFT)inoneormoredimensions,ofarbitraryinputsize,andofbothrealandcomplexdata(aswellasofeven/odddata,i.e.thediscretecosine/sinetransformsorDCT/DST).We......
  • 搜索算法练习——八皇后问题
    八皇后问题是一个经典的回溯算法问题,其目标是在8×8的棋盘上放置八个皇后,使得它们彼此之间不会相互攻击,即任意两个皇后都不在同一行、同一列或同一斜线上。我们可以使用回溯算法来解决这个问题,其中深度优先搜索(DFS)用于尝试每个可能的放置位置。defis_safe(board,row,co......