机器学习实战一(kNN)

机器学习实战一(kNN)

跟着老师做一个项目,关于行车记录仪识别前方车辆,并判断车距,不太好做。本来是用OpenCV,做着做着,突然发现需要补习一下机器学习的内容。《机器学习实战(machine learing in action)》这本书买了很久了,当时还是看了很多人推荐,不过到现在才想起翻出来看。第二章kNN的例子刚跟着做完,书里讲的很清楚,代码条理分明,只不过我是用Python3实现的。具体的过程不再赘述,只是把自己的理解放在这里。

先来看看书里第一章的部分。

  1. 机器学习就是把无序的数据转换成有用的信息。
  2. 机器学习横跨计算机科学、工程技术和统计学等多个学科。
  3. 机器学习的主要任务,可分为监督学习非监督学习:监督学习可用于预测目标变量的值,可分为分类,针对离散型目标变量,和回归,针对连续型目标变量;非监督学习不预测目标变量的值,将数据划分为离散的组,则称为聚类,如果还需要估计数据与每个分组的相似度,则为密度估计
  4. 步骤:
    • 收集数据(前期采集)
    • 准备输入数据(数据格式化)
    • 分析输入数据(探索型分析)
    • 训练算法
    • 测试算法
    • 使用算法

kNN(k-近邻算法)

优点:精度高、对异常值不敏感、无数据输入假定

缺点:计算复杂度高、空间复杂度高

适用数据范围:数值型和标称型

原理:已知一组数据的属性值和类别标签,给定一个输入数据,判断所属类别。kNN的做法是计算输入数据与所有已知数据的空间距离(欧氏距离),然后从小到大排列,取前k个数据,出现次数最多的类别标签作为输入数据的所属类别。

欧式距离计算:$\sqrt {\left( x-x_{i}\right) ^{2}+\left( y-y_{i}\right) ^{2}+\ldots }$

核心代码如下:

"""
Created on 2017/12/30 19:13
kNN: k-近邻算法

Input:  inX: 用于判断类别的矩阵 (1xN)
        dataSet: 已知类别的数据集向量 (NxM)
        labels: 数据集的标签 (1xN)
        k: 用于比较的近邻的数量 (应该是奇数)

Output: 最可能的类标签

@author: Lucifer
@site: plantree.me
@email: [email protected]
"""
import numpy as np
import os
import operator
# kNN
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    # np.tile()将inX重复(dataSetSize, 1)次
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    # 排序后的索引
    sortedDistanceIndices = distances.argsort()
    classCount = {}
    for i in range(k):
        # 寻找出现次数最的标签
        voteILabel = labels[sortedDistanceIndices[i]]
        classCount[voteILabel] = classCount.get(voteILabel, 0) + 1
    # 字典的排序
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),
                              reverse=True)
    return sortedClassCount[0][0]

核心的代码并不算复杂,这里用到了numpy提供的tile()函数,用于将矩阵横向或者纵向复制,然后利用numpy中广播的概念:对于矩阵的操作,会具体到矩阵中每一个元素上,这样计算效率无疑会很高。

书里提供的两个例子:

  • 使用k-近邻算法改进约会网站的配对效果
  • 手写识别系统

两个例子都提供了原始数据,都很有意思,具体代码详见我的GitHub

这两个例子,有几点经验需要学习。

1、数据格式化

第一步,数据的格式化是非常有必要的。因为现在数据来源广泛,可以来自网络,可以来自文本文件,也可以来自数据库,但是具体到算法,输入数据的格式是固定的,这就有必要进行数据的格式化,但是具体格式化的方式是不固定的,这个要看具体算法输入的要求,像这里输入的数据必须是numpy的array格式,但是数据源是文本文件,这就需要另写方法来自动执行这些转换。

2、数据归一化

不同属性之间的数据,不具备可对比度,有些尺度相差很大,很影响算法执行的效果,因此在真正的输入数据到算法之前,需要进行归一化。其实归一化也很简单,方式也不止一种,比如:

newValue = (oldValue - min) / (max - min)

可以看出,归一化后的数据,范围落在[-1, 1],而且避免了不同尺度数据造成的偏差。

3、探索型数据分析

说是探索型数据分析,显得有些专业,其实就是在具体执行机器学习算法之前,先来看看数据长什么样子。可以采用一些统计参数,如均值和方差等,另外一种很重要的方式就是可视化,Python中最常见的自然是Matplotlib绘图库了,Seaborn也不错,可以尝试学学,可以很直观的看到数据长什么样子。

4、训练集和预测集

通常会将原始数据分割为训练集和预测集,比如90%的数据作为训练集,用于训练模型,剩下10%作为预测集,来预测模型的准确度,由于预测集的预测目标值已知,因此可以通过判断模型输出结果与原有结果比较,得出错误的数量,然后除以预测集总数,即可得到错误率,来表征模型质量。

