KNN

1,  KNN算法概述

简单地说,KNN算法采用测量不同特征值之间的距离方法进行分类。

举个例子:

我们可以通过电影里出现 kiss(接吻) 和 kick(打斗) 的次数多少来判断它是属于Romance type(爱情片)还是动作片

假设我们统计了前6部电影的kicks次数,kisses的次数和类型,现在问题来了,如果我知道这么一部电影它的kicks次数为18,kisses次数为90,那么它属于什么类型呢? KNN可以用来解决这个问题。

如上图 我们可以计算 ‘?‘未知电影和已知的所有电影的欧几里得距离,然后进行排序,选出其中前3部电影,统计它们分别属于什么类型。  可以看出和未知电影距离近的3部电影都是爱情电影,因此我们可以将未知电影划分成 爱情片 。

现在可以得出KNN算法的一般描述:

  1. 计算已知类别数据集中的点与当前点之间的距离;
  2. 按照距离递增次序排序;
  3. 选取与当前点距离最小的k个点;
  4. 确定前k个点所在类别的出现频率;
  5. 返回前k个点出现频率最高的类别作为当前点的预测分类。

2,  KNN算法的简单实现

假设有四个点 (1.0,1.1),(1.0,1.0),(0,0),(0,0.1)类别分别为 (‘A‘,‘A‘,‘B‘,‘B‘ ),现在输入两个点(0.5,0.4),(0.1,0.2) 预测它们的类别。          (0.5,0.4)   ==>  ?              (0.1,0.2) ==>?

代码实现:

__author__ = ‘xianweizheng‘
from numpy import *
import matplotlib.pyplot  as plt
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

def dataSetPlot(group, labels):
    x = [] ; y = [] ;len =group.__len__()
    for i in arange(0,len):
        x.append([group[i][0]])
        y.append([group[i][1]])
        plt.text(group[i][0]+0.02,group[i][1]-0.02,labels[i])
    return x,y

def kNNClassify(inX, dataSet, labels, k):
    ‘‘‘classify using kNN

    step 1: calculate Euclidean distance
    step 2: sort the distance
    step 3: choose the min k distance
    step 4: count the times labels occur
    step 5: the max voted class will return ‘‘‘

    ## step 1: calculate Euclidean distance
    dataSetSize = dataSet.shape[0]  #dataSet.shape() 为 (4,2)表示4行两列
    diffMat = tile(inX, (dataSetSize,1)) - dataSet  #tile(a,(n1,n2)) n2表示列重复能n2次,n1表示行重复n1次
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)   #diffMat 行相加  构成一个新的list
    distances = array(sqDistances**0.5)

    ## step 2: sort the distance
    # argsort 标注出一个序列y,这个序列式是  排序后的数,在未排序数组x中出现的位置
    sortedDistIndicies = distances.argsort()
    classCount={}  # define a dictionary (can be append element)

     ## step 3: choose the min k distance
    for i in arange(k):
        voteIlabel = labels[sortedDistIndicies[i]]

        ## step 4: count the times labels occur
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1

    ## step 5: the max voted class will return
    maxCount = 0
    for key, value in classCount.items():
        if value > maxCount:
            maxCount = value
            maxIndex = key
    return maxIndex

def display(inX,outputLabel):
     print("Your input is:", inX, " and classified to class: ", outputLabel )

def testKnnSimple():
    group, labels = createDataSet()
    k=3
    input = array([[0.5,0.4],[0.1,0.2]])
    unknowLabels =[]
    outputLabels =[]
    for i in arange(input.__len__()):
        unknowLabels.append(‘?‘)
        outputLabel = kNNClassify(input[i], group, labels, k)
        display(input[i],outputLabel)
        outputLabels.append(outputLabel)
    plt.figure("Data plot")
    plt.subplot(211)
    plt.xlim(-0.2,1.4);plt.ylim(-0.2,1.4)
    x,y = dataSetPlot(group,labels)
    plt.plot(x,y,‘ro‘)
    x,y = dataSetPlot(input, unknowLabels)
    plt.plot(x,y,‘go‘)

    plt.subplot(212)
    plt.xlim(-0.2,1.4);plt.ylim(-0.2,1.4)
    x,y = dataSetPlot(group,labels)
    plt.plot(x,y,‘ro‘)
    x,y = dataSetPlot(input, outputLabels)
    plt.plot(x,y,‘go‘)
    plt.show()

testKnnSimple()

运行结果:

时间: 2024-10-17 14:38:10

KNN的相关文章

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

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

【读书笔记】机器学习实战-kNN(1)

k临近算法(kNN)采用测量不同特征值之间的距离方法进行分类,也是一种非常直观的方法.本文主要记录了使用kNN算法改进约会网站的例子. 任务一:分类算法classify0 就是使用距离公式计算特征值之间的距离,选择最邻近的k个点,通过统计这k个点的结果来得出样本的预测值. tile函数用法在这里 argsort函数在这里 def classify0(inX,dataset,labels,k): #shape 返回行列数,shape[0]是行数,有多少元组 datasetsize = datase

机器学习实战knn

最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,labels,3) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'kNN' is not defined 运行的代码如下: from nu

机器学习实战- KNN

KNN:k近邻算法-在训练样本中找到与待测样本距离相近的N个样本,并用这N个样本中所属概率最大的类别作为待测样本的类别. 算法步骤: 1.对训练中的样本数据的不同属性进行归一化处理. 2.计算待测样本到训练样本集中的距离.(欧拉距离或曼哈顿距离): 3.找到N个距离最小的样本属于不同类别的概率. 4.取最大的概率作为待测样本的类别. 例子1: 相亲 相亲考虑的条件: 1) 每年飞行公里 2) 每周打的游戏时长 3)每周消耗的ice cream 态度用1,2,3表示:1表示little like

机器学习实战之kNN

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

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

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

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

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.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算法的手写识别系统

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

《机器学习实战》--KNN

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