机器学习之K-近邻算法

1.橙子还是柚子该例子来自于《算法图解》,看下图中的水果是橙子还是柚子?我的思维过程类似于这样:我脑子里面有个图表图中左下的表示橙子,右上的表示柚子,取橙子和柚子的两个特征(大和红),一般而言

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

1. 橙子还是柚子

  该例子来自于《算法图解》,看下图中的水果是橙子还是柚子?

  机器学习之K-近邻算法

  我的思维过程类似于这样:我脑子里面有个图表

  机器学习之K-近邻算法

  图中左下的表示橙子,右上的表示柚子,取橙子和柚子的两个特征(大和红),一般而言,柚子更大、更红,上图的水果又大又红,因此可能是柚子,那下面的水果呢?

  机器学习之K-近邻算法

  一种办法是看它的邻居,离它最近的邻居的三个邻居中有两个橙子一个柚子,因此这个水果很可能是橙子

  上面刚使用的方法就是KNN(K-近邻算法),感觉是不是很简单

2. K-近邻算法步骤

  对未知类别属性的数据集中的每个点依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离

(2)按照距离递增顺序排序

(3)选取与当前点距离最小的K个点

(4)确定前k个点所在类别的出现频率

(5)返回前k个点出现频率最高的类别作为当前点的预测分类

3. K-近邻算法实现

  使用Python按照上面的步骤实现算法

import numpy as np

def knn(labels, dataset, in_data,k):

    """
    labels:list
    dataset:ndarray
    in_data:ndarray
    k:int
    """
    row = dataset.shape[0]
    sub_set = dataset - np.tile(in_data,(row,1))
    sqrt_set = sub_set ** 2
    distance = sqrt_set.sum(axis=1) ** 0.5
    dic = {}
    sortedIndex_list = distance.argsort()
    # 算出邻居中对应的label次数
    result = {}
    for i in range(k):
        key = sortedIndex_list[i]
        result[labels[key]] = result.get(labels[key],0)+1
        
    result_list=sorted(result.items(), key=lambda x: x[1],reverse=True)
    return result_list[0][0]

4. 示例1:约会匹配

需求:

  根据数据特征值(玩游戏所耗时间百分比、每年获得的飞行里程数、每周消费的冰淇淋公升数),判断对该约会对象的喜好程度,绝对是否要去约会

准备工作:

(1)数据集:dataset\datingTestSet2.txt

(2)数据集特征:

  a. 玩游戏所耗时间百分比  —->数据集中的第一列

  b. 每年获得的飞行里程数  —->数据集中的第二列

  c. 每周消费的冰淇淋公升数 —->数据集中的第三列

(3)样本分类标签:—->数据集中的第四列

(4)测试数据集:dataset\datingTestSet.txt

实现:

(1)从文件提取数据集和标签

def file2matrix(filename):

    """将文件数据转换为numpy.ndarray"""
    
    list_lines = []
    with open(filename,'r') as pf:
        lines = pf.readlines()
        for line in lines:
            list_lines.append([float(i) for i in line.strip().split('\t')])
            
    matrix = np.array(list_lines)
    data_set = matrix[:,0:-1]
    class_labels = matrix[:,-1:]
    class_labels = class_labels.reshape(1,1000).tolist()[0]
    return data_set,class_labels

(2)对数据集中的特征值数据进行归一化处理

def auto_norm(dataset):
    """
    为了防止各特征值之间的数值差距太大而影响计算结果,
    对矩阵数据进行归一化处理,将每个特征值都转换为[0,1]
    """
    min = dataset.min(0)
    max = dataset.max(0)
    sub = max - min
    norm_dataset = np.zeros(dataset.shape)
    row = dataset.shape[0]
    norm_dataset = dataset - np.tile(min,(row,1))
    norm_dataset = norm_dataset / np.tile(sub,(row,1))
    return norm_dataset,sub,min

(3)使用测试数据集对算法进行测试

def test_datingTestSet():
    data_set,date_labels = file2matrix('dataset\\datingTestSet2.txt')
    norm_dataset,sub,min = auto_norm(data_set)

    #根据数据集测试KNN算法的正确率
    rows = norm_dataset.shape[0]
    ok = 0
    for i in range(rows):
        result = knn(date_labels,norm_dataset,norm_dataset[i,:],3)
        if result == date_labels[i]:
            ok += 1
        else:
            print("测试错误结果为{},正确结果为{}".format(result, date_labels[i]))
    print("测试总记录数为{},成功记录数为{},KNN算法成功率为{}".format(rows,ok,ok/rows))

