一、题目
原生python实现KNN分类算法(鸢尾花数据集)
数据来源:https://pan.baidu.com/s/1xPYOuHLdQj-gOaNfbupCAw
二、算法设计
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
1、总体设计

2、KNN分类设计

三、代码实现

import numpy as np
import pandas as pd
class KNN:"""使用python实现K近邻算法"""def __init__(self,k):"""初始化方法     Parameters:----k:int邻居的个数"""self.k = kdef fit(self, X, y):"""训练方法Parameters----X:类似数组类型,list,ndarray……形状:[样本的数量,特征的数量]y:类似数组类型,形状为[样本数量]每个样本的目标值,也是就是标签"""#将X转换成ndarray类型,如果X已经是ndarray则不进行转换self.X = np.asarray(X)self.y = np.asarray(y)def predict(self, X):"""根据参数传递的样本,对样本数据进行预测,返回预测之后的结果Parameters----X:类似数组类型 形状:[样本的数量,特征的数量]   Return----result:数组类型,预测的结果。"""#将测试的X转换为ndarray结构X = np.asarray(X)result = [] for x in X:#ndarray相减为对应元素相减,测试的X的每一行与self.X 相减#求欧氏距离:每个元素都取平方值dis = np.sqrt(np.sum((x - self.X) ** 2,axis = 1))#argsort(),返回每个元素在排序之前原数组的索引index = dis.argsort()#取前k个元素,距离最近的k的元素index = index[:self.k]#返回数组中每个元素出现的次数,元素必须是非负整数count = np.bincount(self.y[index])#返回ndarray之最大的元素的索引,该索引就是我们判定的类别result.append(count.argmax())return np.asarray(result)#读取数据集,header参数来指定参数标题的行,默认为0,第一行,如果没有标题使用None
data = pd.read_csv('iris.csv',header=0)
#对文本进行处理,将Species列的文本映射成数值类型
data['Species'] = data['Species'].map({'virginica':0,'setosa':1,'versicolor':2})
#随机显示,默认为1条
data.sample(10)
#删除不需要的列
data.drop("id",axis=1,inplace=True)
#重复值检查,any(),一旦有重复值,就返回True
data.duplicated().any()
#删除重复的数据
data.drop_duplicates(inplace=True)
#查看各类别的数据条数
#print(data['Species'].value_counts())
#print(data)#数据集拆分成训练集和测试集
#提取每个类别鸢尾花的数量
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)
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)
#print(train_X.shape)
#print(train_Y.shape)
#print(test_X.shape)
#print(test_Y.shape)
#进行训练与测试
knn = KNN(k=5)
#进行训练
knn.fit(train_X,train_Y)
#进行测试
result = knn.predict(test_X)
#display(result)
#display(test_Y)
#查看预测结果
#display(np.sum(result == test_Y))
r=np.mean(result == test_Y)
print("测试集的正确率:{:.2f}".format(r))

四、测试用例设计及调试过程测试:
1、对读取的鸢尾花数据测试

2、对训练集和测试集测试



3、对预测结果与测试集对比测试


调试:选取K近邻时的排序问题

求最近的k个点的距离,sort()排序不适用,因为排序后打乱了原有的顺序。
解决:使用argsort()返回每个元素在排序之前原数组的索引

五、总结
k-近邻方法思路简单,算法过程清晰,但是计算过程十分繁琐。因为对于每一个测试样本,都要对其与每一个训练样本求欧式距离,之后再进行排序,而排序的算法需要耗费大量时间,再取前k小个欧式距离的类别标签,得出预测标签。这样,对于一些维数高、样本个数多的数据集,k-近邻方法显然不是一种节约时间的方法,如果使用,还需要进一步的优化。

python实现KNN分类算法(鸢尾花数据集)相关推荐

  1. Python实现knn分类算法(Iris 数据集)

    1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法. 他的核心思想就是,要确定 ...

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

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

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

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

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

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

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

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

  6. python knn-基于python实现KNN分类算法

    kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别 ...

  7. 用鸢尾花数据集实现knn分类算法

    一.题目: 原生python实现knn分类算法,用鸢尾花数据集 二.算法设计 1. 准备数据,对数据进行预处理 2. 选用合适的数据结构存储训练数据和测试元组 3. 设定参数,如k 4.维护一个大小为 ...

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

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

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

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

  10. knn分类算法实现手写体数字识别python

    之前写过knn分类算法代码,想把knn用于设别手写体数字,看下正确率. 大概思路:获取图片(可以自己写,我之前有写过黑白图片转文本的代码,也可以网上找,反正数据量大会更好)->转成文本-> ...

最新文章

  1. SpringCloud成长之路 一 注册与发现(Eureka)
  2. java如何创造一个整数的类_【技术干货】Java 面试宝典:Java 基础部分(1)
  3. 互斥同步(synchronized、Lock、ReentrantLock、ReadWriteLock、ReentrantReadWriteLock)
  4. 【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细
  5. session一致性架构设计
  6. 白鹭引擎生成自定义整数随机数
  7. Binary XML file line #6: Error inflating class xxx
  8. OBObjective-c 多线程(锁机制) 解决资源抢夺问题
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现...
  10. 端到端车道线检测_弱监督对象检测-端到端培训管道
  11. MATLAB 基础教程:编程调试与常见报错
  12. 腾讯会议PPT演讲者模式
  13. 全网首发 的Fiddler系列文章(二):Fiddler界面主菜单功能介绍
  14. J2ME移动开发平台搭建
  15. 细分市场或成为OA产品同质化的救星|企服三会系列报道
  16. php feff,php编程中要留意的那些坑~
  17. Deep Learning Paper读后简记
  18. pdf转换成txt转换器1.2详细教程
  19. litepal创建的数据库找不到
  20. 带来高效照片扫描体验 佳能Lide400扫描仪试用

热门文章

  1. MWC - 飞控套件CRIUS MWC MultiWii SE v2.6组装
  2. 为什么要了解计算机发展史,计算机发展史给我的启示
  3. 游戏公司游戏策划面试笔记
  4. hdu3987 Harry Potter and the Forbidden Forest 最小割边数
  5. 七年级下册政治知识点总结
  6. MuMu模拟器忘记锁屏密码
  7. 【晒出你的第83行代码】社区用户@尼古拉斯雷的代码故事,和现在比起来以前的代码都是垃圾!...
  8. Kmplayer硬件解码高清视频优化设置
  9. tp-link无线路由与android手机无线连接设置指南,手机设置tplink无线路由器_tplink路由器手机设置步骤-192路由网...
  10. tplink服务器无响应dns,tplink路由器dns异常