用原生python语法实现K近邻算法,了解K近邻法的实际操作内核,并用自带鸢尾花的集合验证K近邻算法,并掌握运用散点图的绘制

先对KNN算法做了解:

源代码获取:
https://github.com/akh5/Python/blob/master/My_KNN.ipynb

部分伪代码:

距离集合distyany2e对应的种类near_y集合For 预测值 in near_y:y0=0,y1=0,y2=0预测结果=0if 预测值 == 0:y0+=1elif 预测值 == 1:y1+=1else:y2+=1if y1>(y2 or y0):预测结果 = 1elif y2>( y1 or y0):预测结果 = 2else:预测结果 = 0结果集合if 预测结果 == 训练集种类:结果集合.append(1)else:结果集合.append(0)

此时结果集合中就只有0,1的元素了
若将 结果集合 中的各个元素相加,再处于集合长度就可以得到精确值

首先来从自带的包中获取鸢尾花的数据集

from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
iris_dataset = load_iris()
iris_dataset.keys()

dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’, ‘filename’])

输出的是一个存放数据字典键值的list集合

iris_dataset['data'][:150]

array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4],
[4.6, 3.4, 1.4, 0.3],
[5. , 3.4, 1.5, 0.2],
[4.4, 2.9, 1.4, 0.2],
[4.9, 3.1, 1.5, 0.1]])

数组中数据代表花萼长,花萼宽,花瓣长,花瓣宽

iris_dataset['target'][:150]

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

返回的是鸢尾花的种类0为setosa,1为versicolor,2为virginica

from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
import random
raw_x = iris_dataset['data'][:150] #
raw_y = iris_dataset['target'][:150]#  原生的鸢尾花数据集X_train = np.array(raw_x)   #将鸢尾花数据集添加到 numpy的数组中 作为训练集
Y_train = np.array(raw_y)#这里为了方便只用了花萼的长,宽作为横纵坐标
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='#FF00FF') #紫色点代表setosa
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='#FFFF00') #黄色点代表versicolor
plt.scatter(X_train[y_train==2,0],X_train[y_train==2,1],color='#00FFFF') #青色代表virginicaX_test = iris_dataset['data'][random.randint(1,149)] #产生一个随机的鸢尾花数据作为测试数据
plt.scatter(X_test[0],X_test[1],color='#000000') #将测试数据用黑色添加在图标中
plt.ylabel('sepal width', fontsize=14)
plt.xlabel('sepal length', fontsize=14)
plt.show()

这里用data数组中的前两项,也就是花萼的长与宽来作为x_train训练集,然后给出种类给出y_train训练集
再从中随机选出一个值x_test作为测试集
描绘出的散点图如下?

三种亮色为三种y_train 黑色为测试集

#原生Python实现KNN过程
import math
distances=[]
#for循环找出测试数据与训练集每一个点的距离
for x_train in X_train:d = math.sqrt(np.sum((x_train[0]-X_test[0])**2+(x_train[1]-X_test[1])**2))distances.append(d)
distances

