k-近邻算法案例学习(Python实现)

03 k近邻法——课后习题答案 1. 答案: k=1时,模型复杂,预测准确率降低; k=2时,模型简单,预测准确率相比于k=1时高。 2. 答案: 阅读详情

一、介绍

k-近邻算法(K-Nearest Neighbour algorithm),又称KNN算法,是数据挖掘技术中原理最简单的算法。
工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。

二、k-近邻算法的步骤

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

三、Python实现

判断一个电影是爱情片还是动作片。

在这里插入图片描述

欧氏距离

dist(x,y)dist(x,y)dist(x,y) = (x1−y1)2+(x2−y2)2+...+(xn−yn)2\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}(x1​−y1​)2+(x2​−y2​)2+...+(xn​−yn​)2​ = ∑i=1n(xi−yi)2\sqrt{\sum_{i=1}^n(x_i-y_i)^2}∑i=1n​(xi​−yi​)2​

构建数据集
import pandas as pd

rowdata={'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
'打斗镜头':[1,5,12,108,112,115],
'接吻镜头':[101,89,97,5,9,8],
'电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片']}

movie_data= pd.DataFrame(rowdata)
计算已知类别数据集中的点与当前点之间的距离
new_data = [24,67]
dist = list((((movie_data.iloc[:6,1:3]-new_data)**2).sum(1))**0.5)
将距离升序排列,然后选取距离最小的k个点
k=4
dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])}) 
dr = dist_l.sort_values(by = 'dist')[: k]
确定前k个点的类别的出现概率
re = dr.loc[:,'labels'].value_counts()
re.index[0]
选择频率最高的类别作为当前点的预测类别
result = []
result.append(re.index[0])
result

四、约会网站配对效果判定

# 导入数据集
datingTest = pd.read_table('datingTestSet.txt',header=None)
datingTest.head()

# 分析数据
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt

#把不同标签用颜色区分
Colors = []
for i in range(datingTest.shape[0]):
    m = datingTest.iloc[i,-1]  # 标签
    if m=='didntLike':
        Colors.append('black')
    if m=='smallDoses':
        Colors.append('orange')
    if m=='largeDoses':
        Colors.append('red')

#绘制两两特征之间的散点图
plt.rcParams['font.sans-serif']=['Simhei'] #图中字体设置为黑体
pl=plt.figure(figsize=(12,8))  # 建立一个画布

fig1=pl.add_subplot(221)  # 建立两行两列画布,放在第一个里面
plt.scatter(datingTest.iloc[:,1],datingTest.iloc[:,2],marker='.',c=Colors)
plt.xlabel('玩游戏视频所占时间比')
plt.ylabel('每周消费冰淇淋公升数')

fig2=pl.add_subplot(222)
plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,1],marker='.',c=Colors)
plt.xlabel('每年飞行常客里程')
plt.ylabel('玩游戏视频所占时间比')

fig3=pl.add_subplot(223)
plt.scatter(datingTest.iloc[:,0],datingTest.iloc[:,2],marker='.',c=Colors)
plt.xlabel('每年飞行常客里程')
plt.ylabel('每周消费冰淇淋公升数')
plt.show()


# 数据归一化
def minmax(dataSet):
    minDf = dataSet.min()
    maxDf = dataSet.max()
    normSet = (dataSet - minDf )/(maxDf - minDf)
    return normSet

datingT = pd.concat([minmax(datingTest.iloc[:, :3]), datingTest.iloc[:,3]], axis=1)
datingT.head()

# 切分训练集和测试集
def randSplit(dataSet,rate=0.9):
    n = dataSet.shape[0] 
    m = int(n*rate)
    train = dataSet.iloc[:m,:]
    test = dataSet.iloc[m:,:]
    test.index = range(test.shape[0])
    return train,test

train,test = randSplit(datingT)


# 分类器针对约会网站的测试代码
def datingClass(train,test,k):
    n = train.shape[1] - 1  # 将标签列减掉
    m = test.shape[0]  # 行数
    result = []
    for i in range(m):
        dist = list((((train.iloc[:, :n] - test.iloc[i, :n]) ** 2).sum(1))**5)
        dist_l = pd.DataFrame({'dist': dist, 'labels': (train.iloc[:, n])})
        dr = dist_l.sort_values(by = 'dist')[: k]
        re = dr.loc[:, 'labels'].value_counts()
        result.append(re.index[0])
    result = pd.Series(result)  
    test['predict'] = result  # 增加一列
    acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean()
    print(f'模型预测准确率为{acc}')
    return test


datingClass(train,test,5)  # 95%

五、手写数字识别

import os


