import numpy as np
import pandas as pd

KNN算法过程

  • 从训练集中选择离预测样本最近的K个样本。
  • 根据这K个样本计算这个样本的值(属于哪个类别或具体数值)

对数据集的操作

#读取鸢尾花数据集,header参数来指定标题的行,默认为0,如果没有标题,则使用None
data=pd.read_csv(r"F:\数据集\Iris数据集\iris.csv",header=0)
#data  默认显示全部行  中间用省略号
#data.head()只显示头5行(默认)
#data.head(n)显示头n行
#data.tail()默认显示后5行
#data.tail(n)显示后n行
#data.sample()默认随机抽取一行显示
#data.sample(n)随机抽取n条样本
data.sample(10)
#将Species这一列的各种值映射为相应的数值
data["Species"]=data["Species"].map({"versicolor":0,"setosa":1,"virginica":2})
#data
#删除不需要的 Unnamed: 0列 axis=1表示删除列   默认为0,表示删除行
#data=data.drop("Unnamed",axis=1)与下面这行等价
data.drop("Unnamed: 0",axis=1,inplace=True)
#判断数据集中是否有重复的值,  只要有一个重复则返回true,否则返回false
data.duplicated().any()
#输出原有鸢尾花记录数:150条
len(data)
#删除重复记录,加上inplace=True使其在原有的数据集上操作,而不是在其副本上操作
data.drop_duplicates(inplace=True)
#删除重复记录后:149条
len(data)
#查看各个类别的鸢尾花具有多少条记录
data["Species"].value_counts()
1    50
0    50
2    49
Name: Species, dtype: int64

编写KNN的类

class KNN:""" 使用python语言实现K近邻算法。(实现分类)"""#定义初始化方法(init两边是两杠)def __init__(self,k):"""初始化方法paramters--------k:int邻居的个数."""self.k=k#定义fit(训练)方法def fit(self,X,y):"""训练方法Parameters-------X:类数组类型,形状为:[样本数量,特征数量]待训练的样本特征y:类数组类型,形状为:[样本数量]每个样本的目标值(标签) """#为了统一处理list和dataFrame,将X转化为ndarray数组形式,若X本身就是ndarray类型则什么都不做self.X=np.asarray(X)#同理转换yself.y=np.asarray(y)#定义预测方法  参数X是测试集的样本,没有考虑权重def predict(self,X):"""根据参数传递的样本,对样本数据进行预测Parameters---------X:类数组类型,形状为:[样本数量,特征数量]待训练的样本特征Return:--------result:数组类型预测的结果 """X=np.asarray(X)result=[]#对ndarray数组进行遍历,每次取数组中的一行(一个样本)。# self.X是训练集的样本  这里用欧式距离#注意,x是一行,self.X是多行,在做减法是先会对x进行扩展,使其行数和self.X 一样,再对应元素想减for x in X:#axis=1 指定按行的方式求和,否则是将数组所有的值求和成一个数值#对于测试集中的每一个样本,一次与训练集中的所有样本求距离dis=np.sqrt(np.sum((x-self.X)**2,axis=1))#返回数组排序后每个元素在原数组中的索引(原数组:排序之前的数组)index=dis.argsort()#进行截断,只取前k个元素【取距离最近的k个元素的索引】index=index[:self.k]#找到距离最近的k个节点的标签  index不论是list还是ndarray都行(都返回对应位置的标签)#self.y[index]#返回数组中每个元素(0、1、2.。。数据最大值 等出现的次数)出现的次数,但元素必须是非负的整数count=np.bincount(self.y[index])#返回ndarray数组中,值最大的元素对应的索引,就是出现次数最多的元素的索引,该索引就是我们判定的类别#count.argmax()#将判定的类别加到结果中result.append(count.argmax())#写成np.array(result)也行(用result创建ndarray数组)#这里写成np.asarray(result)是将result转化为ndarray数组return np.asarray(result)#定义预测方法2  参数X是测试集的样本,考虑权重 def predict2(self,X):"""根据参数传递的样本,对样本数据进行预测(考虑权重,使用距离的倒数使用权重)Parameters---------X:类数组类型,形状为:[样本数量,特征数量]待训练的样本特征Return:--------result:数组类型预测的结果 """X=np.asarray(X)result=[]#对ndarray数组进行遍历,每次取数组中的一行(一个样本)。# self.X是训练集的样本  这里用欧式距离#注意,x是一行,self.X是多行,在做减法是先会对x进行扩展,使其行数和self.X 一样,再对应元素想减for x in X:#axis=1 指定按行的方式求和,否则是将数组所有的值求和成一个数值#对于测试集中的每一个样本,一次与训练集中的所有样本求距离dis=np.sqrt(np.sum((x-self.X)**2,axis=1))#返回数组排序后每个元素在原数组中的索引(原数组:排序之前的数组)index=dis.argsort()#进行截断,只取前k个元素【取距离最近的k个元素的索引】index=index[:self.k]#找到距离最近的k个节点的标签  index不论是list还是ndarray都行(都返回对应位置的标签)#self.y[index]#返回数组中每个元素(0、1、2.。。数据最大值 等出现的次数)出现的次数,但元素必须是非负的整数#[使用weights考虑权重,权重为距离的倒数]count=np.bincount(self.y[index],weights=1/dis[index])#返回ndarray数组中,值最大的元素对应的索引,就是出现次数最多的元素的索引,该索引就是我们判定的类别#count.argmax()#将判定的类别加到结果中result.append(count.argmax())#写成np.array(result)也行(用result创建ndarray数组)#这里写成np.asarray(result)是将result转化为ndarray数组return np.asarray(result)