[1.4317821063276357,
1.6124515496597096,
1.7999999999999998,
1.902629759044045,
1.5524174696260025,
1.3038404810405293,
1.9104973174542803,
1.5132745950421556,
2.121320343559642,
1.6031219541881394,
这里给出的是黑点到其他各点的直线距离(未给全)

#原生Python实现KNN过程
import math
distances=[]
#for循环找出测试数据与训练集每一个点的距离
for x_train in X_train:d = math.sqrt(np.sum((x_train[0]-X_test[0])**2+(x_train[1]-X_test[1])**2))distances.append(d)
np.argsort(distances) #从小到大排列后返回索引

这里将所有距离放入一个列表,并按顺序排列后,找到其位置对应的iris_dataset中的位置
array([110, 51, 115, 137, 104, 147, 116, 56, 144, 75, 100, 124, 140,
65, 86, 136, 77, 145, 143, 58, 74, 148, 112, 103, 54, 120,
128, 132, 52, 141, 139, 97, 127, 91, 133, 50, 126, 76, 63,
111, 85, 138, 123, 73, 71, 78, 70, 61, 102, 149, 125, 83,
134, 72, 146, 108, 129, 109, 114, 95, 96, 107, 101, 67, 142,
82, 99, 55, 92, 88, 66, 87, 64, 130, 121, 18, 79, 94,
36, 68, 113, 14, 105, 31, 84, 20, 119, 62, 69, 90, 10,
135, 89, 122, 81, 80, 48, 5, 16, 28, 27, 117, 118, 53,
59, 23, 33, 39, 17, 0, 15, 21, 35, 49, 7, 25, 26,
46, 44, 19, 131, 43, 40, 4, 98, 32, 34, 9, 1, 37,
30, 11, 45, 24, 12, 106, 93, 57, 2, 29, 47, 3, 6,
60, 22, 42, 38, 8, 41, 13], dtype=int64)

#原生Python实现KNN过程
import math
distances=[]
#for循环找出测试数据与训练集每一个点的距离
for x_train in X_train:d = math.sqrt(np.sum((x_train[0]-X_test[0])**2+(x_train[1]-X_test[1])**2))distances.append(d)
nearest = np.argsort(distances) #从小到大排列后返回索引
k = 5 #随便填写一个值作为要选取最近点的个数
near_y = [y_train[i] for i in nearest[:k]]
near_y

[2, 1, 2, 2, 2]
这里就能从对应位置,找到对应y_train中的值
这样就能看出黑色位置周围,哪个种类多,哪个种类少了,最后再用代码实现返回即可

最后将所有代码封装到一块

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
import random
import mathiris_dataset = load_iris()raw_x = iris_dataset['data'][:150] #
raw_y = iris_dataset['target'][:150]#  原生的鸢尾花数据集X_train = np.array(raw_x)   #将鸢尾花数据集添加到 numpy的数组中 作为训练集
y_train = np.array(raw_y)#这里为了方便只用了花萼的长,宽作为横纵坐标
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='#FF00FF') #紫色点代表setosa
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='#FFFF00') #黄色点代表versicolor
plt.scatter(X_train[y_train==2,0],X_train[y_train==2,1],color='#00FFFF') #青色代表virginicatest = random.randint(1,149)
X_test = iris_dataset['data'][test] #产生一个随机的鸢尾花数据
plt.scatter(X_test[0],X_test[1],color='#000000') #将测试数据用黑色添加在图标中
plt.ylabel('sepal width', fontsize=14)
plt.xlabel('sepal length', fontsize=14)
plt.show()
#
#原生Python实现KNN过程
#
def My_KNN(X_train,y_train,k,test,current_list):#K随便填写一个值作为要选取最近点的个数,但只能是奇数方便做判断distances=[]#for循环找出测试数据与训练集每一个点的距离for x_train in X_train:d = math.sqrt(np.sum((x_train[0]-X_test[0])**2+(x_train[1]-X_test[1])**2))distances.append(d)nearest = np.argsort(distances) #从小到大排列后返回索引near_y = [y_train[i] for i in nearest[:k]]for vote in near_y: #for循环选出数组中出现次数最多的y值a=0b=0c=0vote_out = 0if vote == 0:a+=1elif vote == 1:b+=1else:c+=1if b>(c or a):vote_out = 1elif c>( b or a):vote_out = 2else:vote_out = 0####### vote_out就是  从邻近点集中选出最多的点就是预测的鸢尾花种类if vote_out == y_train[test]: #如果预测结果与实际结果相同,在数组中添加1反之为0current_list.append(1)else:current_list.append(0)print(vote_out,y_train[test])

这里用循环产生50个测试集,来测试My_KNN()函数

current_list=[]
count = 0
k = 5
#####循环生成50个测试集
for i in range(50):count+=1test = random.randint(1,149)X_test = iris_dataset['data'][test]My_KNN(X_train,y_train,k,test,current_list)
current_list
percent = sum(current_list)/len(current_list) #因为数组内只有0和1 所以数组内元素相加/数组长度就是正确率
print("""
在抽选{0}组数据中,K为{1},其算法预测的准确度为{2}
""".format(count,k,percent))

输出结果为:
“抽选50组数据中,K为5,其算法预测的准确度为0.72”