#得到标记好的训练集
def get_train():
    path = 'digits/trainingDigits'
    trainingFileList = os.listdir(path)
    train = pd.DataFrame()
    img = []  # 第一列原来的图像转换为图片里面0和1,一行
    labels = []  # 第二列原来的标签
    for i in range(len(trainingFileList)):
        filename = trainingFileList[i]
        txt = pd.read_csv(f'digits/trainingDigits/{filename}', header = None) #32行
        num = ''
        # 将32行转变为1行
        for i in range(txt.shape[0]):
            num += txt.iloc[i,:]
        img.append(num[0])
        filelable = filename.split('_')[0]
        labels.append(filelable)
    train['img'] = img
    train['labels'] = labels
    return train
    
train = get_train()   



# 得到标记好的测试集
def get_test():
    path = 'digits/testDigits'
    testFileList = os.listdir(path)
    test = pd.DataFrame()
    img = []  # 第一列原来的图像转换为图片里面0和1,一行
    labels = []  # 第二列原来的标签
    for i in range(len(testFileList)):
        filename = testFileList[i]
        txt = pd.read_csv(f'digits/testDigits/{filename}', header = None) #32行
        num = ''
        # 将32行转变为1行
        for i in range(txt.shape[0]):
            num += txt.iloc[i,:]
        img.append(num[0])
        filelable = filename.split('_')[0]
        labels.append(filelable)
    test['img'] = img
    test['labels'] = labels
    return test

test = get_test()

# 分类器针对手写数字的测试代码
from Levenshtein import hamming

def handwritingClass(train, test, k):
    n = train.shape[0]
    m = test.shape[0]
    result = []
    for i in range(m):
        dist = []
        for j in range(n):
            d = str(hamming(train.iloc[j,0], test.iloc[i,0]))
            dist.append(d)
        dist_l = pd.DataFrame({'dist':dist, 'labels':(train.iloc[:,1])})
        dr = dist_l.sort_values(by='dist')[:k]
        re = dr.loc[:,'labels'].value_counts()
        result.append(re.index[0])
    result = pd.Series(result)
    test['predict'] = result
    acc = (test.iloc[:,-1] == test.iloc[:,-2]).mean()
    print(f'模型预测准确率为{acc}')
    return test

handwritingClass(train, test, 3)  # 97.8%

六、算法优缺点

优点

(1)简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
(2)可用于数值型数据和离散型数据;
(3)无数据输入假定;
(4)适合对稀有事件进行分类。

缺点

(1)计算复杂性高;空间复杂性高;
(2)计算量大,所以一般数值很大的适合不用这个,但是单个样本又不能太少,否则容易发生误分;
(3)样本不平衡问题(即有些类别的样本数量很多,而其他样本的数量很少);
(4)可理解性比较差,无法给出数据的内在含义

机器学习-交叉验证和网格搜索(带案例) 八、交叉验证和网格搜索 1.什么是交叉验证? 就是将拿到的训练数据,分成训练集和验证集,比如将一份数据分成4份,其中一份作为验证集。然后经过过4次测试,每次都更换不同的验证集。即得到4次模型的结果,取平均值作为最终结果。又称4折交叉验证。 2.为什么要做交叉验证? 交叉验证的目的:为了让被评估的模型更加准确可信。 问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢? 3.什么是网... 阅读详情

相关推荐

k近邻法课后习题解答

3.2 求得的最近邻点是(2,3) 3.3 k近邻算法如下: (思路:求得一个最近邻后,从kd树中删除这个结点) #include #include #include #include using namespace std; /*function of this program: build a 2d tree using the input training data th

Collin的专栏 2935

[统计学习方法]-李航-k近邻法(含第三章习题解答)

k近邻距离度量定义LP距离欧式距离曼哈顿距离切比雪夫距离k值 k近邻算法是非常自然的一种分类方法,即选取k个与输入数据距离最近的数据集中的点,这k个点的多数属于哪个类,就把输入数据归类为哪个类。而这其中只要数据集,距离度量,k值,决策方法有关,下面我们就从这几个方面进行分析 距离度量 定义 这一小节我们把所有的统计学习方法中实例进行声明:对于输入的特征向量x∈Rn,x\in R^n,x∈Rn,代表特征空间是n维的,其中对于一个给定的实例xi=(xi(1),xi(2),xi(3)...,xi(l)...,

qq_33459955的博客 2905

机器学习之k-近邻(kNN)算法与Python实现

k-近邻算法(kNN,k-NearestNeighbor),是最简单的机器学习分类算法之一,其核心思想在于用距离目标最近的k个样本数据的分类来代表目标的分类(这k个样本数据和目标数据最为相似)。一 k-近邻kNN算法概述 概念 特点 kNN算法流程 二 Python算法实现 KNN算法分类器 kNN算法用于约会网站配对 KNN算法用于手写识别系统一 k-近邻(kNN)算法概述1.概念kNN算法的

moxigandashu的博客 2万+

K-近邻算法(KNN)

K-近邻算法(KNN)一、k近邻算法的基本概念原理和应用二、k近邻算法中k的选取以及特征归一化的重要性1.选取k值以及它的影响2.距离的度量3.特征归一化的必要性总结 一、k近邻算法的基本概念原理和应用 首先,K近邻算法是一种基本分类和回归方法。本篇文章只讨论分类问题的k近邻法。 K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)根据这个说法,咱们来看下引自维基

