机器学习-k-近邻算法

news2024/10/2 22:21:30

k-近邻算法

  • 一、k-近邻算法概述
    • 1.1 使用python导入数据
    • 1.2 从文本文件中解析数据
  • 二、使用k-近邻算法改进约会网站的配对效果
    • 2.1 准备数据
    • 2.2 数据预处理
    • 2.3 分析数据
    • 2.4 测试算法
    • 2.5使用算法
  • 三、手写体识别系统

一、k-近邻算法概述

k-近邻算法是一种常用的监督学习算法,用于分类和回归任务。其思想为:如果一个样本在特征空间中的k个最近邻居中的大多数属于某个类别,那么该样本也属于这个类别(对于分类任务)或者可以通过这些最近邻居的标签来估计其目标值(对于回归任务)。

1.1 使用python导入数据

def createDataSet():
    '''
    构造数据
    
    Parameters:
        None
    Returns:
        group - 数据
        labels - 标签
    '''
    group = array([[100,98],[100,100],[0,0],[0,10]])    #[测试1的得分,测试2的得分]
    labels = ['A','A','B','B']    #整体评级情况
    return group, labels

1.2 从文本文件中解析数据

通过计算两点之间的距离来进一步选择相近的k个点:
d = ( x A 0 − x B 0 ) 2 − ( x A 1 − x B 1 ) 2 d=\sqrt{(x_{A_0}-x_{B_0})^2-(x_{A_1}-x_{B_1})^2} d=(xA0xB0)2(xA1xB1)2

def classify_KNN(inX, dataSet, labels, k):
    '''
    使用kNN算法进行分类
    
    Parameters:
        inX - 用于分类的数据(测试集)
        dataSet - 用于训练的数据(训练集)
        labels - 训练集标签
        k - kNN算法参数,选择距离最小的k个点
    Returns:
        sortedClassCount - 分类结果
    '''
    dataSetSize = dataSet.shape[0]    #dataSet的行数
    diffMat = inX - dataSet    #计算差值矩阵-广播
    sqDiffMat = diffMat**2    #差值矩阵平方
    sqDistances = sqDiffMat.sum(axis=1)    #计算平方和
    distances = sqDistances**0.5    #开根号
    sortedDistIndicies = distances.argsort()     #获取升序索引
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]    #获得类别信息
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    #类别数量+1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

至此,就可以通过给定数据进行分类预测,分类预测的效果与数据集的标准

二、使用k-近邻算法改进约会网站的配对效果

2.1 准备数据

海伦将自己交往过的人可以进行如下分类:不喜欢的人、魅力一般的人、极具魅力的人。
海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。海伦收集的样本数据主要包含以下3种特征:每年获得的飞行常客里程数、玩视频游戏所消耗时间百分比、每周消费的冰淇淋公升数。

def file2matrix(filename):
    '''
    读取数据,并将其转化为矩阵
    
    Parameters:
        filename - 文件路径
    Returns:
        returnMat - 数据矩阵
        classLabelVector - 数据标签
    '''
    with open(filename, "r") as file:
        lines = file.readlines()    #读取文本信息
    
    numberOfLines = len(lines)    #计算行数
    
    returnMat = zeros((numberOfLines,3))    #初始化矩阵
    classLabelVector = []    #创建分类标签向量
    index = 0

    for line in lines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        
        #根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力
        if listFromLine[-1] == 'didntLike':
            classLabelVector.append(1)
        elif listFromLine[-1] == 'smallDoses':
            classLabelVector.append(2)
        elif listFromLine[-1] == 'largeDoses':
            classLabelVector.append(3)
        index += 1
    return returnMat, classLabelVector   #(1000, 3),(1000,)

2.2 数据预处理

对于不同的类别的数据分布差异可能比较大,例如游戏时长百分比的差异在0-1之间,而飞行里程往往差异成败上千不等,差异大的属性值会严重影响欧式距离。因此需要对数据进行标准化,计算公式如下:
d a t a n o r m = d a t a − d a t a m i n d a t a m a x − d a t a m i n data_{norm} = \frac{data-data_{min}}{data_{max}-data_{min}} datanorm=datamaxdatamindatadatamin

