Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >统计学习方法之K近邻法1.k近邻法(k-nearest neighbor,k-NN)2.k近邻模型3.k近邻算法的实现

统计学习方法之K近邻法1.k近邻法(k-nearest neighbor,k-NN)2.k近邻模型3.k近邻算法的实现

作者头像
JasonhavenDai
发布于 2018-04-11 06:58:52
发布于 2018-04-11 06:58:52
1.4K00
代码可运行
举报
文章被收录于专栏:JasonhavenDaiJasonhavenDai
运行总次数:0
代码可运行

1.k近邻法(k-nearest neighbor,k-NN)

  • k近邻算法是一个基本分类和回归方法,k-NN的输入时实例的特征向量,对应于特征空间的点,输出是实力的类别,可以取多类。k-NN不具有显式的学习过程,k-NN实际上利用训练数据集对特征向量空间进行划分,并且作为其分类的“模型”。
  • k-NN简单直观:给定一个训练集,对新的输入实力,在训练数据集中找到与该实例最近邻的k个实例,这k个实例的多数所属于的类别就作为新实例的类。
  • 输入:训练数据集T=(x1,y1),(x2,y2),...(xN,yN) 输出:实例x所属的类y 算法步骤: (1)根据给定的距离度量,在训练集T中找出与x最近邻的k个点,涵盖这k个点的x的邻域记作Nk(x) (2)在Nk(x)中根据分类决策规则,如多数表决决定x的类别y。
  • 当k==1的时候,称为最近邻算法,对于输入的实例点,x,最近邻法将训练数据集中与x最近的点的所属类别作为x的类。

2.k近邻模型

  • k-NN使用的模型实际上对应于听特征空间的划分,模型由三个基本要素:距离度量,k值的选择,分类决策规则。k近邻模型的核心就是使用一种距离度量,获得距离目标点最近的k个点,根据分类决策规则,决定目标点的分类。

2.1距离度量

  • 特征空间中,两个实例点的距离是两个实例点的相似程度的反映。k-NN模型的特征空间一般是n维实数向量空间,使用的距离是欧氏距离,但也可以是其他距离,比如更一般的Lp距离(Lp distance)或者Minkowski距离。
  • 一个点和一个点之间的距离,无论是什么计算方式,基本上离不开Lp距离。欧式距离,则是L2范式,也就是p=2的情况,而另一个很熟悉的距离曼哈顿距离,则是L1范式。Lp距离的定义如下:
  • 当然,如果p→∞的时候,就叫做切比雪夫距离了。 除了这个闵可夫斯基距离集合外,还有另外的距离评估体系,例如马氏距离、巴氏距离、汉明距离,这些都是和概率论中的统计学度量标准相关。而像夹角余弦、杰卡德相似系数、皮尔逊系数等都是和相似度有关的。
  • 因此,简单说来,各种“距离”的应用场景简单概括为,空间:欧氏距离,路径:曼哈顿距离,国际象棋国王:切比雪夫距离,以上三种的统一形式:闵可夫斯基距离,加权:标准化欧氏距离,排除量纲和依存:马氏距离,向量差距:夹角余弦,编码差别:汉明距离,集合近似度:杰卡德类似系数与距离,相关:相关系数与相关距离。
  • 这其实只是个度量标准而已,应当根据数据特征选择相应的度量标准。
  • 由不同的距离度量所确定的邻近点是不同的。

2.2 k值的选择

近似误差、估计误差知乎解释

  • 选取比较小的k值(较复杂的模型),近似误差(approximation error)会减小,而估计误差(estimation error)会增大,如果选择的k值较小,就相当于用较小的的邻域中的训练实例进行预测。此时预测的结果会对近邻的实例点非常敏感,因为影响分类的都是比较近的样本,但一旦出现噪点,预测就会出错。 选取比较大的k值(较简单的模型),相反,减小噪点的影响,但是较远或不相似的样本也会对结果有影响,就相当于在较大的邻域中训练实例进行预测。此时,与输入实例较远的训练实例也会对预测起作用,使预测发生错误。极限情况下k=N,考虑所有样本,极简模型 。
  • 在应用中,k值一般选取一个比较小的数值,通常采用交叉验证法来选取最优的k值。

2.3分类决策规则

  • 大多情况是多数表决,即由输入实例的k个近邻中的多数类决定x的类别。也可以采用别的分类决策规则。 01损失函数CSDN

3.k近邻算法的实现

  • 实现k-NN算法,主要考虑的问题是如何对训练集进行快速k近邻搜索。
  • 简单实现方式:线性搜索,对于数据量很大时,此方法是不可行的。所以考虑更好的方法
  • 采用特殊结构来存储训练集,以减小计算距离的次数,比如kd树方法。

3.1简单实现

  • 文件数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hei,wei,tag