LkmLym的博客 1818

【Python】机器学习-K近邻算法

在讨论任何算法之前,我们必须先理解算法处理的对象——数据——在计算机中的物理存在形式。对于KNN而言,每一个数据样本,无论是一张图片、一封邮件还是一位用户的画像,最终都会被表示成一个向量(Vector)。例如,一张28x28像素的灰度手写数字图片,可以被“压平”(Flatten)成一个包含 (28 \times 28 = 784) 个像素值的一维向量。那么,这个784维的向量,在C语言的世界里是如何“安身立命”的呢?最直接、最常见的方式,就是使用一个数组(Array)。 这行代码在内存中所做的事情,远比表面

宅男很神经 1068

《Python机器学习基础教程》学习笔记(3) k近邻算法(knn)

概述 k近邻算法(knn),是一个理论上比较成熟的方法,也是最简单的机器学习算法之一,常用于分类,也用于回归。 原理及实现:挖个坑   应用 分类 数据集:mglearn的forge 调用方法:sklearn.neighbors.KNeighborsClassifier库的KNeighborsClassifier方法 import mglearn from sklearn.m...

坤斤拷的博客 1222

机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

机器学习实战笔记(Python实现)-02-k近邻算法(kNN) -- 下面来看一下书上对这个算法的原理介绍:存在一个训练样本集,并且每个样本都存在标签(有监督学习)。输入没有标签的新样本数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出与样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,而且k通常不大于20。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

 啸林  1万+

Python AI教程之二十四:监督学习之KNN算法(3)使用 Python 从 Scratch 实现 K 近邻算法

K 近邻分类是基于实例学习的分类技术之一。基于实例学习的模型可以超越训练示例进行推广。为此,它们首先存储训练示例。当遇到新实例(或测试示例)时,它们会立即在存储的训练示例和这个新实例之间建立关系,为这个新实例分配目标函数值。基于实例的方法有时被称为懒惰学习方法,因为它们会推迟学习,直到遇到新实例进行预测。

潜洋的专栏 1217

机器学习(一)K近邻算法(KNN)原理剖析及python实现

k-近邻算法采用测量不同特征值之间的距离方法进行分类

Trisyp的博客 995

机器学习实战(一) k-近邻算法(KNN)python3

机器学习实战(一) k-近邻算法概述原理KNN算法一般流程使用python导入函数创建KNN.py from numpy import * import operator def createDataSet():插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新...

weixin_42291486的博客 1301

【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)

1.背景     今后博主会每周定时更新机器学习算法及其python的简单实现。今天学习的算法是KNN近邻算法。KNN算法是一个监督学习分类器类别的算法。           什么是监督学习,什么又是无监督学习呢。监督学习就是我们知道目标向量的情况下所使用的算法,无监督学习就是当我们不知道具体的目标变量的情况下所使用的。而监督学习又根据目标变量的类别(离散或连续)分为分类器算法和回归算法。

wenyusuran的专栏 8678

机器学习实战2.1. 超详细的k-近邻算法KNN(附Python代码)

超详细的k-近邻算法KNN(附Python代码) 搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多机器学习干货 csdn:https://blog.youkuaiyun.com/baidu_31657889/ github:https://github.com/xiaoming3526/ai-ming3526 本文参考地址:[apachecn/AiLearning] KNN ...

小明的博客 3132

Python机器学习零基础理解K近邻算法

大家好,我是Mr数据杨。话说在《三国演义》中,有一位叫做郭嘉的谋士,他的天才决策背后隐藏着类似K近邻的智慧。一旦面临战况,郭嘉会审视与敌方相比最近的几个战场,通过比较相似的战况,得出他认为最优的决策,这就是K近邻的灵魂——基于邻近性来预测未知。

Mr数据杨 3万+

k-近邻算法(KNN)(机器学习理论+python实战)