def autoNorm(dataSet):
    '''
    归一化dataset中的值,函数返回归一化后的数据
    
    Parameters:
        dataSet - 原始数据
    Returns:
        normDataSet - 归一化后的数据
        ranges - 最大最小值的差值
        minVals - 数据中的最小值
    '''
    
    minVals = dataSet.min(0)    #获得数据的最小值
    maxVals = dataSet.max(0)    #获得数据的最大值
    
    ranges = maxVals - minVals#最大值和最小值的范围
    normDataSet = zeros(shape(dataSet))    #初始化归一矩阵
    m = dataSet.shape[0]    #dataSet的行数
    normDataSet = dataSet - tile(minVals, (m, 1))    #原始值减去最小值,tile是扩充函数
    normDataSet = normDataSet / tile(ranges, (m, 1))    #除以最大和最小值的差,得到归一化数据
    
    return normDataSet, ranges, minVals

2.3 分析数据

def showdatas(datingDataMat, datingLabels):
    '''
    将数据以散点图形式展示出来。
    
    Parameters:
        datingDataMat - 数据矩阵
        datingLabels - 数据标签
    Returns:
        None
    '''
            
    color_map = {1: 'r', 2: 'g', 3: 'b'}    # 创建颜色映射,将每个标签映射到不同的颜色
    label_name = ['didntLike','smallDoses','largeDoses']

    # 根据标签分组数据点
    grouped_data = {}
    for label in np.unique(datingLabels):
        grouped_data[label] = datingDataMat[datingLabels == label]
        
    plt.figure(figsize=(18, 6))
    plt.subplot(131)    # 创建X-Y平面上的散点图
    for label, color in color_map.items():
        points = grouped_data[label]
        plt.scatter(points[:, 0], points[:, 1], c=color, label=f'{label_name[label-1]}')
    plt.xlabel('每年获得的飞行常客里程数',fontproperties=font)
    plt.ylabel('玩视频游戏所消耗时间占',fontproperties=font)
    plt.legend()

    # 创建X-Z平面上的散点图
    plt.subplot(132)
    for label, color in color_map.items():
        points = grouped_data[label]
        plt.scatter(points[:, 0], points[:, 2], c=color, label=f'{label_name[label-1]}')
    plt.xlabel('每年获得的飞行常客里程数',fontproperties=font)
    plt.ylabel('每周消费的冰激淋公升数',fontproperties=font)
    plt.legend()

    # 创建Y-Z平面上的散点图
    plt.subplot(133)
    for label, color in color_map.items():
        points = grouped_data[label]
        plt.scatter(points[:, 1], points[:, 2], c=color, label=f'{label_name[label-1]}')
    plt.xlabel('玩视频游戏所消耗时间占',fontproperties=font)
    plt.ylabel('每周消费的冰激淋公升数',fontproperties=font)
    plt.legend()

    # 显示图形
    plt.tight_layout()
    plt.show()

在这里插入图片描述

2.4 测试算法

将数据按照指定比例划分训练集与测试集,训练集用于构建模型,测试集用于评估算法与数据的可靠性。

def datingClassTest():
    """ 
    测试算法的准确度,打印出算法的错误率
    Parameters:
        None
    Returns:
        None
    """
    filename = r"./datingTestSet.txt"    #文件路径
    datingDataMat, datingLabels = file2matrix(filename)
    
    hoRatio = 0.10   #测试集比例
    normMat, ranges, minVals = autoNorm(datingDataMat)    #数据归一化
    m = normMat.shape[0]    #数据量
    numTestVecs = int(m * hoRatio)    #测试集个数
    errorCount = 0.0    #分类错误量

    for i in range(numTestVecs):    #遍历测试集,评估正确率
        classifierResult = classify_KNN(normMat[i,:], normMat[numTestVecs:m,:],datingLabels[numTestVecs:m], 4)
        #输出错误的情况
        if classifierResult != datingLabels[i]:
            errorCount += 1.0
            print("分类结果:%d\t真实类别:%d" % (classifierResult, datingLabels[i]))
    print("错误率:%f%%" %(errorCount/float(numTestVecs)*100))

