KNN-机器学习实战系列(一)

2024-09-06 05:38
文章标签 实战 学习 机器 系列 knn

本文主要是介绍KNN-机器学习实战系列(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开门见山,本文单说KNN:

作为机器学习实战书籍介绍的第一个算法,有一些值得说道的地方:

1:什么是KNN?

机器学习的一些基本知识和概念不加叙述了,直接给出KNN的白话定义:给定M个样本,每个样本均有N个数字衡量的属性,而每个样本均带有自身的标签:

这里,为什么需要数字化定义属性呢?这方便了我们衡量指标的计算,我们可以使用距离这一可用数学表达式实现的概念,来阐述何谓近邻。

而KNN,英文名:k-Nearest Neigbhors :称作K近邻算法,每次来一个新的样本,就可以通过从M个样本中,找出K个最近的样本,通过这K个样本的属性来判别新样本的类别:

可以看出,KNN属于监督类学习算法,对其提供支持的样本,都是标记好的样本;

2:算法角度的实现:

from numpy import *
def createDataSet():group = array([[1.0,1.1 ],[1.0,1.0],[0,0], [0,0.1]])labels = ['A','A','B','B']return group,labels
group,labels = createDataSet()

该段代码,负责样本集合的生成,浅显易懂,不多说:

这里,给出的样本非常简单,而实际上来说,我们在使用该算法的过程中,样本都会比较复杂,属性也会比较多,这些在本文不予涉及,生成样本的方式是多种多样的,我们这里要做的,是直接对合规的样本进行操作:

接下来是主题逻辑:

def classify0(intX,dataSet,labels,k):# 获取样本的总数,比如样本是N行dataSetSize = dataSet.shape[0]# tile方式,会生成N行与待测样本完全一致的数据集tiles  =  tile(intX, (dataSetSize,1))# 取差值,这就是python的简便之处了,一句话求取出所有的(x-x1)和(y-y1)diffMat =  tiles - dataSet# 对于所有的元素进行平方操作sqDiffMat = diffMat ** 2# 平方操作加起和,得到距离sqDistances = sqDiffMat.sum(axis=1)# 距离排序sortedDistIndicies = sqDistances.argsort()# 取出距离最小的K个点,记录标签classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0)+1# 查看这K个点中,哪种类别比较多sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse=True)return sortedClassCount[0][0];

总体思想就是这样:很简单,很好理解,用一句古话说就是:近朱者赤,近墨者黑。

3:我对该算法的一些理解:

KNN算是机器学习之初诞生的一些老算法了,其性能还算不错,当然同时也是有缺陷的:

首先,其缺陷在于需要每次样本都要遍历一次所有的数据,这个计算量相对比较大,如果样本集合已经有百万,甚至是千万那么大,我们每次还要为一个样本去计算数百万,甚至是数千万次,投入和产出明显是不成正比的:

个人感觉,这里其实可以用堆排序的方法来做优化,设置一个K元素大小的最小堆,来尽可能减小算法的复杂度:

其二,这里的K设置是很关键的,假如说K太小,可能很少的元素就决定了新样例的样本,这是不合理的,如果K太大,会导致计算和排序比较麻烦,所以需要从中调和:

其三,如果某个属性值本身比较大,可能会导致在距离计算的时候,导致该属性占据的份额比较大,这是有问题的,所以可通过归一化进行处理,将数据的计算都整合在0-1的范围之内,方便我们的计算:

这篇关于KNN-机器学习实战系列(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对