kNN存在的问题:

  • 训练样本数量较大,而且必须保存全部数据集
  • 对数据集中的每个数据计算距离值,计算量较大,十分耗时
  • 无法给出任何数据的基础结构信息,对于数据的特征并不了解

Next:下一章将使用改率测量方法处理分类问题,即决策树。



总结:初次接触机器学习,从数据中挖掘信息听起来十分诱人,也十分有趣。kNN作为一种比较简单的算法,单纯通过比较与已知数据的距离,这是一种十分别致的思考方式,将属性放在坐标系空间,然后计算空间距离,方法简单,实现起来也比较容易。

Reference:https://github.com/plantree/Machine-Learing-In-Action/tree/master/chapter2

原文地址:https://www.cnblogs.com/lucifer25/p/8167948.html

时间: 2024-10-12 00:43:26

机器学习实战一(kNN)的相关文章

机器学习实战之kNN

笔者最近开始对机器学习非常感兴趣,作为一个有志向的软设方向的女孩纸,我开始了学习的第一步入门,下面将今天刚刚学习的kNN及其应用进行总结和回顾,希望可以得到更好的提升,当然,有志同道合者,你可以联系我给我留言,毕竟菜鸟一起飞才能飞的更高更远.?? 首先,kNN算法也叫k-近邻算法,它的工作原理是:存在一个样本的数据集合,也称作训练样本集,并且每个样本集都有其标签.故而,我们很清楚每一数据和其所属分类之间的关系.当输入新样本时,我们将新数据的每一个特征样本集中对应的数据特征进行比较,然后算法提取特

机器学习实战之kNN算法

机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.11.3,64位,这是python的科学计算包,是python的一个矩阵类型,包含数组和矩阵,提供了大量的矩阵处理函数,使运算更加容易,执行更加迅速. (3)matplotlib 1.5.3,64位,在下载该工具时,一定要对应好python的版本,处理器版本,matplotlib可以认为是python

《机器学习实战》--KNN

代码来自<机器学习实战>https://github.com/wzy6642/Machine-Learning-in-Action-Python3 K-近邻算法(KNN) 介绍 简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类. 优点:精度高.对异常值不敏感,无数据输入假定. 缺点:计算复杂度高.空间复杂度高,无法给出数据的内在含义. 使用数据范围:数值型.标称型. 分类函数的伪代码: 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间

机器学习实战1-2 KNN改进约会网站的配对效果 datingTestSet2.txt 下载方法

今天读<机器学习实战>读到了使用k-临近算法改进约会网站的配对效果,道理我都懂,但是看到代码里面的数据样本集 datingTestSet2.txt 有点懵,这个样本集在哪里,只给了我一个文件名,没有任何内容啊. 上网百度了这个文件名,发现很多博主的博客里可以下载,我很好奇,同样是读<机器学习实战>,他们是从哪里下载的数据样本集呢?就重新读了这本书.终于在"关于本书"最后的"作者在线里面"找到了网址!就是这个,大家需要可以来这里下载. http

机器学习实战读书笔记(二)k-近邻算法

knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法:不适用 5.测试算法:计算正确率 6.使用算法:需要输入样本和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理. 2.1.1 导入数据 operator是排序时要用的 from numpy import * import operato

基于kNN的手写字体识别——《机器学习实战》笔记

看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]:存在一个样本数据集合.每个样本数据都存在标签.输入没有标签的新数据后,将新数据的每个特征与样本集数据的对应特征进行比较,然后算法提取样本集中最相似的分类标签.一般说来,我们只选择样本数据集中前k个最相似的数据,最后,选择这k个相似数据中出现次数最多的分类,作为新数据的分类. 通俗的说,举例说明:有一群明确国籍

《机器学习实战》读书笔记2:K-近邻(kNN)算法

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.K-近邻算法的工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(

机器学习实战——kNN分类器

惰性学习法:简单的存储数据,一直等待,直到给定一个测试元组时才进行泛化,根据对存储的元组的相似性进行分类.kNN(k近邻)分类方法于20世纪50年代提出,由于计算密集型算法,因此到60年代之后随着计算能力增强后才逐步应用. kNN基于类比学习,将给定的测试元组表示为n维空间中的一个点,n代表属性数目.然后使用某种距离度量方式来寻找与给定测试元组最近的k个训练元组,对这个k个训练元组的类别进行统计,返回类别数目多的类别作为未知测试元组的类别. 常用的距离度量就是欧几里得距离,也称为二范数.同时为了

机器学习实战python3 K近邻(KNN)算法实现

台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python3 写一遍.python3 与python2 不同的地方会在程序中标出. 代码及数据:https://github.com/zle1992/MachineLearningInAction/tree/master/ch2 k-近邻算法优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高