2.5使用算法

调用模型就可以进行数据的预估,不同的k值也可能会有不同的结果。需要根据实际应用场景决定

def classifyPerson():
    """ 
    根据输入内容进行判断
    Parameters:
        None
    Returns:
        None
    """
    resultList = ['讨厌','有些喜欢','非常喜欢']    #输出结果
    
    precentTats = float(input("玩视频游戏所耗时间百分比:"))
    ffMiles = float(input("每年获得的飞行常客里程数:"))
    iceCream = float(input("每周消费的冰激淋公升数:"))
    
    filename = "./datingTestSet.txt"
    datingDataMat, datingLabels = file2matrix(filename)
    normMat, ranges, minVals = autoNorm(datingDataMat)

    inArr = array([precentTats, ffMiles, iceCream])
    norminArr = (inArr - minVals) / ranges
    #返回分类结果
    classifierResult = classify_KNN(norminArr, normMat, datingLabels, 3)
    #打印结果
    print("你可能%s这个人" % (resultList[classifierResult-1]))

在这里插入图片描述

三、手写体识别系统

对于手写识别系统而言整体流程是一致的,主要差距在于数据的输入以及预处理上。

def img2vector(file_path):
    """
    将32x32的二进制图像转换为1x1024向量。

    Parameters:
        file_path - 文件名
    Returns:
        returnVect - 返回的二进制图像的1x1024向量
    """
    returnVect = np.zeros((1, 1024))    #初始化
    
    with open(file_path, 'r') as file:
        for i in range(32):
            lineStr = file.readline()
            for j in range(32):
                returnVect[0, 32*i+j] = int(lineStr[j])
    
    return returnVect

在这里插入图片描述

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

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

相关文章

百度智能云千帆大模型平台2.0来了!从大模型到生产力落地的怪兽级平台!!

目录 前言 最佳算力效能为企业降低门槛 最多大模型,最多数据集为企业保驾护航 企业级安全对于企业来说是硬性要求 前言 普通人或许感知不明显,但是对于企业而言,身处AI时代,是否选择投资大模型,是否拥抱人工智能…

既然有 HTTP 协议,为什么还要有 RPC

HTTP和RPC 什么是HTTP HTTP协议(Hyper Text Transfer Protocol),又叫做超文本传输协议。平时上网在浏览器上敲个网址就能访问网页,这里用到的就是HTTP协议。 什么是RPC RPC(Remote Procedure Call)&…

详解Vision Transformer中的Encoder

一.Transformer架构 左半边是Encoder,右半边是Decoder。 二.Vision Transformer Vision Transformer取了Transformer的左半边。包含 Input EmbeddingPositional Encoding多头注意力机制 Add & Norm(前馈网络)Feed Forward Add & Norm 2.1 Input Embe…

Python 完美解决 Import “模块” could not be resolved ...

