04. k近邻(k-nearest neighbour,KNN )分类鸢尾花

2023-10-25 03:59

本文主要是介绍04. k近邻(k-nearest neighbour,KNN )分类鸢尾花,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     K近邻是一种基本的分类方法,通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20 的整数。

     KNN算法的结果很大程度取决于K的选择 .

     KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,距离一般使用欧式距离或曼哈顿距离:
    

导入数据

import numpy as np 
import pandas as pd # 直接引入sklearn里面的数据集,iris 鸢尾花
from sklearn.datasets import load_iris ##加载数据
from sklearn.model_selection import train_test_split ## 切分数据集为训练集和测试集 
from sklearn.metrics import accuracy_score ## 用来计算分类预测的准确率
iris = load_iris() ## 加载鸢尾花数据 
iris
#'target': 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]), 存放的是特征值对应的目标值,和target_name匹配
## 'target_names': array(['setosa', 'versicolor', 'virginica'] 花的类别
## 'feature_names': ['sepal length (cm)', 花萼长度
## 'sepal width (cm)', 花萼宽度
## 'petal length (cm)', 花萼长度
## 'petal width (cm)'], 花萼宽度
x = iris.data  ##加载数据
y = iris.target ##一维数组
y = y.reshape(-1,1) ##将一维数组改矩阵,任意行 一列 

 

 

 

2.核心算法实现

# 距离函数定义 
def manhadun(a,b): #曼哈顿距离 a为矩阵 b为向量return np.sum(np.abs(a-b),axis=1) # axis = 1 保存为一列def oushi(a,b): ##欧氏距离return np.sqrt(np.sum((a-b)**2,axis=1))# 分类器实现 class Knn(object):## 定义一个初始化方法__init__ 类的构造方法## n_neighbors为近邻的K值 ## dist_func 为 判断距离的方法def __init__(self,n_neighbors=1,dist_func=manhadun):self.n_neighbors = n_neighborsself.dist_func=dist_func ## 训练模型方法 def fit(self,x,y):self.x_train = x self.y_train = y # 模型预测方法:# x 为测试数据def predict(self,x):# 初始化预测分类数据 # 定义一个与传入的x相同行数的值全是0的数组# 其结果的类型应该与训练集的y值一样y_pred = np.zeros((x.shape[0],1),dtype=self.y_train.dtype)# 遍历测试的数据,取出每个数据点的序号和数据x_testfor i,x_test in enumerate(x):# 1.x_test 跟所有训练数据计算距离# 当前的测试数据与每一行的训练数据计算距离distances = self.dist_func(self.x_train,x_test)if i == 0:print(x_test,distances)# 2.得到的距离按照由近到远进行排序,取出索引值# argsort 将所有的数据进行排序,并取出索引值nn_index=np.argsort(distances)# 3.选取距离最近的K个点,保存他们对应的分类类别 # 从训练集里取出K个值# ravel 是将数据转变为一维的数组nn_y = self.y_train[ nn_index[:self.n_neighbors] ].ravel()# 4.统计类别中出现频率最高的那个,赋给y_pred[i]# bincount求的是每个值出现的次数,必须传入的是整数类型y_pred[i] =  np.argmax(np.bincount(nn_y))# print(i,'---',x_test)return y_pred

3 测试

# 定义一个实例
knn = Knn(n_neighbors=3)# 训练模型 
knn.fit(x_train,y_train)
# 传入测试数据,做预测
y_pred = knn.predict(x_test)# 求出预测准确率
accuracy = accuracy_score(y_test,y_pred)print("预测准确率:",accuracy)预测准确率: 0.9333333333333333

4 分别测试

# 测试不同的距离计算方法和K值对准确率的影响# 定义一个实例
knn = Knn()
# 训练模型 
knn.fit(x_train,y_train)#保存结果list 
result_list = []# 针对不同的参数选取,做预测 
for p in [1,2]:knn.dist_func = manhadun if p==1 else oushi#考虑不同的k取值 #步长为2,避免偶数值dfor k in range(1,10,2):knn.n_neighbors = k # 传入测试数据,做预测y_pred = knn.predict(x_test)# 求出预测准确率accuracy = accuracy_score(y_test,y_pred)result_list.append([k,'manhadun' if p==1 else 'oushi',accuracy])df = pd.DataFrame(result_list,columns=['k','距离函数','预测准确率'])df

 

这篇关于04. k近邻(k-nearest neighbour,KNN )分类鸢尾花的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/279892

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他