1.5,40,thin
1.5,50,fat
1.5,60,fat
1.6,40,thin
1.6,50,thin
1.6,60,fat
1.6,70,fat
1.7,50,thin
1.7,60,thin
1.7,70,fat
1.7,80,fat
1.8,60,thin
1.8,70,thin
1.8,80,fat
1.8,90,fat
1.9,80,thin
1.9,90,fat
  • knn.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
"""
Created on Fri Dec  8 17:21:14 2017

@author: jasonhaven
"""

import os
import numpy as np
import pandas as pd
import operator
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

def read_from_csv(file):
    '''
    file:文件绝对地址
    功能:读入csv文件并解析出数据集和标签集
    '''
    pwd=os.getcwd()
    os.chdir(os.path.dirname(file))
    df=pd.read_csv('data.csv')
    os.chdir(pwd)
    datas=df.iloc[:,:2].astype(np.float).values
    labels = df.iloc[0:,-1:].astype(np.str).values#加载类别标签部分
    return datas,labels


def classify(instance,datas,labels,k):
    '''
    instance:新的实例特征向量
    datas:训练数据集
    labels:标签集
    k:选择相邻的k个实例
    '''
    num=datas.shape[0]
    #tile(A, reps)返回一个shape=reps的矩阵,矩阵的每个元素是A
    diffMat = np.tile(instance, (num, 1)) - datas
    #diffMat就是输入样本与每个训练样本的差值
    square_diffMat = diffMat**2
    #然后对其每个x和y的差值进行平方运算。
    square_distances=square_diffMat.sum(axis=1)
    #开平方根求出距离
    distances=square_distances**0.5
    #argsort函数返回的是关键字(数组值)从小到大的索引值
    sorted_distances = distances.argsort()
    
    class_count = {}
    # 投票过程,就是统计前k个最近的样本所属类别包含的样本个数
    for i in range(k):
        # sortedDistIndicies[i]是第i个最相近的样本下标
        voteIlabel = str(labels[sorted_distances[i]])
        # 然后将票数增1
        class_count[voteIlabel] = class_count.get(voteIlabel, 0) + 1
    # 把分类结果进行排序,然后返回得票数最多的分类结果
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    return sorted_class_count[0][0]
    

def draw(datas,labels):
    plt.figure('KNN')
    plt.title('KNN')
    plt.xlabel('height')
    plt.ylabel('weight')
    
    green_patch=mpatches.Patch(color='green', label='thin')
    red_patch=mpatches.Patch(color='red', label='fat')
    handles=[red_patch,green_patch]
    plt.legend(handles=handles)
    for i,x in enumerate(datas):
        if labels[i]=='thin':
            plt.scatter(x[0],x[1],s=100,marker='.',c='g')
        else:
            plt.scatter(x[0],x[1],s=100,marker='x',c='r')
    plt.show()


if __name__=='__main__':
    #获取数据集
    file='./data.csv'#data.csv : 身高,体重,标签
    datas,labels=read_from_csv(file)
    labels=list(labels)
    #新实例
    instance=[1.7,60]
    k=2
    #分类
    label=classify(instance,datas,labels,k)
    draw(datas,labels)
    print("knn classify : %s's label is %s"%(str(instance),label))

3.2运行结果

  • 后续进行优化处理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.12.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
