k近邻(kNN)算法的Python实现(基于欧氏距离)

2024-09-04 18:32

本文主要是介绍k近邻(kNN)算法的Python实现(基于欧氏距离),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

k近邻算法是机器学习中原理最简单的算法之一,其思想为:给定测试样本,计算出距离其最近的k个训练样本,将这k个样本中出现类别最多的标记作为该测试样本的预测标记。
k近邻算法虽然原理简单,但是其泛华错误率却不超过贝叶斯最有分类器错误率的两倍。所以实际应用中,k近邻算法是一个“性价比”很高的分类工具。
基于欧式距离,用Python3.5实现kNN算法:

主程序:

from numpy import*
import operatordef myED(testdata,traindata):""" 计算欧式距离,要求测试样本和训练样本以array([ [],[],...[] ])的形式组织,每行表示一个样本,一列表示一个属性"""size_train=traindata.shape[0] # 训练样本量大小size_test=testdata.shape[0] # 测试样本大小XX=traindata**2sumXX=XX.sum(axis=1) # 行平方和YY=testdata**2sumYY=YY.sum(axis=1) # 行平方和Xpw2_plus_Ypw2=tile(mat(sumXX).T,[1,size_test])+\tile(mat(sumYY),[size_train,1])EDsq=Xpw2_plus_Ypw2-2*(mat(traindata)*mat(testdata).T) # 欧式距离平方distances=array(EDsq)**0.5 #欧式距离return distancesdef mykNN(testdata,traindata,labels,k):""" kNN算法主函数,labels组织成列表形式 """size_test=testdata.shape[0]D=myED(testdata,traindata)Dsortindex=D.argsort(axis=0) # 距离排序,提取序号nearest_k=Dsortindex[0:k,:] # 提取最近k个距离的样本序号label_nearest_k=array(labels)[nearest_k] # 提取最近k个距离样本的标签    label_test=[]if k==1:label_test=label_nearest_kelse:for smp in range(size_test):classcount={}labelset=set(label_nearest_k[:,smp]) # k个近邻样本的标签集合for label in labelset:classcount[label]=list(label_nearest_k[:,smp]).count(label)# 遍历k个近邻样本的标签,并计数,并以字典保存标签和计数结果sortedclasscount=sorted(classcount.items(),\key=operator.itemgetter(1),reverse=True) # 按照计数结果排序label_test.append(sortedclasscount[0][0]) # 提取出现最多的标签return label_test,D

示例:

# 以下示例数据摘自周志华《机器学习》P202表9.1
labels=[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
traindata=array([[0.6970,0.4600],[0.7740,0.3760],[0.6340,0.2640],\
[0.6080,0.3180],[0.5560,0.2150],[0.4030,0.2370],[0.4810,0.1490],\
[0.4370,0.2110],[0.6660,0.0910],[0.2430,0.2670],[0.2450,0.0570],\
[0.3430,0.0990],[0.6390,0.1610],[0.6570,0.1980],[0.3600,0.3700],\
[0.5930,0.0420],[0.7190,0.1030]])
testdata=array([[0.3590,0.1880],[0.3390,0.2410],[0.2820,0.2570],\
[0.7480,0.2320],[0.7140,0.3460],[0.4830,0.3120],[0.4780,0.4370],\
[0.5250,0.3690],[0.7510,0.4890],[0.5320,0.4720],[0.4730,0.3760],\
[0.7250,0.4450],[0.4460,0.4590]])
k=5label_test,distances=mykNN(testdata,traindata,labels,k)
print('\n')
print(label_test)

示例结果:

>>[1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

这篇关于k近邻(kNN)算法的Python实现(基于欧氏距离)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络