资讯专栏INFORMATION COLUMN

k-邻近算法(kNN)

william / 845人阅读

摘要:邻近算法算法背景假设我们要给一堆音乐分类,我们可以分成摇滚,民谣,戏曲等等,摇滚的音乐激昂,节奏快。这种基于某一特征出现的次数来区分事物的算法,我们使用邻近算法。

k-邻近算法 算法背景

假设我们要给一堆mp3音乐分类,我们可以分成摇滚,民谣,戏曲等等,摇滚的音乐激昂,节奏快。民谣舒缓节奏慢,但是摇滚中也有可能存在舒缓节奏慢点旋律, 同理民谣中也会有激昂,快的旋律。那么如何区分他们呢, 我们可以根据出现的频率来, 比如舒缓慢节奏的旋律多的是民谣, 激昂快多的旋律是摇滚。so这种基于某一特征出现的次数来区分事物的算法,我们使用k-邻近算法。

概述

k-邻近算法就是采用测量不同特征值之间的距离方法进行分类
优点: 精度高, 对异常值不敏感, 无数据输入假定
缺点: 计算复杂度高,空间复杂度高
适用范围: 数值型和表称行

原理

假设我们我们每个mp3时常 180秒
根据快慢节奏来做特征和一组已有数据集统计:

编号 - 慢节奏(秒) - 快节奏(秒) - 分类 -

1 - 100 - 80 - 民谣 -

2 - 140 - 40 - 民谣 -

3 - 20 - 160 - 摇滚 -

4 - 110 - 70 - 民谣 -

5 - 30 - 150 - 摇滚 -
。。。。。。。。。

现在我们有一个未知分类的mp3序号为x
其慢节奏时长为 103 快节奏时长为77
我们可以根据某种方法算出x与样本数据其他mp3的距离得到如下:

编号 - 与x的距离

1 - 10.1

2 - 20.5

3 - 90.3

4 - 15.7

5 - 80.2

按照距离递增我们排序然后找到k个距离最近的样本, 假定k = 3,
这三个样本依次序号为: 1, 4, 2
然后我们分析这三个全部是民谣, 于此我们断定x的分类为民谣

k-邻近算法的流程

搜集数据

准备数据

分析数据

训练算法

测试算法

使用算法

实例:

创建kNN.py

# 科学技术包
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是拥有四组数据的数组, 每组数据拥有两个特征, labels是数据的标签。我们将以有数据画在平面直角坐标系中如图:

分析数据

当拿到一组位置属性的数据时,我们需要一次做如下操作:

计算已有数据集中各个点与当前未知数据点的距离

按照距离递增排序

选取与未知点距离最近的k组数据

确定这k组数据的各标签出现的频率

返回这k组数据出现频率最高的标签作为未知点的标签

程序实例1:

# inX(需要预测分类的向量) dataSet(数据集) labels(标签集) k(邻近算法系数)
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance**0.5
    sortedDistIndicies = distance.argsort()
    classCount={}
    for i in range(k):
        voteIlable = labels[sortedDistIndicies[i]]
        classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]    

我们逐句分析下:
dataSetSize = dataSet.shape[0] (获取数据集的维度)详细点击
diffMat = tile(inX, (dataSetSize, 1)) - dataSet() (在行方向上重复dataSetSize次, 列方向上重复1此, 然后举证相减)详细介绍
假设inx向量为(x, y), 此时相当于数学上的矩阵相减:

[ x, y]      [1.0, 1.1]     [x-1, y-1.1]
[ x, y]      [1.0, 1.0]     [x-1, y-1]
[ x, y]  -   [0, 0]      =  [x-0, y-0]
[ x, y]      [0, 0.1]       [x-0, y-0.1]      

sqDiffMat = diffMat**2 (将矩阵每个值平方) 相当于数学上的

[(x-10)², (y-1.1)²]
[(x-1)², (y-1)²]
[(x-0)², (y-0)²]
[(x-0)², (y-0.1)²] 

sqDistance = sqDiffMat.sum(axis=1) (将矩阵按照行的方向相加) 详细点击
次操作相当于数学上的:

[(x-10)² + (y-1.1)²]
[(x-1)² + (y-1)²]
[(x-0)² + (y-0)²]
[(x-0)² + (y-0.1)²]

distance = sqDistance**0.5 (将矩阵的每个元素开0.5次方也就是 开平方)
相当于数学的:

[√2((x-10)² + (y-1.1)²)]
[√2((x-1)² + (y-1)²)]
[√2((x-0)² + (y-0)²)]
[√2((x-0)² + (y-0.1)²)]

细心的朋友就会发现算到这里其实我们采用了初中所学习过两点之间球距离的公式

sortedDistIndicies = distance.argsort() (将所得的距离进行排序)
classCount={} (新建一个字典)
for i in range(k): (以k邻近算法系数k循环)
voteIlable = labels[sortedDistIndicies[i]] (依次取出距离最近的k组数据对应的标签)
classCount[voteIlable] = classCount.get(voteIlable, 0) + 1 (以标签为健,以出现的次数为值)
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True) (将字典按照值的大小排序) 详细点击
return sortedClassCount[0][0] (最后返回出现次数最多的标签)
接下来我们实验一下,
我们进入终端

下一节学习 k邻近算法应用实例(一)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40857.html

相关文章

  • OpenCV闯关记——kNN算法在OpenCV中的实践

    摘要:什么是算法邻近算法,或者说最近邻,分类算法是数据挖掘分类技术中最简单的方法之一。方法在类别决策时,只与极少量的相邻样本有关。 什么是kNN算法 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核心思想是如果一个样本在特征...

    baihe 评论0 收藏0
  • 从零开始构造邻近分类器KNN

    摘要:起步本章介绍如何自行构造分类器,这个分类器的实现上算是比较简单的了。不过这可能需要你之前阅读过这方面的知识。在预测函数中,需要依次计算测试样本与数据集中每个样本的距离。筛选出前个,采用多数表决的方式。测试还是使用中提供的虹膜数据。 起步 本章介绍如何自行构造 KNN 分类器,这个分类器的实现上算是比较简单的了。不过这可能需要你之前阅读过这方面的知识。 前置阅读 分类算法之邻近算法:KN...

    GeekQiaQia 评论0 收藏0
  • JavaScript机器学习之KNN算法

    摘要:是的缩写,它是一种监督学习算法。每一个机器学习算法都需要数据,这次我将使用数据集。其数据集包含了个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾变色鸢尾和维吉尼亚鸢尾。四个特征被用作样本的定量分析,它们分别是花萼和花瓣的长度和宽度。 译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fund...

    enrecul101 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<