原生Python实现KNN算法,并用鸢尾花(iris)数据集测试相关推荐

  1. 【KNN】使用KNN算法实现对iris数据集的分类

    ** 一.实验报告 ** 1. 实验目的:使用KNN算法实现对iris数据集的分类 2. 实验要求:(1)5次随机选取,对比分类准确率(2)探讨不同k值对分类准确率的影响 二.实验内容 1. 数据预处 ...

  2. Python实现KNN算法(鸢尾花集)

    不同颜色的鸢尾花花语不尽相同,蓝色鸢尾花语是精致的美丽,红色鸢尾花的花语代表着热情.适应力强.紫蓝色鸢尾花花语代表着好消息.想念你.黄色鸢尾花的花语代表着友谊永固.热情开朗,白色鸢尾花花语代表着纯真. ...

  3. Python原生代码实现KNN算法(鸢尾花数据集)

    一.作业题目 Python原生代码实现KNN分类算法,使用鸢尾花数据集. KNN算法介绍: K最近邻(k-Nearest Neighbor,KNN)分类算法,是机器学习算法之一. 该方法的思路是:如果 ...

  4. 机器学习之Python使用KNN算法对鸢尾花进行分类

    文章目录 2. 编写代码,实现对iris数据集的KNN算法分类及预测 要求: 第一步:引入所需库 第二步:划分测试集占20% 第三步:n_neighbors=5 第四步:评价模型的准确率 第五步:使用 ...

  5. 用python实现KNN算法对鸢尾花的分类

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

  6. KNN算法实现鸢尾花数据集分类

    KNN算法实现鸢尾花数据集分类 作者介绍 数据集介绍 KNN算法介绍 用KNN实现鸢尾花分类 作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组. 研究方向:机 ...

  7. KNN算法实现鸢尾花的分类

    题目 原生python实现knn分类算法,用鸢尾花数据集. 题目分析 KNN算法: 准备数据:来源百度下载鸢尾花数据集,共150组数据,将数据分为训练数据和测试数据,训练数据为120组,测试数据为30 ...

  8. 使用KNN算法对鸢尾花种类预测

    使用KNN算法对鸢尾花种类预测 一. 数据集介绍 1.1 小数据集获取 load_* 1.2 大数据集获取 fetch_* 1.3 查看数据分布 seaborn画图的 二. 数据集的划分 三. 特征工 ...

  9. KNN算法解决鸢尾花分类案例

    KNN算法解决鸢尾花分类案例 本文分别通过KNN底层算法实现和sklearn中的KNeighbors Classifier(K近邻分类模拟)和对3中不同的鸢尾花的分类. 一.K近邻(KNN)算法介绍 ...

最新文章

  1. Kafka为什么这么快?
  2. Python 基础 二
  3. 更改chrome底色为护目色
  4. 第十五届全国大学生智能汽车竞赛华南赛区成绩总结
  5. NanoHttpd源码分析
  6. Scala 语言转义字符
  7. 关于中英数字混排的字符串分割问题(转)
  8. 批量更改数据库COLLATION
  9. 参数化查询为什么能够防止SQL注入
  10. Mybatis的批量更新 bug
  11. mysql创建视图不允许子查询
  12. python椭圆曲线加密_如何理解椭圆曲线加密并对其进行编码
  13. python独立环境——virtualenv
  14. 运用c语言和Java写九九乘法表
  15. 如何用hover实现下拉菜单
  16. java1.6安装_JAVAjdk1.6安装方法
  17. 从金庸小说到DDoS防护
  18. 简述程序化交易的优缺点都是什么?
  19. dedecms使用AB模板后台如何静态化tag标签
  20. python摇骰子游戏小案例

热门文章

  1. ByteBuffer详解(大概2333)
  2. OS学习笔记-20(清华大学慕课)死锁和进程通信
  3. android tv outofmem,java.lang.OutOfMemoryError:尝试抛出OutOfMemoryErr...
  4. Python_pandas读取数据
  5. 个人管理 - 时间管理GTD流程图
  6. iwnpi 5621ds RF测试指令
  7. Gsensor的驱动流程 -- 基于IIC
  8. Java基础之《JDK文档》
  9. word如何添加下滑线
  10. 再次携号转网_全国携号转网真来了!这些坑一定要小心!