机器学习入门:K-近邻算法

先来一个简单的例子,我们如何来区分动作类电影与爱情类电影呢?动作片中存在很多的打斗镜头,爱情片中可能更多的是亲吻镜头,所以我们姑且通过这两种镜头的数量来预测这部电影的主题。简单的说, k-近邻算法 采用了测量不同特征值之间的距离方法进行分类。
优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、控件复杂度高 适用数据范围:数值型和标称型
首先我们来理解它的工作原理:
存在一个样本数据集(训练集),并且我们知道每一数据与目标变量的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中最相近的分类标签,一般来说,我们只选择样本集中前k个最相似的数据,通常k为不大于20的整数,最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
现在我们回到文章开头所提到的电影的例子,根据下表如何确定未知的电影类型呢?
电影名称    打斗镜头    接吻镜头    电影类型
电影1    3    104    爱情
电影2    2    100    爱情
电影3    1    81    爱情
电影4    101    10    动作
电影5    99    5    动作
电影6    98    2    动作
电影7    18    90    未知?
该如何计算电影7的电影类型呢?计算电影7与样本集中其他电影的距离,然后我们假定k=3,看一下最近的3部电影是什么类型即可预测出电影7的电影类型。
流程介绍
收集数据
准备数据:距离计算所需要的值,最好是结构化的数据格式
分析数据
测试算法:计算错误率
使用算法
开始工作
使用python导入数据
首先,创建名为kNN.py的Python模块,在构造算法之前,我们还需要编写一些通用的函数等,我们先写入一些简单的代码:
from numpy import *
import operator

def createDataSet():
    group = array([
      [1.0, 1.1], 
      [1.0, 1.0],
      [0, 0],
      [0, 0.1]
    ])

labels = ["A", "A", "B", "B"]

return group, labels
然后将终端改变到代码文件目录,输入命令python进入到交互界面:
>>> import kNN

>>> group, labels = kNN.createDataSet()

>>> group
array([[ 1. ,  1.1],
       [ 1. ,  1. ],
       [ 0. ,  0. ],
       [ 0. ,  0.1]])
>>> labels
['A', 'A', 'B', 'B']
这里有4组数据,每组数据有2个我们已知的特征值,上面的group矩阵每行为一条数据,对于每个数据点我们通常使用2个特征(所以特征的选择很重要),向量labels包含了每个数据点的标签信息,labels的维度等于矩阵的行数,这里我们将 [1, 1,1] 定为类A, [0, 0.1] 定为类B,接下来我们进行算法的编写:
计算已知数据集中点到当前点之间的距离
按照距离递增次序排序
选取与当前点距离最小的k个点
确定前k个点所在类别的出现频率
返回前k个点中频次最高的类别作为预测类别
接着定义函数:
# inX: 用于分类的输入向量
# dataSet:输入的训练集
# labels:标签向量
# k:选择近邻项目的个数
def classify0(inX, dataSet, labels, k) :
    dataSetSize = dataSet.shape[0]
    # 距离计算
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2 # python中, **2 代表2平方,**0.5代表开方
    sqDistances = sqDiffMat.sum(axis=1) # 加入axis=1以后就是将一个矩阵的每一行向量相加
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}

# 选择距离最小的k个点
    for i in range(k) :
        voteILabel = labels[sortedDistIndicies[i]]
        classCount[voteILabel] = classCount.get(voteILabel, 0) + 1

# 排序
    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
然后我们进行测试,重新打开python编译环境:
>>> import kNN
>>> group, labels = kNN.createDataSet()
>>> kNN.classify0([0, 0], group, labels, 3)
'B'
>>> kNN.classify0([0.3, 0], group, labels, 3)
'B'
>>> kNN.classify0([0.8, 0.9], group, labels, 3)
'A'
我们看到,一个简单的分类器就这样搞定了。这时,我们来将电影数据进行样本写入:
def createDataSet():
    group = array([
      [3, 104], 
      [2, 100],
      [1, 81],
      [101, 10],
      [99, 5],
      [98, 2]
    ])

labels = ["love", "love", "love", "action", "action", "action"]

