首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >KNN图像分类

KNN图像分类

作者头像
AngelNH
发布于 2020-04-16 07:44:07
发布于 2020-04-16 07:44:07
65200
代码可运行
举报
文章被收录于专栏:AngelNIAngelNI
运行总次数:0
代码可运行

真味是淡至如常。

KNN图像分类

链接

摘自大佬的笔记,拿来细细品味,别是一番滋味。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import os
import pickle
import matplotlib.pyplot as plt
import h5py
import scipy
from PIL import Image
from scipy import ndimage

def distance(X_test, X_train):
    """
    输入:
    X_test -- 由numpy数组表示的测试集,大小为(图片长度 * 图片高度 * 3 , 测试样本数)
    X_train -- 由numpy数组表示的训练集,大小为(图片长度 * 图片高度 * 3 , 训练样本数)
    输出:
    distances -- 测试数据与各个训练数据之间的距离,大小为(测试样本数, 训练样本数量)的numpy数组
    """
    num_test = X_test.shape[1]
    num_train = X_train.shape[1]
    distances = np.zeros((num_test, num_train))
    # (X_test - X_train)*(X_test - X_train) = -2X_test*X_train + X_test*X_test + X_train*X_train
    dist1 = np.multiply(np.dot(X_test.T,X_train), -2)    # -2X_test*X_train, shape (num_test, num_train)
    dist2 = np.sum(np.square(X_test.T), axis=1, keepdims=True)    # X_test*X_test, shape (num_test, 1)
    dist3 = np.sum(np.square(X_train), axis=0,keepdims=True)    # X_train*X_train, shape(1, num_train)
    distances = np.sqrt(dist1 + dist2 + dist3)

    return distances
def predict(X_test, X_train, Y_train, k = 1):
    """ 
    输入:
    X_test -- 由numpy数组表示的测试集,大小为(图片长度 * 图片高度 * 3 , 测试样本数)
    X_train -- 由numpy数组表示的训练集,大小为(图片长度 * 图片高度 * 3 , 训练样本数)
    Y_train -- 由numpy数组(向量)表示的训练标签,大小为 (1, 训练样本数)
    k -- 选取与训练集最近邻的数量
    输出:
    Y_prediction -- 包含X_test中所有预测值的numpy数组(向量)
    distances -- 由numpy数组表示的测试数据与各个训练数据之间的距离,大小为(测试样本数, 训练样本数)
    """
    distances = distance(X_test, X_train)
    num_test = X_test.shape[1]
    Y_prediction = np.zeros(num_test)
    for i in range(num_test):
        dists_min_k = np.argsort(distances[i])[:k]     # 按照距离递增次序进行排序,选取距离最小的k个点 
        y_labels_k = Y_train[0,dists_min_k]     # 确定前k个点的所在类别
        Y_prediction[i] = np.argmax(np.bincount(y_labels_k)) # 返回前k个点中出现频率最高的类别作为测试数据的预测分类

    return Y_prediction, distances
def model(X_test, Y_test, X_train, Y_train, k = 1, print_correct = False):
    """
    输入:
    X_test -- 由numpy数组表示的测试集,大小为(图片长度 * 图片高度 * 3 , 测试样本数)
    X_train -- 由numpy数组表示的训练集,大小为(图片长度 * 图片高度 * 3 , 训练样本数)
    Y_train -- 由numpy数组(向量)表示的训练标签,大小为 (1, 训练样本数)
    Y_test -- 由numpy数组(向量)表示的测试标签,大小为 (1, 测试样本数)
    k -- 选取与训练集最近邻的数量
    print_correct -- 设置为true时,打印正确率
    输出:
    d -- 包含模型信息的字典
    """
    Y_prediction, distances = predict(X_test, X_train, Y_train, k)
    num_correct = np.sum(Y_prediction == Y_test)
    accuracy = np.mean(Y_prediction == Y_test)
    if print_correct:
        print('Correct %d/%d: The test accuracy: %f' % (num_correct, X_test.shape[1], accuracy))
    d = {"k": k,
         "Y_prediction": Y_prediction, 
         "distances" : distances,
         "accuracy": accuracy}
    return d
def load_CIFAR_batch(filename):
    with open(filename, 'rb') as f:
        datadict = pickle.load(f,encoding='latin1')
        X = datadict['data']
        Y = datadict['labels']
        X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
        Y = np.array(Y)
    return X, Y
