2 k-近邻算法

news2024/9/24 9:28:32

0 问题引入

想一想:下面图片中有三种豆,其中三颗豆品种未知,如何判断他们类型?
在这里插入图片描述

1 KNN概述

1.1 KNN场景

电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?

  • 动作片:打斗次数更多
  • 爱情片:亲吻次数更多

在这里插入图片描述
基于电影中的亲吻、打斗出现的次数,使用 k-近邻算法构造程序,就可以自动划分电影的题材类型。
在这里插入图片描述
现在根据上面我们得到的样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到 k 个距离最近的电影。
假定 k=3,则三个最靠近的电影依次是, California Man, He’s Not Really into Dudes 和 Beautiful Woman 。
KNN 算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

1.2 KNN工作原理

k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。
一句话总结:近朱者赤近墨者黑!

输入为实例的特征向量,对应于特征空间的点;
输出为实例的类别
k 近邻算法假设给定一个训练数据集,其中的实例类别已定。
分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程。

k 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。
k近邻算法、三个基本要素:

  • k值的选择;
  • 距离度量;
  • 分类决策规则。

2 KNN案例

2.1 项目概述

  1. 海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人:
    • 不喜欢的人
    • 魅力一般的人
    • 极具魅力的人
  2. 她希望:
    • 工作日与魅力一般的人约会
    • 周末与极具魅力的人约会
    • 不喜欢的人则直接排除掉
  3. 现在她收集到了一些约会网站未曾记录的数据信息,这更有助于匹配对象的归类。

2.2 开发流程

  1. 收集数据:提供文本文件
  2. 准备数据:使用 Python 解析文本文件
  3. 分析数据:使用 Matplotlib 画二维散点图
  4. 训练算法:此步骤不适用于 k-近邻算法
  5. 测试算法:使用海伦提供的部分数据作为测试样本。
    测试样本和非测试样本的区别在于: 测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
  6. 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。

收集数据:提供文本文件
海伦把这些约会对象的数据存放在文本文件 datingTestSet2.txt 中,总共有 1000 行。海伦约会的对象主要包含以下 3 种特征:

  • 每年获得的飞行常客里程数
  • 玩视频游戏所耗时间百分比
  • 每周消费的冰淇淋公升数

在这里插入图片描述
归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。

2.3 代码(以iris数据集为例)

方案1:调包侠
在这里插入图片描述
方案2:自己写底层代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import sklearn.datasets, sklearn.neighbors, sklearn.model_selection
import numpy

def sklearnKnnTest():
    #Step 1. Load the dataset
    tempDataset = sklearn.datasets.load_iris()
    x = tempDataset.data
    y = tempDataset.target

    #print("x = ", x)
    #print("y = ", y)

    #Step 2. Split the data
    X1, X2, Y1, Y2 = sklearn.model_selection.train_test_split(x, y, test_size = 0.2)
    print("X1 = ", X1)
    print("Y1 = ", Y1)
    print("X2 = ", X2)
    print("Y2 = ", Y2)

    #Step 3. Indicate the training set.
    tempClassifier = sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5)
    tempClassifier.fit(X1, Y1)

    #Step 4. Test.
    tempScore = tempClassifier.score(X2, Y2)
    print("The score is: ", tempScore)

def euclideanDistance(x1, x2):
    tempDistance = 0
    for i in range(x1.shape[0]):
        difference = x1[i] - x2[i]
        tempDistance += difference * difference

    tempDistance = tempDistance ** 0.5
    return tempDistance

