**

一、实验报告

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

二、实验内容

1、 数据预处理

  1. 调用numpy库读取Iris.txt数据集,
  2. 使用shuffle随机打乱数据,用replace函数把最后一列label替换成012,便于数据处理。
  3. 用切片函数iloc将原始数据拆分成为data和label数据
  4. 训练集和测试集按照设置好的比例分配
  5. 返回训练集与测试集
    2、 模型构建
    定义一个计算欧式距离的函数,test数据减去train数据,再平方,把每个特征相加,最好开方。
    KNN算法原理:
  6. 计算出样本数据和测试数据的欧氏距离距离
  7. 为测试数据选择k个与其距离最小的样本
  8. 统计出k个样本所在类别的出现频率
  9. 返回前K个点中出现频率最高的类别作为测试数据的预测分类
    实现:
  10. 定义一个空的预测列表,得到每个训练数据的长度
  11. 用两次for循环计算每一个测试集与每一个训练集的距离,使用argsort函数从低到高排序并返回索引,定义一个空计数列表count
  12. 用for循环,每一次循环获得下标所对应的标签值,将标签存入字典之中并存入个数,取出k个最短距离
  13. 用sorted函数对标签进行排序,将出现频次最高的列表放入预测列表中,循环结束return预测列表
    3、 计算准确度
  14. 计算在测试数据集中算法正确预测的比例。
    4、 主函数设计
    设定好训练集和测试集比例0.3,用for循环设置k的值,从2到20取值,输出精度,并绘制图如下所示:

三、 结果分析

KNN算法易于实现,无需估计参数,K值用于选择最近邻的数目,K的选择非常敏感。K值越小意味着模型复杂度越高,从而容易产生过拟合;K值越大则 意味着整体的模型变得简单,学习的近似误差会增大,由于数据集很小,并每次都随机选取,每次测试结果会有所变动,通过结果对比k值 取5、6、7准确率比较高。

四、 代码

import operator
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.utils import shuffle
def split_data_set(path, split_rate):list1 = pd.read_csv(path)list1 = shuffle(list1)total_length = len(list1)split_point = int(total_length * split_rate)list1 = list1.replace("Iris-setosa", "0")list1 = list1.replace("Iris-versicolor", "1")list1 = list1.replace("Iris-virginica", "2")x = list1.iloc[:, 0:4]x_train = x.iloc[:split_point, :]x_test = x.iloc[split_point:total_length + 1, :]y = list1.iloc[:, 4]y_train = y.iloc[:split_point]y_test = y.iloc[split_point:total_length + 1]return np.array(x_train), np.array(x_test), np.array(y_train), np.array(y_test)
def data_diatance(x_test, x_train):distances = np.sqrt(sum((x_test - x_train) ** 2))return distances
def knn(x_test, x_train, y_train, k):predict_result_set = []train_set_size = len(x_train)distances = np.array(np.zeros(train_set_size))# 计算每一个测试集与每一个训练集的距离for i in x_test:for indx in range(train_set_size):# 计算数据之间的距离distances[indx] = data_diatance(i, x_train[indx])# 排序后的距离的下标sorted_dist = np.argsort(distances)class_count = {}# 取出k个最短距离for i in range(k):# 获得下标所对应的标签值sort_label = y_train[sorted_dist[i]]class_count[sort_label] = class_count.get(sort_label, 0) + 1sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)predict_result_set.append(sorted_class_count[0][0])return predict_result_set
def score(predict_result_set, y_test):count = 0for i in range(0, len(predict_result_set)):if predict_result_set[i] == y_test[i]:count += 1score = count / len(predict_result_set)return score
if __name__ == "__main__":# 载入数据集path = 'Iris.txt'split_rate = 0.3x_train, x_test, y_train, y_test=split_data_set(path,split_rate)X = []Y = []for k in range(2, 20):result = knn(x_test, x_train, y_train, k)# print("原有标签:", y_test)# # 为了方便对比查看,此处将预测结果转化为array,可直接打印结果# print("预测结果:", np.array(result))acc = score(result, y_test)X.append(k)Y.append(acc)# print("测试集的精度:%.2f" % acc)print(X, Y)plt.xlabel('k')plt.ylabel('acc')plt.plot(X, Y)plt.show()

五、KNN的分析与改进

