首页 > 分享 > Python实现kNN算法,使用鸢尾花作为测试数据

Python实现kNN算法,使用鸢尾花作为测试数据

一 题目:Python实现KNN算法,使用鸢尾花(iris)作为测试数据
二 分析:

KNN算法 算法介绍
K最近邻(k-Nearest Neighbor,KNN)kNN算法的核心思想是如果一个样 本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别
2.算法涉及因素
训练数据集
距离的计算度量
K的大小
3.算法描述
◊ 已知数据蓝色方块,红色三角
◊ 有一个未知数据,绿色圆,需判断属于蓝 方块还是红三角
◊ 考察离绿点最近的k个数据点的类别,占多数的类别即为绿点判定类别
在这里插入图片描述
4.计算步骤
◊ 算距离:给定测试对象,计算它与训练集中的每个对象的距离(欧式距离,夹角余弦)
◊ 找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻
◊ 做分类:根据这k个近邻归属的主要类别,来对测试对象分类 类别的判定
◊简单投票法:少数服从多数,近邻中哪个类别的点最多就分为该类。
◊加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数) 鸢尾花数据集
1.数据集的导入

from sklearn.datasets import load_iris data = load_iris() 12

2.数据集的内容
csv格式保存,单独放在了data文件夹里
150,4,setosa,versicolor,virginica
5.1,3.5,1.4,0.2,0 #花萼长度,花萼宽度,花瓣长度,花瓣宽度
4.9,3.0,1.4,0.2,0
4.7,3.2,1.3,0.2,0
4.6,3.1,1.5,0.2,0
5.0,3.6,1.4,0.2,0
样本数目150,特征数目4,据包含三种鸢尾花的四个特征,分别是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm),
类别分别为:Iris Setosa Iris Versicolor Iris Virginica

data变量是一个类似字典的类型,是数据信息的集合,它像字典一样通过键值对来组织信息
data.keys()
[‘target_names’,‘data’,‘target’,‘DESCR’,‘feature_names’]
三 Python代码

import numpy as np from sklearn.datasets import load_iris from sklearn import datasets from sklearn.model_selection import train_test_split # KNN分类算法函数定义 def KNN(TestData, TrainData, labels, k): numSamples = TrainData.shape[0] # shape[0]表示行数 # # step 1: 计算距离 diff = tile(TestData, (numSamples, 1)) - dataSet # 按元素求差值 squaredDiff = diff ** 2 # 将差值平方 squaredDist = sum(squaredDiff, axis = 1) # 按行累加 distance = squaredDist ** 0.5 # 将差值平方和求开方,即得距离 # # step 2: 对距离排序 # argsort() 返回排序后的索引值 sortedDistIndices = argsort(distance) classCount = {} for i in range(k): # # step 3: 选择k个最近邻 voteLabel = labels[sortedDistIndices[i]] # # step 4: 计算k个最近邻中各类别出现的次数 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # # step 5: 返回出现次数最多的类别标签 maxCount = 0 for key, value in classCount.items(): if value > maxCount: maxCount = value maxIndex = key return maxIndex # 生成数据集和类别标签 iris=load_iris() #dataSet, labels = createDataSet() # 定义一个未知类别的数据 testX = array([5,2.9,1,0.2]) # 导入鸢尾花数据并查看数据特征 iris = datasets.load_iris() print('数据量',iris.data.shape) # 拆分属性数据 dataSet = iris.data # 拆分类别数据 labels = iris.target k = 3 # 调用分类函数对未知数据分类 outputLabel = KNN(testX, dataSet, labels, 3) print ("Your input is:", testX, "and classified to class: ", outputLabel,"target name: {}".format(iris['target_names'][outputLabel])) print ()

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

四 代码运行结果
在这里插入图片描述
五 总结

算法缺点:
• 样本不平衡容易导致结果错误
◊如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
◊改善方法:对此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
• 计算量较大
◊因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
◊改善方法:事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。
该方法比较适用于样本容量比较大的类域的分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

相关知识

Python原生代码实现KNN算法(鸢尾花数据集)
KNN算法实现鸢尾花数据集分类
【机器学习】KNN算法实现鸢尾花分类
Knn算法实现鸢尾花分类
【机器学习】KNN算法实现手写板字迹识别
【python机器学习】KNN算法实现回归(基于鸢尾花数据集)
【机器学习】基于KNN算法实现鸢尾花数据集的分类
原生python实现knn分类算法(鸢尾花数据集)
用python实现KNN算法对鸢尾花的分类
python 使用Tensorflow训练BP神经网络实现鸢尾花分类

网址: Python实现kNN算法,使用鸢尾花作为测试数据 https://m.huajiangbk.com/newsview854536.html

所属分类:花卉
上一篇: 毕竟今年“花”是流行大趋势!
下一篇: 中国中免 71.63(