python可视化实现KNN算法


Posted in Python onOctober 16, 2019

简介

这里通过python的绘图工具Matplotlib包可视化实现机器学习中的KNN算法。

需要提前安装python的Numpy和Matplotlib包。

KNN?最近邻分类算法,算法逻辑比较简单,思路如下:

1.设一待分类数据iData,先计算其到已标记数据集中每个数据的距离,例如欧拉距离sqrt((x1-x2)^2+(y1-y2)^2);

2.然后根据离iData最近的k个数据的分类,出现次数最多的类别定为iData的分类。

KNN——最近邻算法python代码

代码实现:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

def KNNClassify(labelData,predData,k): #数据集包含分类属性
#labelData 是已经标记分类的数据集
#predData 未分类的待预测数据集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行数据进行遍历
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #将iData重复,扩展成与labelData同形的矩阵
 #这里用欧拉距离sqrt((x1-x2)^2+(y1-y2)^2)
 diff = iDset[...,:-1] - labelData[...,:-1]
 diff = diff**2
 distance = np.sum(diff,axis=1)
 distance = distance ** 0.5 #开根号
 sortedIND = np.argsort(distance) #排序,以序号返回。
 classCount = { }
 for j in range(k): #计算距离最近的前k个标记数据的类别
 voteLabel = labelData[sortedIND[j],-1]
 classCount[voteLabel] = classCount.get(voteLabel,0)+1

 maxcls = max(classCount,key=classCount.get) #类别最多的,返回键名(类别名)
 predData[i][...,-1] = maxcls

 return predData

为了测试这个算法,需要现成的已分类数据集,由于手动输入很有限,数据量少,耗时。作为学习我们这里用代码模拟生成数据来进行测试。下面是生成已分类数据集的代码:

生成模拟数据的函数

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#模拟生成分类数据
#目标是产生二维坐标中的几堆数据集,每堆为一个类
#函数逻辑:
#将x轴分段,每个段设一个中心的,所有的中心点用cores存储。
#设置每个数据中心点core的类别,由中心点在一定范围内随机产生数据,并将这些数据设为和core一样的类别
#所以每类的数据会简单的被X轴的每段大致分开

def makeKNNData(colnum,clsnum,nums,cores = []):
#colnum单个数据拥有特征数量(包括数据的分类);
# clsnum表示共有多少种分类;
# nums是一个元组,表示每个类别希望产生多少数据样本,如colnum为5,nums为[56, 69, 60, 92, 95];
#cores非必要参数,手动给出只是用于测试,cores提供每类的中心点,以中心点为依据产生该类数据。

 dataSet = np.zeros((sum(nums),colnum)) #初始化数据集,用于存放随后生成的所有数据
 n=0 #记录生成数据的下标
 step = 20/clsnum #假定X坐标轴只显示0~20的范围,step为X轴分段后的段长
 for j in range(clsnum): #循环生成各个类数据
 try:
 core = cores[j] #如果cores没有给出则,则出错,跳至except执行
 except IndexError :
 core = np.random.rand(1,3) #中心点为array([[x1,x2,c]]),c用于表示类别,这里产生的是1*3的二维数组
 core[0][0] =j*step + core[0][0]*step #将x1限制在各段中
 core[0][1] *=15 #将x2即y轴限制在0~15范围内
 core[0][2] = j #设置类别
 cores.append(core)
 for i in range(nums[j]): #按nums中指定了每类数据的数量,用循环生成。
 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #产生点point(x,y),x以中心点在(core_x - step/2, core_x + step/2)范围随机波动,y同理。
 row = np.column_stack((point,core[0][2])) #加上类别成为一个数据
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

 #print("print cores:",cores)
 return dataSet

有了数据集之后,我们可以用Matplotlib将数据可视化,以直观显示出来

数据可视化函数

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#绘图展示数据,每类数据点以不同的颜色显示
def showFigure(dataSet,clsnum):
 fig = plt.figure()
 ax = fig.add_subplot(1,1,1) #界面只需显示一个视图
 ax.set_title('KNN separable data set') #视图名称,这里简单统一定这个名称吧
 plt.xlabel('X') #坐标轴名称
 plt.ylabel('Y')

 colors = ['r','g','b','y','k'] #定义显示的颜色b为blue,k为black
 for i in range(clsnum):
 idx = np.where(dataSet[:,2] == i) #查询每类的索引号
 ax.scatter(dataSet[idx,0], dataSet[idx,1], marker='o', color=colors[i%5], label=1, s=10) #在视图中的显示方式

 plt.legend(loc = 'upper right') #图例显示位置
 plt.show()


#测试一下
#需要结合模拟生成数据的函数
classnum = 5
nums = np.random.randint(50,100,classnum) #示例 array([56, 69, 60, 92, 95]),每个数字在50~100范围内
dataSet = makeKNNData(3,classnum,nums)
showFigure(dataSet,classnum)

生成的模拟数据展示结果如下:

python可视化实现KNN算法

完整代码

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#模拟生成分类数据
#目标是产生二维坐标中的几堆数据集,每堆为一个类
#函数逻辑:
#将x轴分段,每个段设一个中心的,所有的中心点用cores存储。
#设置每个数据中心点core的类别,由中心点在一定范围内随机产生数据,并将这些数据设为和core一样的类别
#所以每类的数据会简单的被X轴的每段大致分开