训练与测试:

#提取出每个类别的鸢尾花数据
t0=data[data["Species"]==0]
t1=data[data["Species"]==1]
t2=data[data["Species"]==2]
#对每个类别数据进行洗牌,参数random_state指定随机种子,相同的值使每次随机洗牌的结果都一样
t0=t0.sample(len(t0),random_state=0)
t1=t1.sample(len(t1),random_state=0)
t2=t2.sample(len(t2),random_state=0)
#构建训练集和测试集  axix=0表示纵向拼接
train_X=pd.concat([t0.iloc[:40,:-1],t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis=0)
train_y=pd.concat([t0.iloc[:40,-1],t1.iloc[:40,-1],t2.iloc[:40,-1]],axis=0)
test_X=pd.concat([t0.iloc[40:,:-1],t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis=0)
test_y=pd.concat([t0.iloc[40:,-1],t1.iloc[40:,-1],t2.iloc[40:,-1]],axis=0)
#创建KNN对象,进行训练与测试
knn=KNN(k=3)
#进行训练
knn.fit(train_X,train_y)
#进行测试,获得测试的结果
#result=knn.predict1(test_X)
result=knn.predict2(test_X)
#display(result)
#display(test_y)
display(np.sum(result==test_y))
#display(len(result))
display((np.sum(result==test_y))/len(result))
280.9655172413793104

KNN可视化

import matplotlib as mpl
import matplotlib.pyplot as plt

绘制数据

#默认情况下matplotlib不支持中文显示,我们需要设置一下,使其支持
#设置字体为黑体,以支持中文显示
mpl.rcParams["font.family"]="SimHei"
#设置在中文字体是,能正常显示负号(-)
mpl.rcParams["axes.unicode_minus"]=False
#{"versicolor":0,"setosa":1,"virginica":2}
#  设置画布的大小plt.figure(figsize=(8,8))
#绘制训练集数据散点图  选择花瓣、花萼长度这两个维度  注意:不要将label写成lable了
plt.scatter(x=t0["Sepal.Length"][:40],y=t0["Petal.Length"][:40],color="r",label="versicolor")
plt.scatter(x=t1["Sepal.Length"][:40],y=t1["Petal.Length"][:40],color="g",label="setosa")
plt.scatter(x=t2["Sepal.Length"][:40],y=t2["Petal.Length"][:40],color="b",label="virginica")#绘制测试集数据  返回数组给right 和 wrong
right=test_X[result==test_y]
wrong=test_X[result!=test_y]
plt.scatter(x=right["Sepal.Length"],y=right["Petal.Length"],color="c",marker="x",label="right")
plt.scatter(x=wrong["Sepal.Length"],y=wrong["Petal.Length"],color="m",marker=">",label="wrong")
plt.xlabel("花萼长度")
plt.ylabel("花瓣长度")
plt.title("KNN分类结果显示")
# 设置图例显示位置  默认best  最合适的地方
plt.legend(loc="best")
#显示图形
plt.show()


KNN分类python实现相关推荐

  1. KNN分类-python

    KNN分类-python KNN(k-近邻算法) 算法原理 代码介绍 1.knn_classify 2.数据集 3.结果 完整代码 KNN(k-近邻算法) 算法原理 knn算法原理非常简单,这里不再赘 ...

  2. python分类算法_用Python实现KNN分类算法

    本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下 KNN分类算法应该算得上是机器学习中最简单的分类算法了,所谓KNN即为K-NearestNeighbor(K个最邻 ...

  3. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

  4. 利用python语言实现分类算法_使用python实现kNN分类算法

    k-近邻算法是基本的机器学习算法,算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中出现频率最高的类标签作为输入样本的类标签,很 ...

  5. python实现knn分类_KNN图像分类及Python实现

    NN,Nearest Neighbor,最近邻 KNN,K-Nearest Neighbor,K最近邻 KNN分类的思路: 分类的过程其实是直接将测试集的每一个图片和训练集中的所有图片进行比较,计算距 ...

  6. 【机器学习算法】手动Python实现KNN分类算法,并用iris数据集检验模型效果

    目录 一.KNN算法Python实现 1.导入包 2. 画图,展示不同电影在图上的分布 3.训练样本和待测样本准备 4.计算待测样本点到每个训练样本点的距离 5.查找离待测样本点最近的K个训练样本点的 ...

  7. python KNN分类算法 使用鸢尾花数据集实战

    KNN分类算法,又叫K近邻算法,它概念极其简单,但效果又很优秀. 如觉得有帮助请点赞关注收藏啦~~~ KNN算法的核心是,如果一个样本在特征空间中的K个最相似,即特征空间中最邻近的样本中的大多数属于某 ...

  8. kNN分类原理以及python实现手写数字分类

    kNN算法分类原理 K最近邻(kNN,k-Nearest Neighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻 ...

  9. 使用Python处理KNN分类算法

    简介: 我们在这世上,选择什么就成为什么,人生的丰富多彩,得靠自己成就.你此刻的付出,决定了你未来成为什么样的人,当你改变不了世界,你还可以改变自己. KNN分类算法的介绍 KNN分类算法(K-Nea ...

最新文章

  1. android 36 线程通信
  2. 前端JS的一些使用方法-持续更新
  3. 【mysql】安装 mysql 5.7 完成后,默认密码是啥?怎么查看默认密码?
  4. php 提取登录QQsid_php模拟登录qq邮箱(curl命令详解)
  5. 一台7纳米光刻机月产能有多大,何为能卖上亿美元?
  6. php v9 如何获取超级管理员权限,phpcms v9 增加后台管理员其他权限角色可以查看信息不能修改信息...
  7. 知网又火了!续订费近千万且连年上涨 中科院:不堪重负 停用
  8. 计算机网络概述的功能 组成,计算机网络的概述
  9. 前端页面常用代码参考
  10. 实用主义学python 云盘_多领域实用主义学Python项目视频教程-2018年麻瓜编程
  11. 图像处理之图像复原[逆滤波、维纳滤波、约束最小二乘法、Lucy-Richardson和盲解卷积复原]
  12. mysql数据导出insert_mysql 数据导出
  13. c语言offset函数,offset偏移量 offset函数怎么用,详细一点…
  14. 注册IMDB的API KEY
  15. Centos7 安装coturn部署一套 STUN/TURN 服务 webRTC打洞服务器
  16. 会计专硕(MPACC)毕业论文该选如何选题?
  17. 【转载】配置文件 .yml 写法小结
  18. 什么是熵(entropy)?
  19. datastage dsjob命令
  20. Linux 自定义回收站

热门文章

  1. Spring Security 入门(1-3-2)Spring Security - http元素 - intercept-url配置
  2. rewrite伪静态
  3. minifilter 与用户态的通信
  4. Away3d学习笔记(1)
  5. 通过模板设计按钮样式
  6. Symbian编程总结-基础篇-描述符(2)-TDesC8与TDesC16之间的互转
  7. [POI2009]Wie
  8. Android——倒计时跳转+sharedpreferences
  9. codevs1018 单词接龙(DFS)
  10. SQL CASE 的用法