Deep.Learning.for.Computer.Vision.with.Python-chapter7


前言

本文主要记录Deep.Learning.for.Computer.Vision.with.Python 书上的内容,就当是读书笔记,文中不正确之处,还请指正---------KNN算法原理和实现代码(基于Python)。


一、KNN是什么?

k近邻法(k-nearest neighbor,k-NN)是一种基本的分类和回归方法,是监督学习方法里的一种常用方法。k近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例类别,通过多数表决等方式进行预测。

k近邻算法用一句通俗的古语来说就是:“物以类聚,人以群分”。你要看一个实例的类别,你就可以看它附近是什么类别。如下图所示,当要判断绿色实例的类别的时候,我们可以看看它的附近有哪些类,然后采取多数表决的决策规则(红色2个多于蓝色1个),于是把绿色实例也分类为红色那一类。
在这里插入图片描述
影响k近邻法三个主要因素:距离度量、k 值的选择和分类决策规则
距离度量: 表示预测对象到已知类别的距离,如上图圆圈到三角形或正方形的距离。常见的距离度量主要有曼哈顿距离和欧氏距离。
k 值: 以上图来讲,中间黑色实线圆表示K=3(2个三角+1个正方形),黑色虚线圆表示K=5。k值小时,k 近邻模型更复杂,容易发生过拟合;k 值大时,k kk近邻模型更简单,又容易欠拟合。
分类决策规则: knn使用的分类决策规则是多数表决,如果损失函数为0-1损失函数,那么要使误分类率最小即使经验风险最小,多数表决规则实际上就等同于经验风险最小化。

二、使用步骤

1.代码如下

"""
1.获取数据集:3000张图片,裁剪成32*32 每张照片由32*32*3个整数构成(RGB3通道)
2.分割数据集:训练集和测试集
3.训练
4.评估
"""
from sklearn.neighbors import KNeighborsClassifier #KNN算法
from sklearn.preprocessing import LabelEncoder #将以字符串表示的标签转换为整数,如cat表示为1等
from sklearn.model_selection import train_test_split #用来分割训练和测试数据集
from sklearn.metrics import classification_report #评估分类器的性能,并将良好的结果打印
from pyimagesearch.preprocessing import SimplePreprocessor #数据预处理器
from pyimagesearch.datasets import SimpleDatasetLoader #预加载器
from imutils import paths  #图片的操作、路径等
import argparse#解析器
"""1.获取数据集"""
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True, help="path to input dataset")
ap.add_argument("-k", "--neighbors", type=int, default=3, help="# of nearest neighbors for classification")
ap.add_argument("-j", "--jobs", type=int, default=1, help="# of jobs for k-NN distance (-1 uses all available cores)")
args = vars(ap.parse_args())

print("[INFO] loading image...")
imagePaths = list(paths.list_images(args["dataset"]))

sp = SimplePreprocessor.SimplePreprocessor(32,32)
sdl = SimpleDatasetLoader.SimpleDatasetLoader(preprocessors=[sp])
(data, labels) = sdl.load(imagePaths, verbose=500) #verbose=500监控加载了多少图像
data = data.reshape((data.shape[0], 3072)) #将Wxhx3拉成一个向量32X32X3=3072 30003072向量
print("[INFO] features matrix: {:.1f}MB".format(data.nbytes / (1024 * 1000.0)))

"""2.分割数据集:训练集和测试集"""
#将标签编码为整数
le = LabelEncoder()
labels = le.fit_transform(labels)

#划分数据集 75%训练 25%测试  test_size=0.25测试占的比例  固定random_state后,每次的拆分结果也是相同,方便重现实验结果
#X:数据集 Y标签
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.25, random_state=42)

"""3.训练
4.评估"""
print("[INFO] evaluating k-NN classifier...")
model = KNeighborsClassifier(n_neighbors=args["neighbors"], n_jobs=args["jobs"])
model.fit(trainX, trainY)
print(classification_report(testY, model.predict(testX), target_names=le.classes_))

"""
       precision    recall  f1-score   support

        cats       0.42      0.61      0.50       262
        dogs       0.39      0.47      0.42       249
       panda       0.91      0.27      0.41       239

    accuracy                           0.45       750
   macro avg       0.57      0.45      0.44       750
weighted avg       0.57      0.45      0.45       750

左边一列:标签名
support:每个标签出现的次数
precision:正确预测为正的,占全部预测为正的比例,TP / (TP+FP)
recall:正确预测为正的,占全部实际为正的比例,TP / (TP+FN)
F1-score:精确率和召回率的调和平均数,2 * precision*recall / (precision+recall)
accuracy:计算正确率 (TP+TN) / (TP+FP+FN+TN)
"""

2.存在问题

模块:pyimagesearch,pycharm中无该第三方包,在网上将该包下载后放于自己电脑上下载第三方包的位置:如:我的第三方包在
在这里插入图片描述
pyimagesearch模块下载链接: https://pan.baidu.com/s/1IO3pO1wGXMGD4Zom8N3Hiw
提取码:9ldd

3.数据集下载

链接:https://pan.baidu.com/s/1ySArI_F8RODoFo47h2koow
提取码:qp6l

注:运行改代码时,在终端运行 后缀要加如图所示代码:
在这里插入图片描述

4.参考资料

https://blog.csdn.net/codedz/article/details/108862498?
https://blog.csdn.net/akadiao/article/details/78788864

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值