def makeKNNData(colnum,clsnum,nums,cores = []):
#colnum单个数据拥有特征数量(包括数据的分类);
# clsnum表示共有多少种分类;
# nums是一个元组,表示每个类别希望产生多少数据样本;
#cores非必要参数,手动给出只是用于测试,cores提供每类的中心点,以中心点为依据产生该类数据。

 dataSet = np.zeros((sum(nums),colnum)) #初始化数据集,用于存放随后生成的所有数据
 n=0 #记录生成数据的下标
 step = 20/clsnum #假定X坐标轴只显示0~20的范围,step为X轴分段后的段长
 for j in range(clsnum): #循环生成各个类数据
 try:
 core = cores[j] #如果cores没有给出则,则出错,跳至except执行
 except IndexError :
 core = np.random.rand(1,3) #中心点为array([[x1,x2,c]]),c用于表示类别,这里产生的是1*3的二维数组
 core[0][0] =j*step + core[0][0]*step #将x1限制在各段中
 core[0][1] *=15 #将x2即y轴限制在0~15范围内
 core[0][2] = j #设置类别
 cores.append(core)
 for i in range(nums[j]): #按nums中指定了每类数据的数量,用循环生成。
 point= core[0][:2] + np.random.rand(1,2)*step -step/2 #产生点point(x,y),x以中心点在(core_x - step/2, core_x + step/2)范围随机波动,y同理。
 row = np.column_stack((point,core[0][2])) #加上类别成为一个数据
 dataSet[n] = row
 n +=1
 i +=1

 j +=1

 #print("print cores:",cores)
 return dataSet

#绘图展示数据,每类数据点以不同的颜色显示
def showFigure(dataSet,clsnum):
 fig = plt.figure()
 ax = fig.add_subplot(1,1,1) #界面只需显示一个视图
 ax.set_title('KNN separable data set') #视图名称,这里简单统一定这个名称吧
 plt.xlabel('X') #坐标轴名称
 plt.ylabel('Y')

 colors = ['r','g','b','y','k'] #定义显示的颜色b为blue,k为black
 for i in range(clsnum):
 idx = np.where(dataSet[:,2] == i) #查询每类的索引号
 ax.scatter(dataSet[idx,0], dataSet[idx,1], marker='o', color=colors[i%5], label=1, s=10) #在视图中的显示方式

 plt.legend(loc = 'upper right') #图例显示位置
 plt.show()


#分类算法:
#待分类数据iData,先计算其到已标记数据集中每个数据的距离
#然后根据离iData最近的k个数据的分类,出现次数最多的类别定为iData的分类。

def KNNClassify(labelData,predData,k): #数据集包含分类属性
#labelData 是已经标记分类的数据集
#predData 待预测数据集
 labShape = labelData.shape
 for i in range(predData.shape[0]): #以predData的每行数据进行遍历
 iData = predData[i]
 iDset = np.tile(iData,(labShape[0],1)) #将iData重复,扩展成与labelData同形的矩阵
 #这里用欧拉距离sqrt((x1-x2)^2+(y1-y2)^2)
 diff = iDset[...,:-1] - labelData[...,:-1]
 diff = diff**2
 distance = np.sum(diff,axis=1)
 distance = distance ** 0.5 #开根号
 sortedIND = np.argsort(distance) #排序,以序号返回。
 classCount = { }
 for j in range(k): #计算距离最近的前k个标记数据的类别
 voteLabel = labelData[sortedIND[j],-1]
 classCount[voteLabel] = classCount.get(voteLabel,0)+1

 maxcls = max(classCount,key=classCount.get) #类别最多的,返回键名(类别名)
 predData[i][...,-1] = maxcls

 return predData

#测试
labNums = np.random.randint(50,200,classnum)
predNums = np.random.randint(10,80,classnum)
#cores = [np.array([[ 0.08321641, 12.22596938, 0. ]]), np.array([[9.99891798, 4.24009775, 1. ]]), np.array([[14.98097374, 9.80120399, 2. ]])]

labelData = makeKNNData(3,classnum,labNums)
showFigure(labelData,classnum)
predData = makeKNNData(3,classnum,predNums) #这里为了方便,不在写产生待分类数据的代码,只需用之前的函数并忽略其类别就好。
predData[...,-1]=0
showFigure(predData,classnum)

k = 10
KNNData = KNNClassify(labelData,predData,k)
showFigure(KNNData,classnum)

运行程序,结果如下:

1.labelData的数据(已知分类的数据) 

 python可视化实现KNN算法

2.predData的数据(未标记的数据) 

 python可视化实现KNN算法

3KNNData的数据(用KNN算法进行分类后的数据)

python可视化实现KNN算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python动态加载变量示例分享
Feb 17 Python
详细解析Python当中的数据类型和变量
Apr 25 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
django之常用命令详解
Jun 30 Python
python实现机器学习之元线性回归
Sep 06 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
python+pyqt5实现24点小游戏
Jan 24 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
Python3爬虫中Ajax的用法
Jul 10 Python
python实现KNN分类算法
Oct 16 #Python
python子线程退出及线程退出控制的代码
Oct 16 #Python
python Pillow图像处理方法汇总
Oct 16 #Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 #Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 #Python
python提取xml里面的链接源码详解
Oct 15 #Python
python yield关键词案例测试
Oct 15 #Python
You might like
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
php生成shtml类用法实例
2014/12/09 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
layUI实现前端分页和后端分页
2019/07/27 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
会计专业毕业生推荐信
2013/11/05 职场文书
户籍证明的格式
2014/01/13 职场文书
英语商务邀请函范文
2014/01/16 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
生活小常识广播稿
2015/08/19 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL
分享提高 Python 代码的可读性的技巧
2022/03/03 Python