def load_CIFAR10():
    xs = []
    ys = []
    for b in range(1,6):
        f = os.path.join('F:\C-and-Python-Algorithn\python\Tensorflow\data', 'cifar-10-batches-py', 'data_batch_%d' % (b, ))
        X, Y = load_CIFAR_batch(f)
        xs.append(X)
        ys.append(Y)    
    Xtr = np.concatenate(xs)
    Ytr = np.concatenate(ys)
    del X, Y
    Xte, Yte = load_CIFAR_batch(os.path.join('F:\C-and-Python-Algorithn\python\Tensorflow\data', 'cifar-10-batches-py', 'test_batch'))
    return Xtr, Ytr, Xte, Yte


X_train, y_train, X_test, y_test = load_CIFAR10()


classes = ['plane', 'car', 'bird', 'cat', 'dear', 'dog', 'frog', 'horse', 'ship', 'truck']
num_classes = len(classes)
num_each_class = 7
for y, cls in enumerate(classes):
    idxs = np.flatnonzero(y_train == y)
    idxs = np.random.choice(idxs, num_each_class, replace=False)
    for i, idx in enumerate(idxs):
        plt_idx = i * num_classes + (y + 1)
        plt.subplot(num_each_class, num_classes, plt_idx)
        plt.imshow(X_train[idx].astype('uint8'))
        plt.axis('off')
        if i == 0:
            plt.title(cls)
plt.show()

X_train = np.reshape(X_train, (X_train.shape[0], -1)).T
X_test = np.reshape(X_test, (X_test.shape[0], -1)).T
Y_set_train = y_train[:10000].reshape(1,-1)
Y_set_test = y_test[:1000].reshape(1,-1)
X_set_train = X_train[:,:10000]
X_set_test = X_test[:,:1000]


models = {}
for k in [1, 3, 5, 10]:
    print ("k = " + str(k))
    models[str(k)] = model(X_set_test, Y_set_test, X_set_train, Y_set_train, k, print_correct = True)
    print ('\n' + "-------------------------------------------------------" + '\n')


models = {}
k = []
accuracys = []
for i in range(1,11):
    models[str(i)] = model(X_set_test, Y_set_test, X_set_train, Y_set_train, i, print_correct = False)
    k.append(models[str(i)]["k"])
    accuracys.append(models[str(i)]["accuracy"])