k-近邻算法(机器学习理论+python实战) 前言 对于其他分类算法:决策树归纳、贝叶斯分类、基于规则的分类、BP-神经网络分类、支持向量机、基于关联规则挖掘的分类,这些都是给定训练集,然后训练得到模型,再去预测新元组(测试集)。 而k-近邻分类不同,它先将训练元组存储,直到给定一个预测元组,它才基于类比学习,即通过给定预测元组与存储的训练元组的相似性,对该元组进行分类。(因此该算法也称为惰性...

万勇's Blog 1636

python机器学习实现K-近邻算法(KNN)

机器学习 K-近邻算法(KNN) 以下命令都是在浏览器中输入。 cmd命令窗口输入:jupyter notebook 后打开浏览器输入网址http://localhost:8888/ 导引 如何进行电影分类 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的...

LDC,公众号【轻松学编程】 2438

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

【python机器学习100天—2022年】Day5-K近邻算法(KNN)

大家好,我是ly甲烷😜,后端开发也有做算法的心呀💗 ,我们来学习python机器学习 github有37.1k star的机器学习100天原项目地址https://github.com/Avik-Jain/100-Days-Of-ML-Code 之前的机器学习100天有很多库或者函数已经不用了,还有刚入门机器学习可能很多函数或者设置搞不明白, 所以,从python基础无缝到机器学习的教程来了。博主亲自操作一遍过的记录,绝对细致。如果学不会可以评论区讨论,如果我懂,我会回复的。 今天是机器学习第五天——.

ly甲烷的博客 425

PYTHON机器学习——KNN(k近邻算法)

PYTHON机器学习——KNN(k近邻算法) 代码实现 首先,导入需要用到的包 import numpy as np import matplotlib.pyplot as plt 初始化模拟数据集和对应的分类 data_x=[[1.15,2.34], [1.55,2.47], [3.78,4.98], [3.34,4.56], [...

sun_indifferent的博客 432

用LTspice仿真CMOS反相器功耗?这份避坑指南能省你3天调试时间

本文详细介绍了如何使用LTspice准确仿真CMOS反相器的功耗,包括动态功耗、短路功耗和静态功耗的测量技巧。通过工程实践指南,帮助电子工程师避开常见陷阱,优化仿真参数设置,提升仿真结果的可靠性,节省调试时间。

w7x8y9z的博客 188

Unity嵌套ScrollView滑动冲突解决方案:ExecuteEvents.Execute事件透传

在Unity UGUI中,竖向与横向ScrollView嵌套时出现滑动失效,本质是EventSystem事件分发机制的拦截限制。其原理在于PointerDown被外层捕获后,后续PointerMove默认不向下透传;ExecuteEvents.Execute提供了一条绕过常规冒泡流程的官方事件旁路,支持低延迟、方向自适应的精准透传。该技术具备高兼容性与零侵入特性,广泛应用于电商商品页、内容流卡片组、多级导航等需‘列表中嵌套轮播/标签’的真实场景,是解决UGUI嵌套滚动问题的核心工程实践方案。

weixin_33164198的博客 631

*Python*机器学习算法——k-近邻算法(K-Nearest Neighbors,KNN)

K-近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,广泛应用于分类和回归任务。其基本原理是通过计算待预测样本与训练集中所有样本的距离,选取距离最近的 k 个邻居,并根据这些邻居的信息进行预测。对于分类任务,预测类别为 k 个最近邻中出现次数最多的类别;对于回归任务,预测值为 k 个最近邻的目标值的平均值。常用的距离度量方法包括欧氏距离、曼哈顿距离和闵可夫斯基距离,其中欧氏距离最为常用。

m0_57916248的博客 1761

Cyclone MAX独立编程实战:从硬件接口到SAP镜像的嵌入式烧录指南

在嵌入式系统开发与量产中,固件烧录是连接软件与硬件的关键环节。其核心原理是通过特定的调试接口(如JTAG、BDM)和编程算法,将编译后的机器码写入目标处理器的非易失性存储器。这项技术的价值在于确保软件在硬件上的可靠部署,是产品功能实现和质量保证的基础,广泛应用于汽车电子、工业控制等对一致性与可靠性要求极高的领域。独立编程器(Stand-Alone Programmer)在此基础上,通过集成存储、交互界面和任务逻辑,实现了脱离PC的自动化操作,极大提升了产线效率和现场维护的便捷性。本文以Cyclone MAX

weixin_34038293的博客 466
上一篇: hands-on-ml-with-sklearn-and-tf(第二版)第14章课后题
下一篇: 决策树案例学习(Python实现)
XB_please
博客等级 码龄8年 80粉丝 121原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值