def mfKnnTest(k = 3):
    #Step 1. Load the dataset
    tempDataset = sklearn.datasets.load_iris()
    x = tempDataset.data
    y = tempDataset.target

    #print("x = ", x)
    #print("y = ", y)

    #Step 2. Split the data
    X1, X2, Y1, Y2 = sklearn.model_selection.train_test_split(x, y, test_size = 0.2)
    print("X1 = ", X1)
    print("Y1 = ", Y1)
    print("X2 = ", X2)
    print("Y2 = ", Y2)

    #Step 3. Classify
    predicts = numpy.zeros(Y2.shape[0])
    for i in range(X2.shape[0]):
        #Step 3.1 Find k neigbhors
        #Initialize
        tempNeighbors = numpy.zeros(k + 2)
        tempDistances = numpy.zeros(k + 2)
        for j in range(k + 2):
            tempDistances[j] = 1000
        tempDistances[0] = -1

        for j in range(X1.shape[0]):
            tempDistance = euclideanDistance(X2[i], X1[j])
            tempIndex = k
            while True:
                if tempDistance < tempDistances[tempIndex]:
                    #Move forward
                    print("tempDistance = {} and tempDistances[{}] = {}".format(tempDistance, tempIndex, tempDistances[tempIndex]))
                    tempNeighbors[tempIndex + 1] = tempNeighbors[tempIndex]
                    tempDistances[tempIndex + 1] = tempDistances[tempIndex]
                    tempIndex -= 1
                else:
                    #Insert here
                    tempNeighbors[tempIndex + 1] = j
                    tempDistances[tempIndex + 1] = tempDistance
                    print("Insert to {}.".format(tempIndex))
                    break
        #print("Classifying ", X2[i])

        print("tempNeighbors = ", tempNeighbors)

        #Step 3.2 Vote
        #Step 2.2 Vote for the class
        tempLabels = []
        for j in range(k):
            tempIndex = int(tempNeighbors[j + 1])
            tempLabels.append(int(Y2[tempIndex]))

        tempCounts = []
        for label in tempLabels:
            #print("count = ", tempLabels.count(label))
            tempCounts.append(int(tempLabels.count(label)))
        tempPredicts[i] = tempLabels[numpy.argmax(tempCounts)]

    print("The predictions are: ", tempPredicts)
    print("The true labels are: ", Y2)

def main():
    #sklearnKnnTest()
    #print("Life is short, so I study python.")
    mfKnnTest()

main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝牙mesh】Lower协议层介绍

【蓝牙mesh】Lower协议层介绍 Lower层简介 Lower协议层用于处理网络层以下的功能&#xff0c;包括节点的广播、重传、路由和网络拓扑等&#xff0c;是实现蓝牙mesh网络的关键协议之一。其中Lower协议层中最主要的一部分工作就是mesh数据的分片和组包。 Lower层是将Upper层发过…

buu [GWCTF 2019]BabyRSA 1

题目描述&#xff1a; import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…

【MySQL】事务隔离级别是怎么实现的?

事务隔离级别是怎么实现的&#xff1f; 四种隔离级别具体的实现方式 对于「读未提交」&#xff1a;直接读取最新的数据就好。对于「串行化」&#xff1a;通过加读写锁的方式来避免并行访问。对于「读提交」和「可重复读」&#xff1a;通过 Read View 来实现&#xff0c;主要区…

JS学习第4天——事件高级(注册/删除事件、DOM事件流、阻止事件冒泡、事件委托、常用的鼠标/键盘事件)

目录一、注册事件 / 删除事件1、注册事件&#xff08;绑定事件&#xff09;2、删除事件&#xff08;解绑事件&#xff09;二、DOM事件流三、事件对象event1、事件对象的兼容性2、e.targent和this的区别3、事件对象常见的属性和方法四、阻止事件冒泡五、事件委托&#xff08;代理…

数据采集与预处理学习

文章目录要求题解要求 根据表格求出哪两个演员合作电影数最多&#xff0c;及合作的电影数。 题解 from openpyxl import load_workbookwb load_workbook("电影导演演员信息表.xlsx") ws wb.worksheets[0]actors_films dict() for i, row in enumerate(ws.rows):i…

CAN总线开发一本全(4) - FlexCAN的驱动程序

CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序 苏勇&#xff0c;2023年2月 文章目录CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序引言从MindSDK获取FlexCAN驱动程序数据结构配置通信引擎的结构体类型访问MB的结构体类型配置ID过滤器的…

1 机器学习基础

1 机器学习概述 1.1 数据驱动的问题求解 大数据-Big Data 大数据的多面性 1.2 数据分析 机器学习&#xff1a;海量的数据&#xff0c;获取有用的信息 专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之…

Python多进程编程

一 多进程编程 Python实现多进程的方式有两种&#xff1a;一种方法是os模块中的fork方法&#xff0c;另一种是使用multiprocessing模块。 前者仅适用于LINUX/UNIX操作系统&#xff0c;对Windows不支持&#xff0c;后者则是跨平台的实现方式。 第一种方式&#xff1a;使用os模…