plt.plot(k, accuracys)
plt.ylabel('accuracy')
plt.xlabel('k')
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-05|,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
斯坦福CS231n项目实战(一):k最近邻(kNN)分类算法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/79238866
红色石头
2019/05/25
1.2K0
基于SVM的思想做CIFAR-10图像分类
回顾一下之前的SVM,找到一个间隔最大的函数,使得正负样本离该函数是最远的,是否最远不是看哪个点离函数最远,而是找到一个离函数最近的点看他是不是和该分割函数离的最近的。
西红柿炒鸡蛋
2018/09/07
1.7K0
Assignment 2 | 斯坦福CS231n-深度学习与计算机视觉课程
该笔记是以斯坦福cs231n课程的python编程任务为主线,展开对该课程主要内容的理解和部分数学推导。这篇文章是第二篇。 CS231n简介 CS231n的全称是CS231n: Convolution
用户1332428
2018/03/08
1.7K0
Assignment 2 | 斯坦福CS231n-深度学习与计算机视觉课程
cs231n assignment1 knn
实现compute_distances_two_loops def compute_distances_two_loops(self, X): """ Compute the distance between each test point in X and each training point in self.X_train using a nested loop over both the training data and the test data. I
平凡的学生族
2019/05/25
7820
cs231n之KNN、SVM
最近在学习cs231n,觉得有点困难,今天抽了一晚上时间来写这篇文章,作为总结。下面一起来看任务一的题目,由于篇幅长,故分成两部分,下节重点softmax!
公众号guangcity
2019/09/20
4620
cs231n之KNN、SVM
距离产生美?k近邻算法python实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/80607960
红色石头
2019/05/25
5430
斯坦福CS231n项目实战(二):线性支持向量机SVM
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/79267463
红色石头
2019/05/25
9830
Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
Assignment 3 04 Python编程任务(2-layer神经网络) · Assignment1的神经网络部分,我们需要完成neural_net.py,完成后可以用two_layer_net.ipynb里的代码(部分代码需要自己完成)来调试你的模型,优化超参数,获得最优模型,最后在测试集上测试分类水平。 · 这里用的图像库还是CIFAR-10。 neural_net.py 代码如下: __coauthor__ = 'Deeplayer' # 6.14.2016 #import numpy
用户1332428
2018/03/08
1.5K0
Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
斯坦福CS231n项目实战(四):浅层神经网络
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/79310173
红色石头
2019/05/25
7650
ML算法——KNN随笔【全国科技工作者日创作】【机器学习】
它是机器学习中唯一一个不需要训练过程的算法,它在训练阶段只是把数据保存下来,训练时间开销为 0,等收到测试样本后进行处理。
来杯Sherry
2023/05/31
5110
ML算法——KNN随笔【全国科技工作者日创作】【机器学习】
机器学习(二十)贪心学院ML训练营学习1 -KNN算法
K-邻近算法采用测量不同特征值之间的距离方法进行分类,工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,意思是我们知道样本集中的每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签。选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
致Great
2019/07/04
1.2K0
机器学习(二十)贪心学院ML训练营学习1 -KNN算法
机器学习之KNN最邻近分类算法[通俗易懂]
KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。
全栈程序员站长
2022/08/10
1.4K0
机器学习之KNN最邻近分类算法[通俗易懂]
使用Logistic回归实现猫的二分类
这里使用到的是一个猫的数据集,根据这个数据集训练图像是不是猫,数据集的图像如下:
夜雨飘零
2020/05/06
1.2K0
第五篇:《机器学习之逻辑回归(下)》
https://pan.baidu.com/s/1tnMHvLWB_qXyuoPiBgnhaQ
ACM算法日常
2018/08/07
4160
第五篇:《机器学习之逻辑回归(下)》
斯坦福CS231N深度学习与计算机视觉第二弹:图像分类与KNN
本文为斯坦福大学CS231N课程的中文版内容笔记,已获得斯坦福大学课程Andrej Karpathy教授的授权翻译与发表。大数据文摘作品,未经授权禁止转载,转载具体要求见文末。 翻译:寒小阳&龙心尘 编者按:本期文章是我们为读者带来斯坦福课程文章第二个系列的【斯坦福深度学习与计算机视觉课程】专题第二期。文章内容为斯坦福CS231N系列,供有兴趣的读者感受、学习。 本课程的视频翻译也在同时进行,将在近期发布,敬请期待! 大数据文摘将陆续发布译文和视频,免费分享给各位读者。 我们欢迎更多感兴趣的志愿者加入我们
大数据文摘
2018/05/22
6080
Python基础算法解析:K最近邻算法
K最近邻(K-Nearest Neighbors,简称KNN)是一种简单而有效的监督学习算法,常用于分类和回归问题。本文将介绍KNN算法的原理、实现步骤以及如何使用Python进行KNN的编程实践。
Echo_Wish
2024/03/17
3290
机器学习之kNN算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
润森
2019/09/09
1.1K0
机器学习之kNN算法
cs231n之KNN算法
1.环境搭建以及前置条件 1.前置环境: 1.mac 2.pycharm 3.python3 4.Anaconda 2.环境搭建: 1.官网下载并安装Anaconda 2.官网下载并安装pycharm 3.在pycharm中使用Anaconda 1.preference-->project-->project interpreter 2.将Anaconda的解释器当做一个project interpreter添加 4.下载assignment1作业项目并导入pycharm中,作业下载 。 5.下载数据
何时夕
2018/05/02
1K0
cs231n之KNN算法
基于线性SVM的CIFAR-10图像集分类
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/80661133
红色石头
2019/05/25
1.5K0
cs230 深度学习 Lecture 2 编程作业: Logistic Regression with a Neural Network mindset
---- 1. 将 Logistic 表达为 神经网络 的形式 本文的目的是要用神经网络的思想实现 Logistic Regression,输入一张图片就可以判断该图片是不是猫。 那么什么是神经网络呢
杨熹
2018/07/04
9010
推荐阅读
相关推荐
斯坦福CS231n项目实战(一):k最近邻(kNN)分类算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档