机器学习-k-近邻算法

这篇具有很好参考价值的文章主要介绍了机器学习-k-近邻算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、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()

机器学习-k-近邻算法,机器学习,近邻算法,人工智能

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]))

机器学习-k-近邻算法,机器学习,近邻算法,人工智能

三、手写体识别系统

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

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

机器学习-k-近邻算法,机器学习,近邻算法,人工智能文章来源地址https://www.toymoban.com/news/detail-699593.html

到了这里,关于机器学习-k-近邻算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从人工智能到机器学习到深度学习、强化学习,以及相关的算法原理、应用场景等方面对人工智能技术的研究进行全面的综述

    作者:禅与计算机程序设计艺术 2021年是一个重要的历史节点,数字化时代正在席卷全球各个角落。大数据、云计算、区块链等新兴技术带动着各行各业的变化与革命,机器学习(ML)、深度学习(DL)、强化学习(RL)等AI技术也越发成熟。随之而来的,伴随着人工智能应用的

    2024年02月07日
    浏览(60)
  • 探索人工智能 | 模型训练 使用算法和数据对机器学习模型进行参数调整和优化

    模型训练是指 使用算法和数据对机器学习模型进行参数调整和优化 的过程。模型训练一般包含以下步骤:数据收集、数据预处理、模型选择、模型训练、模型评估、超参数调优、模型部署、持续优化。 数据收集是指为机器学习或数据分析任务收集和获取用于训练或分析的数

    2024年02月12日
    浏览(45)
  • 【Python】人工智能-机器学习——不调库手撕演化算法解决函数最小值问题

    现在有一个函数 3 − s i n 2 ( j x 1 ) − s i n 2 ( j x 2 ) 3-sin^2(jx_1)-sin^2(jx_2) 3 − s i n 2 ( j x 1 ​ ) − s i n 2 ( j x 2 ​ ) ,有两个变量 x 1 x_1 x 1 ​ 和 x 2 x_2 x 2 ​ ,它们的定义域为 x 1 , x 2 ∈ [ 0 , 6 ] x_1,x_2in[0,6] x 1 ​ , x 2 ​ ∈ [ 0 , 6 ] ,并且 j = 2 j=2 j = 2 ,对于此例,所致对于 j =

    2024年01月20日
    浏览(46)
  • 毕业设计选题-基于深度学习的车道线检测算法识别系统 人工智能 机器学习 卷积神经网络

    目录 前言 课题背景和意义 实现技术思路 一、车道线检测方法 1.1 卷积神经网络 1.2 注意力机制 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学

    2024年02月22日
    浏览(51)
  • 毕业设计-基于深度学习玉米叶病虫害识别系统 YOLO python 机器学习 目标检测 人工智能 算法

    目录 前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 卷积神经网络 2.2 YOLOv5算法 三、检测的实现 3.1 数据集 3.2 实验环境搭建 3.3 实验及结果分析 实现效果图样例 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准

    2024年02月03日
    浏览(46)
  • 机器学习入门教学——人工智能、机器学习、深度学习

    1、人工智能 人工智能相当于人类的代理人,我们现在所接触到的人工智能基本上都是弱AI,主要作用是正确解释从外部获得的数据,并对这些数据加以学习和利用,以便灵活的实现特定目标和任务。 例如: 阿尔法狗、智能汽车 简单来说: 人工智能使机器像人类一样进行感

    2024年02月09日
    浏览(63)
  • 人工智能|机器学习——基于机器学习的舌苔检测

    基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。在诊断中,中医通过观察人的舌头的舌质、苔质等舌象特征,了解人体内的体质信息从而对症下药。 传统中医的舌诊主要依赖

    2024年02月22日
    浏览(50)
  • 人工智能与机器学习

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 专栏:《机器学习》 ​ ​ ☞什么是人工智能、机器学习、深度学习 人工智能这个概念诞生于1956年的达特茅斯

    2024年02月02日
    浏览(45)
  • 【机器学习】人工智能概述

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 1.人工智能概述 1.1 机器学习、人工智能与深度学习 1.2 机器学习、深度学习能做些什么

    2024年02月09日
    浏览(44)
  • 机器学习--人工智能概述

    入门人工智能,了解人工智能是什么。为啥发展起来,用途是什么,是最重要也是最关键的事情。大致有以下思路。 人工智能发展历程 机器学习定义以及应用场景 监督学习,无监督学习 监督学习中的分类、回归特点 知道机器学习的开发流程 人工智能在现实生活中的应用

    2024年01月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包