【C++修行之路】STL——模拟实现string类

文章目录前言类框架构造与析构c_str迭代器操作符重载[]&#xff1a;&#xff1a;> > < < !:reverse与resizereverseresizepush_back与append复用实现insert和erasec_str与流插入、流提取eraseswap(s1,s2)与s1.swap(s2)结语前言 这次我们分几个部分来实现string类…

spark第一章:环境安装

系列文章目录 spark第一章&#xff1a;环境安装 文章目录系列文章目录前言一、文件准备1.文件上传2.文件解压3.修改配置4.启动环境二、历史服务器1.修改配置2.启动历史服务器总结前言 spark在大数据环境的重要程度就不必细说了&#xff0c;直接开始吧。 一、文件准备 1.文件…

React Use Hook 尝鲜

React Use Hook 尝鲜 最近继续在找处理 React 异步调用的方式……主要是现在需求比较复杂&#xff0c;用 cache query 的方式去实现有那么一丢丢的麻烦&#xff0c;又不是很想用额外的包&#xff0c;所以就想看看有没有比较好的一些处理方式。 当然&#xff0c;可以用到生产环…

tkinter界面的TCP通信/tkinter开启线程接收TCP

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…

Linux基础命令-dd拷贝、转换文件

文章目录 dd 命令介绍 语法格式 基本参数 参考实例 1&#xff09;生成一个200M的新文件 2&#xff09;拷贝文件的100个字节 3&#xff09;将文件的字母全部转换成大写 4&#xff09;将linux自带的光盘制作成iso格式的镜像文件 5&#xff09;使用dd命令制作1G的交换分…

软考中级-操作系统

1 操作系统地位计算机系统由硬件和软件组成&#xff0c;未配置软件的称为裸机&#xff0c;但这会导致效率低下。操作系统是为弥补用户与硬件之间的鸿沟的一种系统软件&#xff0c;汇编、编译、解释、数据库管理系统等系统软件和其他应用软件都在此基础。2 进程管理又称处理机管…

Linux Ubuntu配置国内源

因为众所周知的原因&#xff0c;国外的很多网站在国内是访问不了或者访问极慢的&#xff0c;这其中就包括了Ubuntu的官方源。 所以&#xff0c;想要流畅的使用apt安装应用&#xff0c;就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多&#xff0c;比较有代表性的有清华…

pytorch学习日记之激活函数

常用的激活函数为S型&#xff08;sigmoid&#xff09;激活函数、双曲正切&#xff08;Tanh&#xff09;激活函数、线性修正单元&#xff08;ReLU&#xff09;激活函数等&#xff0c;对应Pytorch的函数如下所示 层对应的种类功能torch.nn.SigmoidSigmoid激活函数torch.nn.TanhT…

_vue-3

Vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f; 1. 哪些变化 从上图中&#xff0c;我们可以概览Vue3的新特性&#xff0c;如下&#xff1a; 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

数据挖掘概述

目录1、数据挖掘概述2、数据挖掘常用库3、模型介绍3.1 分类3.2 聚类3.3 回归3.4 关联3.5 模型集成4、模型评估ROC 曲线5、模型应用1、数据挖掘概述 数据挖掘&#xff1a;寻找数据中隐含的知识并用于产生商业价值 数据挖掘产生原因&#xff1a;海量数据、维度众多、问题复杂 数…

直接拿项目运行npm start 会出现’react-scripts’ 不是内部或外部命令,也不是可运行的程序或批处理文件错误

目录 解决方案 原因 解决方案 npm install react-scripts或npm install安装完成后再次运行 npm start 即可 原因 create-react-app有丢包的缺陷&#xff0c;手动安装包后&#xff0c;需要重新npm install一下&#xff0c;这样node_modules/.bin/目录下才会重新出现react-s…

【论文阅读】基于LevelDB的分布式数据库研究

基于LevelDB的分布式数据库研究 基于LevelDB的分布式数据库的研究与实现 - 中国知网 (cnki.net) 实现了什么&#xff1f; 基于键值型NoSQL数据库LevelDB&#xff0c;并与数据一致性算法Raft、 数据分片和负载均衡相结合&#xff0c;设计并实现基于LevelDB的分布式数据库。 主要…