首先扩展安装Python插件 Ctrl Shift P,在打开的输入框中输入 Python: Select Interpreter 搜索,选择 Python 解析器。 选好解析器后,就可以直接在 VS Code 里运行(快捷键 Ctrl F5)或调试(快捷键 F5&…

打造高效等级查询系统

在现代教育体系中,考试等级查询系统是学生、家长和校园必不可少的工具。易查分是一款功能强大、易于使用的在线成绩查询平台,可以帮助学生和家长方便查询学生的考试成绩和等级,了解学习情况,从而更好的制定学习计划和提供必要的支…

leetcode(力扣):203移除链表元素 leetcode(力扣):206反转链表 leetcode(力扣):876.链表的中间结点多种解法

目录 203.移除链表元素 解法一:将目标元素前一个元素存放地址改为下一元素地址 解法二:遍历原链表,把不是val的节点拿出来进行尾插到新链表​编辑 解法三:有哨兵位解法->头节点不存储有效数据​编辑 206.反转链表 方法一…

一次说清楚BCD编码

背景 在银行报文中,有很多用到BCD编码的地方,BCD编码和常见的二进制编码或者ASCII编码又有区别,所以很容易搞错,弄错概念,下面笔者就一次把BCD编码讲清楚。 一,概念 1,BCD编码,…

vue开发调试

1、调试方式 1.1 为什么调试 当遇到应用逻辑出现错误,但又无法准确定位的时候,同后台项目开发一样,可以在JS实现的应用逻辑中设置断点,并进行单步、进入方法内、跳出方法等调试,从而准确定位问题根源。 1.2 调试方法…

NC 添加IRule 后置前置规则

1、在保存后触发后置规则,找到保存的规则,在里面进行添加后置规则。 编写自己的规则,通过 CompareAroundProcesser 《AggCLMasterVo》 processor 的processor.addAfterRule(rule); 方法进行后置规则添加 Cl_SAVE_IRule : 实现 IR…

【API 管理】什么是 API 管理,为什么它很重要?

当今复杂的数字生态系统由许多相互关联的部分组成。API 作为看门人和连接器在其中发挥着关键作用——提供了许多最终用户甚至没有注意到的自动化机会和效率。 企业密切关注 API。它们对于应用程序、数据和各种客户交互的功能至关重要。 这使得 API 管理成为几乎每个部门的组织…

[计算机入门] 搜索文件

3.7 搜索文件 随着计算机的使用,里面存放的资料会越来越多,有些文件我们可能不记得存放在哪里了,这个时候就可以通过计算机自带的搜索功能进行搜索。 1、点击任务栏中的放大镜图标: 2、在弹出的窗口下方输入要查询的文件名&…

华为云云服务器评测|详解 Nacos 安装部署

环境配置 服务器云耀云服务器L操作系统CentOS 7.9 64bit | 公共镜像JDK64 bit JDK 1.8MavenMaven 3.2.xnacos-server2.2.3 下载地址 官方githubRelease 2.2.3 (May 25th, 2023) alibaba/nacos GitHub百度网盘链接:https://pan.baidu.com/s/1K8UE6iJL2ZnosUY83b…

案例聚焦:F5怎么样提升游戏玩家体验?

对手机游戏市场有过了解的小伙伴,定然对Deltatech Gaming Limited这个公司不会陌生。作为印度在线游戏和娱乐行业的领跑者,两个最受欢迎的多人游戏应用分别为多人游戏的 “Addagames” 和扑克类游戏 “Adda52” ,它们会定期举办在线联赛。而这…

【Apollo】Apollo的入门介绍

阿波罗是百度发布的名为“Apollo(阿波罗)”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

c语言 3.0

💂 个人主页: 程序员爱摸鱼🤟 版权: 本文由【程序员爱摸鱼】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注点赞收藏(一键三连)哦💅 想寻找共同成长的小伙伴,可以互粉哦 💬文章目录…

某堡垒机SQL注入漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、概述 中远麒麟堡垒机能够提供细粒度的访问控制,最大限度保护用户资…

前后端分离项目-基于springboot+vue的it职业生涯规划系统的设计与实现(内含代码+文档+报告)

it职业生涯规划系统在jdk环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务。总之,it职业生涯规划系统集中管理信息,有着保密性强,效率高,存储空间大…

xctf攻防世界 MISC之CatFlag

0x01.进入环境,下载附件 拿到的是一个无后缀的flag文件,用winhex打开后发现是奇奇怪怪的乱码,用kali的strings搜索也没找到flag情况。 0x02.问题分析 题目提示如图: 让直接cat就行,在kali中直接尝试输入&#xff1a…

百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会,可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0,发布首个大模型生态伙伴计划,而且也预告了文心大模型4.0的发布,大模型服务的成绩单也非常秀&#x…

198/213动态规划之打家劫舍系列

这两天在学习的时候,发现有个打家劫舍的题目,有意思的很,分享给大家。 基础题目 题目内容 198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互…