输出:

机器学习之K-近邻算法

5. 示例2:手写识别系统

需求:

  根据dataset\trainingDigits文件夹中的样本数据和dataset\testDigits文件夹中的样本数据测试KNN算法

实现:

(1)将每个文件中的数据(32*32)转换为matrix(m*1024)

def imgae2matrix(filepath):
    filelist = os.listdir(filepath)
    m = len(filelist)
    array_m_1024 = np.zeros((m,1024))
    k = 0
    labels = []
    for file in filelist:
        #对文件名进行处理得到labels
        label = file.split('_')[0]
        labels.append(label)
        array_1_1024 = np.zeros((1,1024))
        with open(os.path.join(filepath,file),'r') as pf:
            for i in range(32):
                line = pf.readline()
                for j in range(32):
                    array_1_1024[0,32*i+j] = int(line[j])
        array_m_1024[k,:] = array_1_1024
        k+=1
    return array_m_1024,labels

(2)使用knn算法测试成功率

def test_numbers():
    array_m_1024,labels = imgae2matrix('dataset\\trainingDigits\\')
    test_array_m_1024,test_labels = imgae2matrix('dataset\\testDigits\\')
    ok = 0
    rows = test_array_m_1024.shape[0]
    for i in range(rows):
        in_data = test_array_m_1024[i,:]
        result = knn(labels, array_m_1024, in_data,5)
        if result == test_labels[i]:
            ok += 1
        else:
            print("测试错误结果为{},正确结果为{}".format(result, test_labels[i]))
    print("测试总记录数为{},成功记录数为{},KNN算法成功率为{}".format(rows,ok,ok/rows))

(3)输出

机器学习之K-近邻算法

6. 总结

  K-近邻算法是分类数据最简单有效的算法,使用算法时必须有接近实际数据的训练样本数据,如果训练数据集很大,必须使用大量的存储空间,此外由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。

  K-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。

  代码和数据集都已上传至:https://github.com/lizoo6zhi/MachineLearn.samples

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120032.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月30日 上午6:00
下一篇 2021年12月30日 上午7:00


相关推荐

  • linux命令 ll信息详解[通俗易懂]

    linux命令 ll信息详解[通俗易懂]本文链接:https://blog.csdn.net/LEON1741/article/details/82386520在linux下使用“ls-l”或者“ls-al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息。平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考:首先给出一张典型的显示结果:下面对其中的每一列进行详细的分析:…

    2022年6月29日
    30
  • pycharm django开发_django项目实例精解

    pycharm django开发_django项目实例精解1.首先按往常“NewProject”创建新项目2.在下方Terminal终端输入django-adminstartprojectroomroom是我的项目名称3.新建app目录pythonmanage.pystartappappapp是我起的名称,可以换成其他的4.运行在终端cd进入manage.py路径后输入命令pythonmanage.pyrunserver8000点击此处链接就可以了这是运行成功界面。参考自https://www.jianshu.com

    2022年8月28日
    3
  • html制作网页案例代码 大学生_完整html网页代码

    html制作网页案例代码 大学生_完整html网页代码+前言完成一个网页的制作其实本质上是很简单的,本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,采用了有div+css布局。+主题《登录·枫叶》+图摘+目录+代码

    2026年2月20日
    3
  • 认识ManualResetEvent

    认识ManualResetEventManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可以访问资源。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始执行)时

    2022年7月4日
    29
  • 数据库基础(常用SQL语句)[通俗易懂]

    数据库基础(常用SQL语句)[通俗易懂]一、数据库级及SQL语言简介1、目前主流数据库微软:sqlserver、access瑞典:mysqlibm:db2sybase:sybaseibm:informixoracle:oracle2、SQL语言DQL————-数据查询语言select…From…WhereDML————-数据操纵语言insert、upda…

    2022年5月6日
    47
  • 菜地公告:元宵节《菜农新唐M0技术交流群》有条件散群预告

    菜地公告:元宵节《菜农新唐M0技术交流群》有条件散群预告菜地公告:菜农助学园地500人支柱群菜农新唐M0技术交流群:12047788长期致力于纯技术交流,与菜农助学群校:134915667一同奉行“饮水思源”之精神。菜农为了网友的合法权宜得到公正的待遇,特此做出如下沉痛之决议:在元宵节晚上8:25以前,若链接:http://bbs.ednchina.com/BLOG_ARTICLE_3001363.HTM中的“发表评论”少于

    2022年5月19日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号