K最近邻(k-Nearest Neighbor,KNN)分类算法
K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法。 它没有训练的过程,它的学习阶段仅仅是把样本保存起来,等收到测试集之后再进行处理,属于“懒惰学习”。反之,在训练阶段就对样本进行学习的算法属于“急切学习”。 它本质上是衡量样本之间的相似度。
vincentbbli
2021/08/18
9840
K 近邻法(K-Nearest Neighbor, K-NN)
树相当于不断地用垂直于坐标轴的超平面将 k 维空间切分,构成一系列的k维超矩形区域。
Michael阿明
2020/07/13
1.5K0
机器学习 学习笔记(14)k近邻学习
k近邻是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个邻居的信息来进行预测。通常在分类任务中可以使用投票法,即选择这k个样本中出现最多的类别标记作为预测结果,在回归任务中可以使用平均法,即将这个k个样本的实值输出标记的平均值作为预测结构,还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。
2018/09/04
3560
机器学习 学习笔记(14)k近邻学习
《统计学习方法》笔记三 k近邻法
k近邻是一种基本分类与回归方法,书中只讨论分类情况。输入为实例的特征向量,输出为实例的类别。k值的选择、距离度量及分类决策规则是k近邻法的三个基本要素。
闪电gogogo
2018/12/04
5450
《统计学习方法》笔记三 k近邻法
李航《统计学习方法》笔记之k近邻法
1.同一标签的样本通常有很多相似的特征,所以同一类别的可能有扎堆现象,也就是物以类聚。
timerring
2022/09/19
2500
李航《统计学习方法》笔记之k近邻法
机器学习算法-k近邻
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。简单地说,k-近邻算法就是采用不同特征值之间的距离来进行分类,算法主要特点为:
皮大大
2021/02/08
7770
机器学习算法-k近邻
k-近邻算法概述,k-means与k-NN的区别对比
k近邻(k-nearest neighbor, k-NN)算法由 Cover 和 Hart 于1968年提出,是一种简单的分类方法。通俗来说,就是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分类到这个类中(类似于投票时少数服从多数的思想)。接下来读者来看下引自维基百科上的一幅图:
zhangjiqun
2024/12/14
1920
k-近邻算法概述,k-means与k-NN的区别对比
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
本文介绍了k-近邻算法(kNN)的原理、优缺点,并通过实例讲解了k-近邻算法的具体实现和应用场景。
Jack_Cui
2018/01/08
3.2K0
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
《统计学习方法》极简笔记P3:k-NN数学推导
; 输出:实例x所属的类y (1)根据给定距离度量,训练集T中找与x最近邻的k个点,涵盖k个点的x的邻域记
统计学家
2019/08/21
4520
《统计学习方法》极简笔记P3:k-NN数学推导
机器学习算法——k-近邻(KNN)案例讲解
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
用户9999906
2022/09/26
6890
入门demo1 k临近算法
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。
百里丶落云
2023/11/13
3060
机器学习(三)——k-近邻算法基础
机器学习(三) ——k-近邻算法基础 (原创内容,转载请注明来源,谢谢) 一、概述 k近邻算法(kNN),是监督学习的一种,主要用于分类,通过测量不同特征值之间的举例进行分类。 优点:精度高、对异常值不敏感、无数据输入假定。 缺点:计算复杂度高、空间复杂度高。 使用数据范围:数值型和标称型。 二、工作原理 1、原理 存在一个训练样本集,其中每个数据都存在标签,即可以知道数据的每个特征和其对于的分类结果。 现输入没有标签的数据,将新数据的每个特征值和样本集的数据对应特征进行比较,计算出距离最近的前k个数据(k
企鹅号小编
2018/01/19
6140
统计学习方法:K近邻
K近邻(k-nearest neighbors)算法是一个简单、直观的算法。它没有显式的学习过程,但是物理意义与思路都非常容易理解。
统计学家
2019/04/10
3700
机器学习算法:K-NN(K近邻)
本文将介绍机器学习中的 K-最近邻算法,K-Nearest Neighbors 是一种机器学习技术和算法,可用于回归和分类任务。
数据科学工厂
2023/01/19
3.4K0
统计学习方法-KNN算法
其中,xi为实例特征向量,yi为实例的类别;i=1,2,3,…N。 输出:实例x所属的类别y
皮大大
2021/03/02
6180
KNN最近邻算法及其Python实现
k-NN是一种基本的分类和回归方法,用于分类时,算法思路较简单:通过计算不同特征之间的距离方法来得到最近的k个训练实例,根据k个实例的类别采用多数表决等方式进行预测。而做回归分析时,则通过对k个实例取
智能算法
2018/04/02
2.3K0
KNN最近邻算法及其Python实现
k-近邻算法
从今天开始,与大家分享我学习《Machine Learning In Action》这本书的笔记与心得。我会将源码加以详细的注释,这是我自己学习的一个过程,也是想通过这种方式帮助需要学习的童鞋的一种方式。
卡尔曼和玻尔兹曼谁曼
2019/01/22
7480
K近邻算法 K近邻算法原理
- $k$近邻法 (k-Nearest Neighbor;kNN) 是一种比较成熟也是最简单的机器学习算法,可以用于基本的分类与回归方法
小小程序员
2023/12/10
1570
零基础掌ML(2) — k-NN算法
k-NN 是一种监督学习算法,全称 K-Nearest Neighbor,中文称之为 K近邻算法。
WEBJ2EE
2023/10/30
3220
零基础掌ML(2) — k-NN算法
K近邻算法的Python实现
作者:黄耀鹏人工智能爱好者,一名数据科学研究者及科普写作者 知乎专栏:https://zhuanlan.zhihu.com/data-science-meditation 作为『十大机器学习算法』之一的K-近邻(K-Nearest Neighbors)算法是思想简单、易于理解的一种分类和回归算法。今天,我们来一起学习KNN算法的基本原理,并用Python实现该算法,最后,通过一个案例阐述其应用价值。 KNN算法的直观理解 (添加一个直观的图) 它基于这样的简单假设:彼此靠近的点更有可能属于同一个类别。用大俗
企鹅号小编
2018/03/02
9300
K近邻算法的Python实现
相关推荐
K最近邻(k-Nearest Neighbor,KNN)分类算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验