存在优点:逻辑简单,对于异常值点不敏感,分类效果好
存在缺点:
(1)如果样本的类别不平衡,k个值里面 ,只考虑样本类别数量,没有考虑到相对距离,假如和其中一个离的非常近,其他点相对较远,这样会造成很大误差
(2)需要存储所有的训练数据,占用内存大,计算量大。
解决思路:
(1)可以在k个值里面,距离加上权重,距离越大权重越小,距离越小权重越大。
(2)采用分组快速搜索近邻法,先按照近邻关系分组,求出质心,用质心来与测试点求距离,选出若干组,在进行knn算法。

【KNN】使用KNN算法实现对iris数据集的分类相关推荐

  1. Python机器学习实验二:1.编写代码,实现对iris数据集的KNN算法分类及预测

    Python机器学习实验二:编写代码,实现对iris数据集的KNN算法分类及预测 1.编写代码,实现对iris数据集的KNN算法分类及预测,要求: (1)数据集划分为测试集占20%: (2)n_nei ...

  2. java iris_利用K-Means聚类算法实现对iris.data.ulab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...

  3. ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练、保存为pmml模型并重新载入pmml模型进而实现推理

    ML之nyoka:基于nyoka库利用LGBMClassifier模型实现对iris数据集训练.保存为pmml模型并重新载入pmml模型进而实现推理 目录 基于nyoka库利用LGBMClassifi ...

  4. python中load_iris_在python中利用KNN实现对iris进行分类的方法

    如下所示: from sklearn.datasets import load_iris iris = load_iris() print iris.data.shape from sklearn.c ...

  5. ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测

    ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...

  6. ML之DT:利用DT(DTC)实现对iris(鸢尾花)数据集进行分类并可视化DT结构

    ML之DT:利用DT(DTC)实现对iris(鸢尾花)数据集进行分类并可视化DT结构 目录 输出结果 实现代码 输出结果 实现代码 #1. iris = load_iris() dir(iris)ir ...

  7. (pytorch-深度学习系列)使用softmax回归实现对Fashion-MNIST数据集进行分类-学习笔记

    使用softmax回归实现对Fashion-MNIST数据集进行分类 import torch from torch import nn from torch.nn import init impor ...

  8. CV之FDFA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准

    CV之FD&FA:利用MTCNN的脚本实现对LFW数据集进行FD人脸检测和FA人脸校准 目录 运行结果 运行过程 运行(部分)代码 在裁剪好的LFW数据集进行验证 运行结果 运行过程 time ...

  9. (pytorch-深度学习系列)pytorch实现对Fashion-MNIST数据集进行图像分类

    pytorch实现对Fashion-MNIST数据集进行图像分类 导入所需模块: import torch import torchvision import torchvision.transfor ...

最新文章

  1. mysql 连续签到天数_天天拿帮会通宝 帮会签到真给力
  2. python读取hdf文件 高效_利用python读取MODIS hdf文件
  3. pi数据库系统中国服务器,基于PI数据库的服务器实时监控系统研究与开发
  4. 【译】canvas笔触魔法师
  5. [蓝桥杯][算法训练VIP]方格取数(双线程dp)
  6. day53-Django之路由系统
  7. python 通信模块_python 多进程通信模块
  8. oracle临时表经常被锁_【赵强老师】Oracle数据库的存储结构
  9. Multi GET API介绍
  10. 【JAVA】Eclipse保存时出现“Save could not be completed”问题
  11. matlab 逻辑斯蒂回归,梯度下降法解逻辑斯蒂回归
  12. 北京java培训机构收费,Java开发者必看
  13. H5 播放视频常见bug及解决方案
  14. 写 JSP 的痛点,真的非常痛!
  15. 电脑模拟收银机_模拟超市收银系统
  16. 1.郝斌C语言笔记——书籍推荐
  17. 【解决办法】adobe audition打不开 显示MSVCR71.dll丢失
  18. 怎么批量提取文件夹中所有的文件名称及文件路径?
  19. 视频服务器信号转换器,DVI转换器
  20. 元学习笔记——MAML

热门文章

  1. 一次解决Landsat 、哨兵Sentinel 21个光谱指数
  2. 极简busybox制作过程
  3. 晶振03——晶振烧坏的原因
  4. SecureCRT修改字体和字体高亮显示
  5. 常用正则,姓名匹配,去空格等
  6. 赖人自由:B站自动签到小教程
  7. 一个不错的电影网站推荐
  8. 1:MOST: A Multi-Oriented Scene Text Detector with Localization Refinement
  9. FFmpeg中调用av_read_frame函数导致的内存泄漏问题
  10. python图像文件处理——图像画框、剪切图像、json文件转txt