return group, labels
>>> import kNN
>>> group, labels = kNN.createDataSet()
>>> kNN.classify0([18, 90], group, labels, 3)
'love'
我们看到预测结果为爱情片。这是一个简单的分类器,当然,我们应该通过大量的测试,看预测结果与预期结果是否相同,进而得出错误率,完美的分类器错误率为0,最差的错误率为1,上边电影分类的例子已经可以使用了,但是貌似没有太大的作用,下边我们来看一个生活中的实例,使用k-近邻算法改进约会网站的效果,然后使用k-近邻算法改进手写识别系统。
改进约会网站的配对效果
有个姑娘,一直在使用某交友网站,但是推荐来的人总是不尽人意,她总结了一番,曾交往过3中类型的人:
不喜欢的人
魅力一般的人
极具魅力的人
她觉得自己可以在周一~周五约会那些魅力一般的人,周末与那些极具魅力的人约会,因为她希望我们可以更好的帮助她将匹配的对象划分到确切的分类中,她还收集了一些约会网站未曾记录过的数据信息,她认为这些数据信息会有帮助。这些数据存放在代码文件夹下 datingTestSet2.txt 中,总共有1000行数据(妹的约了1000个人),主要包含以下特征:
每年获得的飞行常客里程数
玩视频游戏所消耗的时间百分比
每周消费的冰激凌公升数
我们看到,统计的东西都比较奇葩,我们先从文件中把这些数值解析出来,输出训练样本矩阵和分类标签向量。在kNN.py中继续书写代码:
从文本中读入数据
def file2matrix(filename) :
    fr = open(filename)
    arrayOfLines = fr.readlines()
    numberOfLines = len(arrayOfLines) # 得到文件行数
    returnMat = zeros((numberOfLines, 3)) # 创建用0填充的矩阵,这里为了简化处理,我们将矩阵的另一个纬度设置为3,可以按照自己的需求增加数量。

classLabelVector = []
    index = 0
    # 解析文件

转载于:https://www.cnblogs.com/amengduo/p/9587160.html

机器学习入门:K-近邻算法相关推荐

  1. 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...

  2. 机器学习之K近邻算法原理+应用实例

    1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...

  3. 机器学习:K近邻算法

    一.K-近邻算法简介 1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 1.1 K-近邻算法(KNN)概念 K Nearest Neighbor算法又叫KNN算法,这个算法 ...

  4. 机器学习:K近邻算法(K-NN)

    K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...

  5. 机器学习入门KNN近邻算法(一)

    1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...

  6. 机器学习之k近邻算法

    本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...

  7. 【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

    文章目录 一.KNN 基本介绍 二.KNN 核心思想 三.KNN 算法流程 四.KNN 优缺点 五.Java 代码实现 KNN 六.KNN 改进策略 一.KNN 基本介绍 邻近算法,或者说K最邻近(K ...

  8. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  9. python机器学习---1. K近邻算法

    机器学习的方法是基于数据产生的"模型" (model) 的算法,也称"学习算法" (learning algorithm).包括有监督学习(supervised ...

  10. 机器学习--从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全不代表你将来的面试中会遇到此类问题,只是因为我的简历上 ...

最新文章

  1. Planetary.js:帮助你构建超炫的互动球体效果
  2. xampps开启mysql_xampps mysql无法启动
  3. Python3入门笔记(1) —— windows安装与运行
  4. matlab智能算法30个案例分析_赞!继电保护25个事故案例分析总结,值得收藏!...
  5. [LeetCode]202. Happy Number(平衡二叉树 哈希表)
  6. python获取输入数字_python获取从命令行输入数字的方法
  7. 微服务架构在云端的应用
  8. 二十万字C/C++、嵌入式软开面试题全集宝典八
  9. 进虚拟ftp服务器跳网页,ftp服务器总是自动跳到网页
  10. 编译原理抽象语法树_平衡抽象原理
  11. java 悬浮提示框_表格(悬浮框提示)
  12. 【数据挖掘】挖掘建模-回归分析(1)
  13. Node.js开发之Express框架安装
  14. 计算机公式与函数乘法,excel常用函数乘法公式的使用方法
  15. Hindenburg发布亿邦国际做空报告,称其股份增发套现、矿机销量萎靡
  16. 关于网络营销基本理论的概述
  17. 较好游戏型计算机配置单,i3-6100配什么显卡比较好?4000元i3-6100独显均衡游戏电脑配置推荐...
  18. 从TCL的40年变革史,看中国制造之路
  19. 贵州最新特种工(施工升降机)模拟题集及答案
  20. 易代账好会计zip导入提示不平衡

热门文章

  1. 字符编码_Windows资料
  2. 写你的shell,其实很简单[架构篇]
  3. mmz-asio4delphi死链接的解决办法
  4. OpenCV中cvADDS()为啥第二个参数要是CvScalar类型?掩码mask=NULL又是何意?
  5. java 10新_【Java基础】Java10 新特性
  6. C中printf函数的实现原理
  7. pythonrequests发送数据_在python中使用requests 模拟浏览器发送请求数据的方法
  8. linux正则表达式_号称“天书”的正则表达式,要这么来讲,我小学三年级已经满分了
  9. centos nginx不是命令_Nginx 在CentOS 6/7 上的安装与使用
  10. 华农软件工程实验报告_华南农业大学15年软件工程复习提纲